Author: dchapyshev
Date: Fri Jul 17 19:15:17 2009
New Revision: 42005
URL:
http://svn.reactos.org/svn/reactos?rev=42005&view=rev
Log:
- Re-implement FreeLibrary (for support LOAD_LIBRARY_AS_DATAFILE)
- HeapAlloc -> RtlAllocateHeap, GetProcessHeap -> RtlGetProcessHeap, HeapFree ->
RtlFreeHeap, CloseHandle -> NtClose
- Remove FIXME in LoadModule
Modified:
trunk/reactos/dll/win32/kernel32/misc/ldr.c
Modified: trunk/reactos/dll/win32/kernel32/misc/ldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/ld…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/ldr.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/ldr.c [iso-8859-1] Fri Jul 17 19:15:17 2009
@@ -20,6 +20,7 @@
} LOADPARMS32;
extern BOOLEAN InWindows;
+extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle;
/* FUNCTIONS ****************************************************************/
@@ -349,8 +350,31 @@
WINAPI
FreeLibrary( HMODULE hLibModule )
{
- LdrUnloadDll(hLibModule);
- return TRUE;
+ PVOID Module = (PVOID)((ULONG_PTR)hLibModule & ~1);
+ NTSTATUS Status;
+
+ if ((ULONG_PTR)hLibModule & 1)
+ {
+ if (!RtlImageNtHeader(Module))
+ {
+ SetLastErrorByStatus(STATUS_INVALID_IMAGE_FORMAT);
+ return FALSE;
+ }
+
+ Status = NtUnmapViewOfSection(NtCurrentProcess(), Module);
+ }
+ else
+ {
+ Status = LdrUnloadDll(hLibModule);
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
@@ -703,7 +727,7 @@
}
Length = (BYTE)LoadParams->lpCmdLine[0];
- if(!(CommandLine = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ if(!(CommandLine = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
strlen(lpModuleName) + Length + 2)))
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
@@ -727,7 +751,7 @@
{
DWORD Error;
- HeapFree(GetProcessHeap(), 0, CommandLine);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine);
/* return the right value */
Error = GetLastError();
switch(Error)
@@ -745,14 +769,16 @@
return 0;
}
- HeapFree(GetProcessHeap(), 0, CommandLine);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, CommandLine);
/* Wait up to 15 seconds for the process to become idle */
- /* FIXME: This is user32! Windows soft-loads this only if required. */
- //WaitForInputIdle(ProcessInformation.hProcess, 15000);
-
- CloseHandle(ProcessInformation.hThread);
- CloseHandle(ProcessInformation.hProcess);
+ if (NULL != lpfnGlobalRegisterWaitForInputIdle)
+ {
+ lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, 15000);
+ }
+
+ NtClose(ProcessInformation.hThread);
+ NtClose(ProcessInformation.hProcess);
return 33;
}