}
-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;
/* 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.@)
*/
@ stub LdrProcessRelocationBlock
@ stub LdrQueryImageFileExecutionOptions
@ stub LdrQueryProcessModuleInformation
-@ stub LdrShutdownProcess
-@ stub LdrShutdownThread
+@ stdcall LdrShutdownProcess() LdrShutdownProcess
+@ stdcall LdrShutdownThread() LdrShutdownThread
@ stub LdrUnloadDll
@ stub LdrVerifyImageMatchesChecksum
@ stub NPXEMULATORTABLE
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 );
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 );
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) */
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
* 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;
/*************************************************************************
* 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;
*/
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;
}
*/
void WINAPI ExitProcess( DWORD status )
{
- MODULE_DllProcessDetach( TRUE, (LPVOID)1 );
+ LdrShutdownProcess();
SERVER_START_REQ( terminate_process )
{
/* send the exit code to the server */
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 );
}