Forráskód Böngészése

Added leave / reenter A2 protocol for FIle writing and reading.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6864 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 éve
szülő
commit
3dc9a98295
1 módosított fájl, 33 hozzáadás és 6 törlés
  1. 33 6
      source/Generic.Win32.Kernel32.Mod

+ 33 - 6
source/Generic.Win32.Kernel32.Mod

@@ -658,11 +658,25 @@ VAR
 	(** Retrieves the cycle time for the specified thread (both user and kernel mode, Windows Vista and newer) *)
 	QueryThreadCycleTime- : PROCEDURE {WINAPI} (hThread : HANDLE; VAR cycleTime : HUGEINT) : BOOL;
 	(** The ReadFile function reads data from a file, starting at the position indicated by the file pointer. *)
-	ReadFile-: PROCEDURE {WINAPI} ( hFile: HANDLE;
-															  VAR lpBuffer: ARRAY   OF SYSTEM.BYTE;
+	readFile-: PROCEDURE {WINAPI} ( hFile: HANDLE;
+															  VAR lpBuffer: ARRAY OF SYSTEM.BYTE;
 															  nNumberOfBytesToRead: LONGINT;
 															  VAR lpNumberOfBytesRead: LONGINT;
 															  lpOverlapped: ANY ): BOOL;
+
+	PROCEDURE ReadFile- ( hFile: HANDLE;
+															  VAR lpBuffer: ARRAY OF SYSTEM.BYTE;
+															  nNumberOfBytesToRead: LONGINT;
+															  VAR lpNumberOfBytesRead: LONGINT;
+															  lpOverlapped: ANY ): BOOL;
+	VAR b: BOOL;
+	BEGIN
+		LeaveA2;
+		b := readFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
+		ReenterA2;
+		RETURN b;
+	END ReadFile;
+	VAR
 	(** The ReadProcessMemory function reads data from an area of memory in a specified process. *)
 	ReadProcessMemory-: PROCEDURE {WINAPI} ( hProcess: HANDLE;
 																				   lpBaseAddress: ADDRESS;
@@ -762,14 +776,27 @@ VAR
 	WaitForSingleObject-: PROCEDURE {WINAPI} ( hHandle: HANDLE;
 																				   dwMilliseconds: LONGINT ): LONGINT;
 	(** The WriteFile function writes data to a file and is designed for both synchronous and asynchronous operation. *)
-	WriteFile-: PROCEDURE {WINAPI} ( hFile: HANDLE;
+	writeFile-: PROCEDURE {WINAPI} ( hFile: HANDLE;
 															   CONST lpBuffer: ARRAY   OF SYSTEM.BYTE;
 															   nNumberOfBytesToWrite: LONGINT;
 															   VAR lpNumberOfBytesWritten: LONGINT;
 															   lpOverlapped: ANY ): BOOL;
 	(** Thread abort notifier, parameter is the threads id. Note this should only be used in modules which
 			can't use the exception handling mechanism provided by module Exceptions. *)
-
+	PROCEDURE WriteFile- ( hFile: HANDLE;
+															   CONST lpBuffer: ARRAY   OF SYSTEM.BYTE;
+															   nNumberOfBytesToWrite: LONGINT;
+															   VAR lpNumberOfBytesWritten: LONGINT;
+															   lpOverlapped: ANY ): BOOL;
+	VAR b: BOOL;
+	BEGIN
+		LeaveA2;
+		b := writeFile(hFile,lpBuffer,nNumberOfBytesToWrite, lpNumberOfBytesWritten,lpOverlapped);
+		ReenterA2;
+		RETURN b;
+	END WriteFile;
+	VAR
+	
 	(** Method used to write text to the Console. *)
 	OutputString*: PROCEDURE ( CONST a: ARRAY OF CHAR );
 	
@@ -931,7 +958,7 @@ VAR
 		GetProcAddress(mod, "QueryPerformanceCounter",SYSTEM.VAL(ADDRESS,QueryPerformanceCounter));
 		GetProcAddress(mod, "QueryPerformanceFrequency",SYSTEM.VAL(ADDRESS,QueryPerformanceFrequency));
 		GetProcAddress(mod, "QueryThreadCycleTime", SYSTEM.VAL(ADDRESS, QueryThreadCycleTime));
-		GetProcAddress(mod, "ReadFile",SYSTEM.VAL(ADDRESS,ReadFile));
+		GetProcAddress(mod, "ReadFile",SYSTEM.VAL(ADDRESS,readFile));
 		GetProcAddress(mod, "ReadProcessMemory",SYSTEM.VAL(ADDRESS,ReadProcessMemory));
 		GetProcAddress(mod, "RemoveDirectoryA",SYSTEM.VAL(ADDRESS,RemoveDirectory));
 		GetProcAddress(mod, "ResetEvent",SYSTEM.VAL(ADDRESS,ResetEvent));
@@ -969,7 +996,7 @@ VAR
 		GetProcAddress(mod, "VirtualAlloc",SYSTEM.VAL(ADDRESS,VirtualAlloc));
 		GetProcAddress(mod, "VirtualFree",SYSTEM.VAL(ADDRESS,VirtualFree));
 		GetProcAddress(mod, "WaitForSingleObject",SYSTEM.VAL(ADDRESS,WaitForSingleObject));
-		GetProcAddress(mod, "WriteFile",SYSTEM.VAL(ADDRESS,WriteFile));
+		GetProcAddress(mod, "WriteFile",SYSTEM.VAL(ADDRESS,writeFile));
 		GetProcAddress(mod, "GlobalMemoryStatusEx",SYSTEM.VAL(ADDRESS,GlobalMemoryStatusEx));
 		isEXE := hInstance = NULL;
 		IF isEXE THEN hInstance := GetModuleHandle( NIL ) END;