| |
|
|
|
Beschreibung:
MapViewOfFile bildet ein (mit CreateFileMapping erzeugtes oder OpenFileMapping geöffnetes) Dateiabbildungsprojekt im Speicherbereich des aufrufenden Prozesses ab und liefert eine Anfangsadresse zurück.
Deklaration:
Def @MapViewOfFile(5) !kernel32,MapViewOfFile
Parameter:
1.Parameter: Handle des mit CreateFileMapping erzeugten Dateiabbildungsprojektes als LongInt. 2.Parameter: Ein Flag Zugriffsmodus auf den Speicherbereich. => -$2 = Schreib- und Lesezugriff. -$4 = Nur Lesezugriff. -$000F001F = Schreib- und Lesezugriff (wie $2) -$1 = Unter NT-basierten Windowsversionen finden Änderungen der Datei nur im Speicherbereich des aktuellen Prozesses statt – auf die Platte und in Abbildungen anderer Prozesse wird nichts geschrieben. Unter nicht NT-basierten Systemen wird zwar auch der Mappingbereich anderer Prozesse geändert, die Datei auf der Platte ändert sich aber nicht. 3.Parameter: Die oberen 32 Bits der Startadresse des mit CreateFileMapping erzeugten Speicherbereichs, ab dem das Mapping beginnen soll. 4.Parameter: Die unteren 32 Bits der Startadresse des mit CreateFileMapping erzeugten Speicherbereichs, ab dem das Mapping beginnen soll. 5.Parameter: Anzahl der zu übertragenden Bytes als LongInt.
Rückgabewert:
0 bei Misserfolg, ansonsten die Startadresse des Speicherbereichs.
Beispiele:
Beispiel 1
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
DEF @CreateFileMapping(6) !"kernel32","CreateFileMappingA"
Def @CloseHandle(1) !"kernel32","CloseHandle"
DEF @GetLastError() !"kernel32","GetLastError"
Def @MapViewOfFile(5) !"kernel32","MapViewOfFile"
DEf @UnmapViewOfFile(1) !"kernel32","UnmapViewOfFile"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
WINDOWSTYLE 31+512
Windowtitle "Hier wird die Variable erzeugt"
WINDOW 0,0-300,400
Declare Variable&,Tick&,Name$,Ausgelesen#
Declare Speicherhandle&,Speicheraddr&
Let Name$="AH-Variable"
LET Speicherhandle&=@CreateFileMapping($FFFFFFFF,0,4,0,4,@addr(Name$))
LET Speicheraddr&=@MapViewOfFile(Speicherhandle&,2,0,0,0)
Drawtext 0,50,"Handle des Speicherbereichs:"+@STR$(Speicherhandle&)
LET TICK&=&GETTICKCOUNT
Whilenot %MENUITEM=-2
IF &GETTICKCOUNT-Tick&>10000
Let Variable&=@RND(1000)
@CopyMemory(Speicheraddr&,@addr(Variable&),4)
LET TICK&=&GETTICKCOUNT
endif
DIM Ausgelesen#,256
@CopyMemory(Ausgelesen#,Speicheraddr&,4)
Drawtext 0,80,"Variale="+@STR$(@LONG(Ausgelesen#,0))+" "
Dispose Ausgelesen#
Sleep 10
WEND
@UnmapViewOfFile(Speicheraddr&)
@CloseHandle(Speicherhandle&)
Beep 1
DEF @OpenFileMapping(3) !"kernel32","OpenFileMappingA"
DEF @GetLastError() !"kernel32","GetLastError"
Def @MapViewOfFile(5) !"kernel32","MapViewOfFile"
DEf @UnmapViewOfFile(1) !"kernel32","UnmapViewOfFile"
DEF @CopyMemory(3) !"kernel32","RtlMoveMemory"
Def @CloseHandle(1) !"kernel32","CloseHandle"
Windowtitle "Hier wird die Variable ausgelesen"
WINDOWSTYLE 31+512
WINDOW 300,0-300,400
Declare Speicherhandle&,Ausgelesen#,Name$
Declare Speicheraddr&
Declare Variable&
Let Variable&=0
Let Name$="AH-Variable"
While @AND(Speicherhandle&=0,%MENUITEM<>-2)
sleep 100
LET Speicherhandle&=@OpenFileMapping(2,0,@ADDR(Name$))
Wend
LET Speicherhandle&=@OpenFileMapping(2,0,@ADDR(Name$))
LET Speicheraddr&=@MapViewOfFile(Speicherhandle&,2,0,0,0)
Drawtext 0,50,"Handle des Speicherbereichs:"+@STR$(Speicherhandle&)
DIM Ausgelesen#,256
WHILEnot %MENUITEM=-2
Drawtext 0,0,"F1 drücken zum Auslesen"
Drawtext 0,21,"F2 drücken zum Zurücksetzen..."
Waitinput
IF %SCANKEY=112
@CopyMemory(Ausgelesen#,Speicheraddr&,4)
Drawtext 0,80,"Variale="+@STR$(@LONG(Ausgelesen#,0))+" "
Beep 1
ElseIF %SCANKEY=113
Beep 1
@CopyMemory(Speicheraddr&,@addr(Variable&),4)
@CopyMemory(Ausgelesen#,Speicheraddr&,4)
Drawtext 0,80,"Variale="+@STR$(@LONG(Ausgelesen#,0))+" "
Endif
WEND
Dispose Ausgelesen#
@UnmapViewOfFile(Speicheraddr&)
@CloseHandle(Speicherhandle&)
Beep 1
|
|
|
| |
|
|