Allocate a tem buffer for the module names in
LdrpQueryModuleInformation, because it isn't possible to call
RtlUnicodeStringToAnsiString if the irql is raised to DPC_LEVEL.
Modified: trunk/reactos/ntoskrnl/ldr/loader.c
_____
Modified: trunk/reactos/ntoskrnl/ldr/loader.c
--- trunk/reactos/ntoskrnl/ldr/loader.c 2005-12-11 16:46:40 UTC (rev
20066)
+++ trunk/reactos/ntoskrnl/ldr/loader.c 2005-12-11 17:02:07 UTC (rev
20067)
@@ -394,6 +394,9 @@
ANSI_STRING AnsiName;
PCHAR p;
KIRQL Irql;
+ PUNICODE_STRING UnicodeName;
+ ULONG tmpBufferSize = 0;
+ PWCHAR tmpNameBuffer;
KeAcquireSpinLock(&ModuleListLock,&Irql);
@@ -402,6 +405,8 @@
while (current_entry != (&ModuleListHead))
{
ModuleCount++;
+ current =
CONTAINING_RECORD(current_entry,LDR_DATA_TABLE_ENTRY,InLoadOrderModuleLi
st);
+ tmpBufferSize += current->FullDllName.Length + sizeof(WCHAR) +
sizeof(UNICODE_STRING);
current_entry = current_entry->Flink;
}
@@ -414,6 +419,15 @@
return(STATUS_INFO_LENGTH_MISMATCH);
}
+ /* allocate a temp buffer to store the module names */
+ UnicodeName = ExAllocatePool(NonPagedPool, tmpBufferSize);
+ if (UnicodeName == NULL)
+ {
+ KeReleaseSpinLock(&ModuleListLock, Irql);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ tmpNameBuffer = (PWCHAR)((ULONG_PTR)UnicodeName + ModuleCount *
sizeof(UNICODE_STRING));
+
/* fill the buffer */
memset(Buffer, '=', Size);
@@ -434,13 +448,25 @@
Smi->Module[ModuleCount].Index = (USHORT)ModuleCount;
Smi->Module[ModuleCount].NameLength = 0;
Smi->Module[ModuleCount].LoadCount = 0; /* FIXME */
+ UnicodeName[ModuleCount].Buffer = tmpNameBuffer;
+ UnicodeName[ModuleCount].MaximumLength =
current->FullDllName.Length + sizeof(WCHAR);
+ tmpNameBuffer += UnicodeName[ModuleCount].MaximumLength /
sizeof(WCHAR);
+ RtlCopyUnicodeString(&UnicodeName[ModuleCount],
¤t->FullDllName);
+ ModuleCount++;
+ current_entry = current_entry->Flink;
+ }
+
+ KeReleaseSpinLock(&ModuleListLock, Irql);
+
+ for (ModuleCount = 0; ModuleCount < Smi->Count; ModuleCount++)
+ {
AnsiName.Length = 0;
- AnsiName.MaximumLength = 256;
+ AnsiName.MaximumLength = 255;
AnsiName.Buffer = Smi->Module[ModuleCount].ImageName;
- RtlUnicodeStringToAnsiString(&AnsiName,
- ¤t->FullDllName,
- FALSE);
+ RtlUnicodeStringToAnsiString(&AnsiName,
&UnicodeName[ModuleCount], FALSE);
+ AnsiName.Buffer[AnsiName.Length] = 0;
+ Smi->Module[ModuleCount].NameLength = AnsiName.Length;
p = strrchr(AnsiName.Buffer, '\\');
if (p == NULL)
@@ -452,12 +478,9 @@
p++;
Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer;
}
-
- ModuleCount++;
- current_entry = current_entry->Flink;
}
- KeReleaseSpinLock(&ModuleListLock, Irql);
+ ExFreePool(UnicodeName);
return(STATUS_SUCCESS);
}