Преглед на файлове

use Kernel32.EntryPoint instead of 401000H for checking address validity;
handle DLL_THREAD_ATTACH, DLL_THREAD_DETACH and DLL_PROCESS_DETACH events by calling the corresponding handlers to be implemented in Objects.Mod

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8375 8c9fc860-2736-0410-a75d-ab315db34111

eth.morozova преди 6 години
родител
ревизия
e68c82b064
променени са 2 файла, в които са добавени 56 реда и са изтрити 16 реда
  1. 55 15
      source/Windows.Kernel32.Mod
  2. 1 1
      source/Windows.Machine.Mod

+ 55 - 15
source/Windows.Kernel32.Mod

@@ -831,7 +831,7 @@ VAR
 																			 dwExitCode: LONGINT ): BOOL;
 	TlsAlloc-: PROCEDURE {WINAPI} ( ): LONGINT;
 	TlsFree-: PROCEDURE {WINAPI} ( dwTlsIndex: LONGINT ): BOOL;
-	TlsGetValue-: PROCEDURE {WINAPI} ( dwTlsIndex: LONGINT ): LONGINT;
+	TlsGetValue-: PROCEDURE {WINAPI} ( dwTlsIndex: LONGINT ): ADDRESS;
 	TlsSetValue-: PROCEDURE {WINAPI} ( dwTlsIndex: LONGINT; lpTlsValue: ADDRESS ): BOOL;
 	(** The TryEnterCriticalSection function attempts to enter a critical section without blocking. *)
 	TryEnterCriticalSection-: PROCEDURE {WINAPI} ( VAR lpCriticalSection: CriticalSection ): BOOL;
@@ -1119,15 +1119,27 @@ VAR hout: HANDLE;
 #IF I386 THEN
 	
 	#IF SHAREDLIB THEN
-	
-		PROCEDURE CallSdw();
-		PROCEDURE SDW EXTERN "Modules.Shutdown"(code: LONGINT);
+
+		PROCEDURE ObjectsAttachThread(stackBottom: ADDRESS);
+		PROCEDURE AttachThread EXTERN "Objects.AttachThread"(stackBottom: ADDRESS);
+		BEGIN
+			AttachThread(stackBottom);
+		END ObjectsAttachThread;
+		
+		PROCEDURE ObjectsDetachThread();
+		PROCEDURE DetachThread EXTERN "Objects.DetachThread"();
 		BEGIN
-			SDW(-1);
-		END CallSdw;
+			DetachThread;
+		END ObjectsDetachThread;
+		
+		PROCEDURE ObjectsDetachProcess();
+		PROCEDURE DetachProcess EXTERN "Objects.DetachProcess"();
+		BEGIN
+			DetachProcess;
+		END ObjectsDetachProcess;
 		
 		(**
-			DLL entry point that corresponds to 
+			DLL entry point that corresponds to
 			
 			BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
 		*)
@@ -1171,10 +1183,13 @@ VAR hout: HANDLE;
 				CMP EAX, 1
 				JZ ProcessAttach ; call all modules bodies only when fdwReason = DLL_PROCESS_ATTACH (1)
 				CMP EAX, 0
-				JZ ProcessDetach ; call all modules bodies only when fdwReason = DLL_PROCESS_DETACH (0)
+				JZ ProcessDetach ; DLL_PROCESS_DETACH (0)
+				CMP EAX, 2 ; DLL_THREAD_ATTACH (2)
+				JZ ThreadAttach
+				CMP EAX, 3 ; DLL_THREAD_DETACH (3)
+				JZ ThreadDetach
 				
-				POP EBP
-				RET 12
+				JMP ret
 
 			ProcessAttach:
 				PUSH EBX
@@ -1187,19 +1202,44 @@ VAR hout: HANDLE;
 				MOV EAX,[EDX+adrGetProcAddress]
 				MOV getProcAddress, EAX
 				JMP exit
-				
+
 			ProcessDetach:
 				PUSH EBX
 				PUSH ESI
 				PUSH EDI
-				CALL CallSdw
+				CALL ObjectsDetachProcess
 				POP EDI
 				POP ESI
 				POP EBX
 		
+				JMP ret
+				
+			ThreadAttach:
+				PUSH EBX
+				PUSH ESI
+				PUSH EDI
+				PUSH EBP ; push the thread stack bottom
+				CALL ObjectsAttachThread
+				ADD ESP, 4 ; pop stack bottom
+				POP EDI
+				POP ESI
+				POP EBX
+				
+				JMP ret
+				
+			ThreadDetach:
+				PUSH EBX
+				PUSH ESI
+				PUSH EDI
+				CALL ObjectsDetachThread
+				POP EDI
+				POP ESI
+				POP EBX
+				
+			ret:
 				POP EBP
 				RET 12
-				
+
 			exit:
 		END EntryPoint;
 
@@ -1209,7 +1249,7 @@ VAR hout: HANDLE;
 			are patched by the PE linker. 
 			[CF. Microsoft Portable Executable and Common Object File Format Specification]
 		*)
-		PROCEDURE {NOPAF, FIXED(401000H)} EntryPoint;
+		PROCEDURE {NOPAF, FIXED(401000H)} EntryPoint*;
 		CODE{SYSTEM.i386}
 			JMP  DWORD end;
 			DB 0
@@ -1257,7 +1297,7 @@ VAR hout: HANDLE;
 			are patched by the PE linker. 
 			[CF. Microsoft Portable Executable and Common Object File Format Specification]
 		*)
-		PROCEDURE {NOPAF, FIXED(401000H)} EntryPoint;
+		PROCEDURE {NOPAF, FIXED(401000H)} EntryPoint*;
 		CODE{SYSTEM.AMD64}
 			JMP  DWORD end;
 			DB 0

+ 1 - 1
source/Windows.Machine.Mod

@@ -870,7 +870,7 @@ END GetStaticHeap;
 PROCEDURE ValidHeapAddress*(p: ADDRESS): BOOLEAN;
 BEGIN
 	RETURN (p >= memBlockHead.beginBlockAdr) & (p <= memBlockTail.endBlockAdr)
-		OR (p>=401000H) & (p<=ADDRESSOF(LastAddress))
+		OR (p>=ADDRESS OF Kernel32.EntryPoint) & (p<=ADDRESSOF(LastAddress))
 END ValidHeapAddress;