- added Ldr* information to include/winternl.h
authorEric Pouech <eric.pouech@wanadoo.fr>
Tue, 4 Mar 2003 04:36:56 +0000 (04:36 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 4 Mar 2003 04:36:56 +0000 (04:36 +0000)
- exported a few functions/global vars from module.h while we move
  code from loader/module.c to dlls/ntdll/loader.c
- implemented LdrShutdownProcess, LdrShutdownThread and
  LdrDisableThreadCalloutsForDll (and made use of them)

dlls/ntdll/loader.c
dlls/ntdll/ntdll.spec
include/module.h
include/winternl.h
loader/module.c
scheduler/process.c
scheduler/thread.c

index 26cfcce59c0c952c1965660bd00142cbfbb5a31a..c1bcfc35580be445770ea23aea1afeddc4d38fb1 100644 (file)
@@ -36,17 +36,31 @@ static WINE_EXCEPTION_FILTER(page_fault)
 }
 
 
-NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HANDLE hModule)
+/******************************************************************
+ *             LdrDisableThreadCalloutsForDll (NTDLL.@)
+ *
+ */
+NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE hModule)
 {
-    if (DisableThreadLibraryCalls(hModule))
-       return STATUS_SUCCESS;
+    WINE_MODREF *wm;
+    NTSTATUS    ret = STATUS_SUCCESS;
+
+    RtlEnterCriticalSection( &loader_section );
+
+    wm = MODULE32_LookupHMODULE( hModule );
+    if ( !wm )
+        ret = STATUS_DLL_NOT_FOUND;
     else
-       return STATUS_DLL_NOT_FOUND;
+        wm->flags |= WINE_MODREF_NO_DLL_CALLS;
+
+    RtlLeaveCriticalSection( &loader_section );
+
+    return ret;
 }
 
 /* FIXME : MODULE_FindModule should depend on LdrGetDllHandle, not vice-versa */
 
-NTSTATUS WINAPI LdrGetDllHandle(ULONG x, LONG y, PUNICODE_STRING name, PVOID *base)
+NTSTATUS WINAPI LdrGetDllHandle(ULONG x, ULONG y, PUNICODE_STRING name, HMODULE *base)
 {
     STRING str;
     WINE_MODREF *wm;
@@ -66,19 +80,59 @@ NTSTATUS WINAPI LdrGetDllHandle(ULONG x, LONG y, PUNICODE_STRING name, PVOID *ba
 
 /* FIXME : MODULE_GetProcAddress should depend on LdrGetProcedureAddress, not vice-versa */
 
-NTSTATUS WINAPI LdrGetProcedureAddress(PVOID base, PANSI_STRING name, ULONG ord, PVOID *address)
+NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE base, PANSI_STRING name, ULONG ord, PVOID *address)
 {
-    WARN("%p %s %ld %p\n",base, debugstr_an(name->Buffer,name->Length), ord, address);
+    WARN("%p %s %ld %p\n", base, debugstr_an(name->Buffer,name->Length), ord, address);
 
     if(name)
-        *address = MODULE_GetProcAddress( (HMODULE) base, name->Buffer, -1, FALSE);
+        *address = MODULE_GetProcAddress( base, name->Buffer, -1, FALSE);
     else
-        *address = MODULE_GetProcAddress( (HMODULE) base, (LPSTR) ord, -1, FALSE);
+        *address = MODULE_GetProcAddress( base, (LPSTR) ord, -1, FALSE);
 
     return (*address) ? STATUS_SUCCESS : STATUS_DLL_NOT_FOUND;
 }
 
 
+/******************************************************************
+ *             LdrShutdownProcess (NTDLL.@)
+ *
+ */
+NTSTATUS    WINAPI  LdrShutdownProcess(void)
+{
+    TRACE("()\n");
+    MODULE_DllProcessDetach( TRUE, (LPVOID)1 );
+    return STATUS_SUCCESS; /* FIXME */
+}
+
+/******************************************************************
+ *             LdrShutdownThread (NTDLL.@)
+ *
+ */
+NTSTATUS WINAPI LdrShutdownThread(void)
+{
+    WINE_MODREF *wm;
+    TRACE("()\n");
+
+    /* don't do any detach calls if process is exiting */
+    if (process_detaching) return STATUS_SUCCESS;
+    /* FIXME: there is still a race here */
+
+    RtlEnterCriticalSection( &loader_section );
+
+    for ( wm = MODULE_modref_list; wm; wm = wm->next )
+    {
+        if ( !(wm->flags & WINE_MODREF_PROCESS_ATTACHED) )
+            continue;
+        if ( wm->flags & WINE_MODREF_NO_DLL_CALLS )
+            continue;
+
+        MODULE_InitDLL( wm, DLL_THREAD_DETACH, NULL );
+    }
+
+    RtlLeaveCriticalSection( &loader_section );
+    return STATUS_SUCCESS; /* FIXME */
+}
+
 /***********************************************************************
  *           RtlImageNtHeader   (NTDLL.@)
  */
index 9a4e2afd0c5ef01eace4f2dce85b08a382e979ba..e11dab90eafa32d916cc2f894c52f7d3321f2c0e 100644 (file)
@@ -46,8 +46,8 @@
 @ stub LdrProcessRelocationBlock
 @ stub LdrQueryImageFileExecutionOptions
 @ stub LdrQueryProcessModuleInformation
-@ stub LdrShutdownProcess
-@ stub LdrShutdownThread
+@ stdcall LdrShutdownProcess() LdrShutdownProcess
+@ stdcall LdrShutdownThread() LdrShutdownThread
 @ stub LdrUnloadDll
 @ stub LdrVerifyImageMatchesChecksum
 @ stub NPXEMULATORTABLE
index 3ba8b1a553839acd0343a7f02b67ff964682bd90..4db3cc56182287e661a4e154718ddcfae1656cbd 100644 (file)
@@ -199,7 +199,6 @@ extern FARPROC MODULE_GetProcAddress( HMODULE hModule, LPCSTR function, int hint
 extern BOOL MODULE_DllProcessAttach( WINE_MODREF *wm, LPVOID lpReserved );
 extern void MODULE_DllProcessDetach( BOOL bForceDetach, LPVOID lpReserved );
 extern void MODULE_DllThreadAttach( LPVOID lpReserved );
-extern void MODULE_DllThreadDetach( LPVOID lpReserved );
 extern WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HANDLE hfile, DWORD flags );
 extern BOOL MODULE_FreeLibrary( WINE_MODREF *wm );
 extern WINE_MODREF *MODULE_FindModule( LPCSTR path );
@@ -208,6 +207,13 @@ extern enum binary_type MODULE_GetBinaryType( HANDLE hfile );
 extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name );
 extern SEGPTR WINAPI HasGPHandler16( SEGPTR address );
 extern void MODULE_WalkModref( DWORD id );
+/* the following parts of module.c are temporary exported during move of code
+ * from loader/module.c to dlls/ntdll/loader.c
+ */
+extern CRITICAL_SECTION loader_section;
+extern int process_detaching;
+extern BOOL MODULE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved );
+extern WINE_MODREF* MODULE32_LookupHMODULE( HMODULE );
 
 /* loader/ne/module.c */
 extern NE_MODULE *NE_GetPtr( HMODULE16 hModule );
index 6070cebe956ba419fdc8517ceff0522b1d97ea16..e6a5e57ede0a013f01fd0801358a15dbeb99ec39 100644 (file)
@@ -1130,6 +1130,73 @@ inline static BOOLEAN RtlCheckBit(PCRTL_BITMAP lpBits, ULONG ulBit)
         memset(_p->BitMapBuffer,0xff,((_p->SizeOfBitMap + 31) & 0xffffffe0) >> 3); \
     } while (0)
 
+/*************************************************************************
+ * Loader functions and structures.
+ *
+ * Those are not part of standard Winternl.h
+ */
+typedef struct _LDR_MODULE
+{
+    LIST_ENTRY          InLoadOrderModuleList;
+    LIST_ENTRY          InMemoryOrderModuleList;
+    LIST_ENTRY          InInitializationOrderModuleList;
+    void*               BaseAddress;
+    ULONG               EntryPoint;
+    ULONG               SizeOfImage;
+    UNICODE_STRING      FullDllName;
+    UNICODE_STRING      BaseDllName;
+    ULONG               Flags;
+    SHORT               LoadCount;
+    SHORT               TlsIndex;
+    HANDLE              SectionHandle;
+    ULONG               CheckSum;
+    ULONG               TimeDateStamp;
+} LDR_MODULE, *PLDR_MODULE;
+
+/* FIXME: to be checked */
+#define MAXIMUM_FILENAME_LENGTH 256
+
+typedef struct _SYSTEM_MODULE
+{
+    ULONG               Reserved1;
+    ULONG               Reserved2;
+    PVOID               ImageBaseAddress;
+    ULONG               ImageSize;
+    ULONG               Flags;
+    WORD                Id;
+    WORD                Rank;
+    WORD                Unknown;
+    WORD                NameOffset;
+    BYTE                Name[MAXIMUM_FILENAME_LENGTH];
+} SYSTEM_MODULE, *PSYSTEM_MODULE;
+
+typedef struct _SYSTEM_MODULE_INFORMATION
+{
+    ULONG               ModulesCount;
+    SYSTEM_MODULE       Modules[1]; /* FIXME: should be Modules[0] */
+} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
+
+typedef struct _LDR_RESOURCE_INFO
+{
+    ULONG               Type;
+    ULONG               Name;
+    ULONG               Language;
+} LDR_RESOURCE_INFO, *PLDR_RESOURCE_INFO;
+
+NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE);
+NTSTATUS WINAPI LdrFindEntryForAddress(void*, PLDR_MODULE*);
+NTSTATUS WINAPI LdrGetDllHandle(ULONG, ULONG, PUNICODE_STRING, HMODULE*);
+NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, PANSI_STRING, ULONG, void**);
+NTSTATUS WINAPI LdrLoadDll(LPCSTR, DWORD, PUNICODE_STRING, HMODULE*);
+NTSTATUS WINAPI LdrShutdownThread(void);
+NTSTATUS WINAPI LdrShutdownProcess(void);
+NTSTATUS WINAPI LdrUnloadDll(HMODULE);
+NTSTATUS WINAPI LdrAccessResource(HMODULE, PIMAGE_RESOURCE_DATA_ENTRY, void**, PULONG);
+NTSTATUS WINAPI LdrFindResourceDirectory_U(HMODULE, PLDR_RESOURCE_INFO, DWORD, 
+                                           PIMAGE_RESOURCE_DIRECTORY_ENTRY*);
+NTSTATUS WINAPI LdrFindResource_U(HMODULE, PLDR_RESOURCE_INFO, ULONG, 
+                                  PIMAGE_RESOURCE_DATA_ENTRY*);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* defined(__cplusplus) */
index 771b098cba34e72fb4330103e7571e8ce1a1b86f..ecab5fef98152f68c683cf194f2691359d8c7b57 100644 (file)
@@ -49,9 +49,9 @@ WINE_MODREF *MODULE_modref_list = NULL;
 
 static WINE_MODREF *exe_modref;
 static int free_lib_count;   /* recursion depth of FreeLibrary calls */
-static int process_detaching;  /* set on process detach to avoid deadlocks with thread detach */
+int process_detaching = 0;  /* set on process detach to avoid deadlocks with thread detach */
 
-static CRITICAL_SECTION loader_section = CRITICAL_SECTION_INIT( "loader_section" );
+CRITICAL_SECTION loader_section = CRITICAL_SECTION_INIT( "loader_section" );
 
 /***********************************************************************
  *           wait_input_idle
@@ -77,7 +77,7 @@ static DWORD wait_input_idle( HANDLE process, DWORD timeout )
  * looks for the referenced HMODULE in the current process
  * NOTE: Assumes that the process critical section is held!
  */
-static WINE_MODREF *MODULE32_LookupHMODULE( HMODULE hmod )
+WINE_MODREF *MODULE32_LookupHMODULE( HMODULE hmod )
 {
     WINE_MODREF        *wm;
 
@@ -141,7 +141,7 @@ WINE_MODREF *MODULE_AllocModRef( HMODULE hModule, LPCSTR filename )
 /*************************************************************************
  *             MODULE_InitDLL
  */
-static BOOL MODULE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved )
+BOOL MODULE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved )
 {
     BOOL retv = TRUE;
 
@@ -362,20 +362,11 @@ void MODULE_DllThreadDetach( LPVOID lpReserved )
  */
 BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
 {
-    WINE_MODREF *wm;
-    BOOL retval = TRUE;
-
-    RtlEnterCriticalSection( &loader_section );
-
-    wm = MODULE32_LookupHMODULE( hModule );
-    if ( !wm )
-        retval = FALSE;
-    else
-        wm->flags |= WINE_MODREF_NO_DLL_CALLS;
-
-    RtlLeaveCriticalSection( &loader_section );
+    NTSTATUS    nts = LdrDisableThreadCalloutsForDll( hModule );
+    if (nts == STATUS_SUCCESS) return TRUE;
 
-    return retval;
+    SetLastError( RtlNtStatusToDosError( nts ) );
+    return FALSE;
 }
 
 
index 831ea6bd28ebf06cba951bd4a5206457a638f853..2d1eb95e523792d56e8b2a0a6e67e83db6bfb547 100644 (file)
@@ -1425,7 +1425,7 @@ BOOL WINAPI CreateProcessW( LPCWSTR app_name, LPWSTR cmd_line, LPSECURITY_ATTRIB
  */
 void WINAPI ExitProcess( DWORD status )
 {
-    MODULE_DllProcessDetach( TRUE, (LPVOID)1 );
+    LdrShutdownProcess();
     SERVER_START_REQ( terminate_process )
     {
         /* send the exit code to the server */
index 5b6160a5d5365328a59335d96542d4cdfa3e83ee..192f8915c861df77d8762e8f3872e13d54eb13a7 100644 (file)
@@ -351,12 +351,12 @@ void WINAPI ExitThread( DWORD code ) /* [in] Exit code for this thread */
 
     if (last)
     {
-        MODULE_DllProcessDetach( TRUE, (LPVOID)1 );
+        LdrShutdownProcess();
         exit( code );
     }
     else
     {
-        MODULE_DllThreadDetach( NULL );
+        LdrShutdownThread();
         if (!(NtCurrentTeb()->tibflags & TEBF_WIN32)) TASK_ExitTask();
         SYSDEPS_ExitThread( code );
     }