ntdll/kernel32: #10
Eric Pouech
pouech-eric at wanadoo.fr
Thu Mar 20 14:11:37 CST 2003
- implemented LdrQueryProcessModuleInformation
- rewrote VERSION_GetLinkedDllVersion() with this new function instead
of accessing directly the modref list
A+
--
Eric Pouech
-------------- next part --------------
Common subdirectories: dlls/ntdll9/CVS and dlls/ntdll/CVS
diff -u -x '*~' -x '.#*' dlls/ntdll9/loader.c dlls/ntdll/loader.c
--- dlls/ntdll9/loader.c 2003-03-20 20:28:09.000000000 +0100
+++ dlls/ntdll/loader.c 2003-03-20 20:40:44.000000000 +0100
@@ -759,6 +759,55 @@
}
/******************************************************************
+ * LdrQueryProcessModuleInformation
+ *
+ */
+NTSTATUS WINAPI LdrQueryProcessModuleInformation(PSYSTEM_MODULE_INFORMATION smi,
+ ULONG buf_size, ULONG* req_size)
+{
+ SYSTEM_MODULE* sm = &smi->Modules[0];
+ ULONG size = sizeof(ULONG);
+ NTSTATUS nts = STATUS_SUCCESS;
+ ANSI_STRING str;
+ char* ptr;
+ WINE_MODREF* wm;
+
+ smi->ModulesCount = 0;
+
+ RtlEnterCriticalSection( &loader_section );
+ for ( wm = MODULE_modref_list; wm; wm = wm->next )
+ {
+ size += sizeof(*sm);
+ if (size <= buf_size)
+ {
+ sm->Reserved1 = 0; /* FIXME */
+ sm->Reserved2 = 0; /* FIXME */
+ sm->ImageBaseAddress = wm->ldr.BaseAddress;
+ sm->ImageSize = wm->ldr.SizeOfImage;
+ sm->Flags = wm->ldr.Flags;
+ sm->Id = 0; /* FIXME */
+ sm->Rank = 0; /* FIXME */
+ sm->Unknown = 0; /* FIXME */
+ str.Length = 0;
+ str.MaximumLength = MAXIMUM_FILENAME_LENGTH;
+ str.Buffer = sm->Name;
+ RtlUnicodeStringToAnsiString(&str, &wm->ldr.FullDllName, FALSE);
+ ptr = strrchr(sm->Name, '\\');
+ sm->NameOffset = (ptr != NULL) ? (ptr - (char*)sm->Name + 1) : 0;
+
+ smi->ModulesCount++;
+ sm++;
+ }
+ else nts = STATUS_INFO_LENGTH_MISMATCH;
+ }
+ RtlLeaveCriticalSection( &loader_section );
+
+ if (req_size) *req_size = size;
+
+ return nts;
+}
+
+/******************************************************************
* LdrShutdownProcess (NTDLL.@)
*
*/
diff -u -x '*~' -x '.#*' dlls/ntdll9/ntdll.spec dlls/ntdll/ntdll.spec
--- dlls/ntdll9/ntdll.spec 2003-03-20 19:33:47.000000000 +0100
+++ dlls/ntdll/ntdll.spec 2003-03-20 20:42:28.000000000 +0100
@@ -46,7 +46,7 @@
@ stdcall LdrLockLoaderLock(long ptr ptr)
@ stub LdrProcessRelocationBlock
@ stub LdrQueryImageFileExecutionOptions
-@ stub LdrQueryProcessModuleInformation
+@ stdcall LdrQueryProcessModuleInformation(ptr long ptr)
@ stdcall LdrShutdownProcess()
@ stdcall LdrShutdownThread()
@ stdcall LdrUnloadDll(ptr)
Common subdirectories: dlls/ntdll9/tests and dlls/ntdll/tests
Common subdirectories: include9/bitmaps and include/bitmaps
Common subdirectories: include9/CVS and include/CVS
Common subdirectories: include9/msvcrt and include/msvcrt
Common subdirectories: include9/wine and include/wine
diff -u -x '*~' -x '.#*' include9/winternl.h include/winternl.h
--- include9/winternl.h 2003-03-20 20:28:09.000000000 +0100
+++ include/winternl.h 2003-03-20 20:44:00.000000000 +0100
@@ -1227,6 +1227,7 @@
NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, PANSI_STRING, ULONG, void**);
NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, PUNICODE_STRING, HMODULE*);
NTSTATUS WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG*);
+NTSTATUS WINAPI LdrQueryProcessModuleInformation(SYSTEM_MODULE_INFORMATION*, ULONG, ULONG*);
NTSTATUS WINAPI LdrShutdownProcess(void);
NTSTATUS WINAPI LdrShutdownThread(void);
NTSTATUS WINAPI LdrUnloadDll(HMODULE);
Common subdirectories: loader9/CVS and loader/CVS
Common subdirectories: loader9/ne and loader/ne
Common subdirectories: misc9/CVS and misc/CVS
diff -u -x '*~' -x '.#*' misc9/version.c misc/version.c
--- misc9/version.c 2003-03-20 20:28:09.000000000 +0100
+++ misc/version.c 2003-03-20 20:40:44.000000000 +0100
@@ -37,6 +37,7 @@
#include "module.h"
#include "wine/unicode.h"
#include "wine/debug.h"
+#include "ntdll_misc.h"
WINE_DEFAULT_DEBUG_CHANNEL(ver);
@@ -444,51 +445,64 @@
*/
static DWORD VERSION_GetLinkedDllVersion(void)
{
- WINE_MODREF *wm;
DWORD WinVersion = NB_WINDOWS_VERSIONS;
PIMAGE_OPTIONAL_HEADER ophd;
IMAGE_NT_HEADERS *nt;
+ ULONG count, required;
+ SYSTEM_MODULE_INFORMATION* smi;
/* First check the native dlls provided. These have to be
from one windows version */
- for ( wm = MODULE_modref_list; wm; wm=wm->next )
- {
- nt = RtlImageNtHeader(wm->ldr.BaseAddress);
- ophd = &nt->OptionalHeader;
-
- TRACE("%s: %02x.%02x/%02x.%02x/%02x.%02x/%02x.%02x\n",
- wm->modname,
- ophd->MajorLinkerVersion, ophd->MinorLinkerVersion,
- ophd->MajorOperatingSystemVersion, ophd->MinorOperatingSystemVersion,
- ophd->MajorImageVersion, ophd->MinorImageVersion,
- ophd->MajorSubsystemVersion, ophd->MinorSubsystemVersion);
-
- /* test if it is an external (native) dll */
- if (!(wm->ldr.Flags & LDR_WINE_INTERNAL))
- {
- int i;
- for (i = 0; special_dlls[i]; i++)
- {
- /* test if it is a special dll */
- if (!strcasecmp(wm->modname, special_dlls[i]))
- {
- DWORD DllVersion = VERSION_GetSystemDLLVersion(wm->ldr.BaseAddress);
- if (WinVersion == NB_WINDOWS_VERSIONS)
- WinVersion = DllVersion;
- else {
- if (WinVersion != DllVersion) {
- ERR("You mixed system DLLs from different windows versions! Expect a crash! (%s: expected version '%s', but is '%s')\n",
- wm->modname,
- VersionData[WinVersion].getVersionEx.szCSDVersion,
- VersionData[DllVersion].getVersionEx.szCSDVersion);
- return WIN20; /* this may let the exe exiting */
- }
- }
- break;
- }
- }
- }
- }
+ smi = (SYSTEM_MODULE_INFORMATION*)&count;
+ LdrQueryProcessModuleInformation(smi, sizeof(count), &required);
+ smi = RtlAllocateHeap(ntdll_get_process_heap(), 0, required);
+ if (smi)
+ {
+ if (LdrQueryProcessModuleInformation(smi, required, NULL) == STATUS_SUCCESS)
+ {
+ int k;
+ for (k = 0; k < smi->ModulesCount; k++)
+ {
+ nt = RtlImageNtHeader(smi->Modules[k].ImageBaseAddress);
+ ophd = &nt->OptionalHeader;
+
+ TRACE("%s: %02x.%02x/%02x.%02x/%02x.%02x/%02x.%02x\n",
+ &smi->Modules[k].Name[smi->Modules[k].NameOffset],
+ ophd->MajorLinkerVersion, ophd->MinorLinkerVersion,
+ ophd->MajorOperatingSystemVersion, ophd->MinorOperatingSystemVersion,
+ ophd->MajorImageVersion, ophd->MinorImageVersion,
+ ophd->MajorSubsystemVersion, ophd->MinorSubsystemVersion);
+ }
+
+ /* test if it is an external (native) dll */
+ if (!(smi->Modules[k].Flags & LDR_WINE_INTERNAL))
+ {
+ int i;
+ for (i = 0; special_dlls[i]; i++)
+ {
+ /* test if it is a special dll */
+ if (!strcasecmp(&smi->Modules[k].Name[smi->Modules[k].NameOffset], special_dlls[i]))
+ {
+ DWORD DllVersion = VERSION_GetSystemDLLVersion(smi->Modules[k].ImageBaseAddress);
+ if (WinVersion == NB_WINDOWS_VERSIONS)
+ WinVersion = DllVersion;
+ else
+ {
+ if (WinVersion != DllVersion) {
+ ERR("You mixed system DLLs from different windows versions! Expect a crash! (%s: expected version '%s', but is '%s')\n",
+ &smi->Modules[k].Name[smi->Modules[k].NameOffset],
+ VersionData[WinVersion].getVersionEx.szCSDVersion,
+ VersionData[DllVersion].getVersionEx.szCSDVersion);
+ return WIN20; /* this may let the exe exiting */
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ RtlFreeHeap(ntdll_get_process_heap(), 0, smi);
+ }
if(WinVersion != NB_WINDOWS_VERSIONS) return WinVersion;
Common subdirectories: relay329/CVS and relay32/CVS
Common subdirectories: scheduler9/CVS and scheduler/CVS
More information about the wine-patches
mailing list