use tags for pool allocations, and reformat code
Modified: trunk/reactos/ntoskrnl/ldr/loader.c
_____
Modified: trunk/reactos/ntoskrnl/ldr/loader.c
--- trunk/reactos/ntoskrnl/ldr/loader.c 2005-04-08 11:08:26 UTC (rev
14544)
+++ trunk/reactos/ntoskrnl/ldr/loader.c 2005-04-08 12:54:37 UTC (rev
14545)
@@ -1,5 +1,5 @@
/* $Id$
- *
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ldr/loader.c
@@ -41,10 +41,13 @@
STATIC MODULE_TEXT_SECTION LdrHalTextSection;
ULONG_PTR LdrHalBase;
-#define TAG_DRIVER_MEM TAG('D', 'R', 'V', 'M')
+#define TAG_DRIVER_MEM TAG('D', 'R', 'V', 'M') /* drvm
*/
+#define TAG_MODULE_OBJECT TAG('k', 'l', 'm', 'o') /* klmo
- kernel ldr
module object */
+#define TAG_LDR_WSTR TAG('k', 'l', 'w', 's') /* klws -
kernel ldr wide
string */
+#define TAG_MODULE_TEXT_SECTION TAG('k', 'l', 'm', 't')
/* klmt -
kernel ldr module text */
#ifndef HIWORD
-#define HIWORD(X) ((WORD) (((DWORD) (X) >> 16) & 0xFFFF))
+#define HIWORD(X) ((WORD) (((DWORD) (X) >> 16) & 0xFFFF))
#endif
#ifndef LOWORD
#define LOWORD(X) ((WORD) (X))
@@ -53,1554 +56,1583 @@
/* FORWARD DECLARATIONS
******************************************************/
NTSTATUS
-LdrProcessModule(PVOID ModuleLoadBase,
- PUNICODE_STRING ModuleName,
- PMODULE_OBJECT *ModuleObject);
+LdrProcessModule (
+ PVOID ModuleLoadBase,
+ PUNICODE_STRING ModuleName,
+ PMODULE_OBJECT *ModuleObject );
static VOID
-LdrpBuildModuleBaseName(PUNICODE_STRING BaseName,
- PUNICODE_STRING FullName);
+LdrpBuildModuleBaseName (
+ PUNICODE_STRING BaseName,
+ PUNICODE_STRING FullName );
static LONG
-LdrpCompareModuleNames(IN PUNICODE_STRING String1,
- IN PUNICODE_STRING String2);
+LdrpCompareModuleNames (
+ IN PUNICODE_STRING String1,
+ IN PUNICODE_STRING String2 );
/* PE Driver load support */
-static NTSTATUS LdrPEProcessModule(PVOID ModuleLoadBase,
- PUNICODE_STRING FileName,
- PMODULE_OBJECT *ModuleObject);
+static NTSTATUS
+LdrPEProcessModule (
+ PVOID ModuleLoadBase,
+ PUNICODE_STRING FileName,
+ PMODULE_OBJECT *ModuleObject );
+
static PVOID
-LdrPEGetExportByName(PVOID BaseAddress,
- PUCHAR SymbolName,
- WORD Hint);
+LdrPEGetExportByName (
+ PVOID BaseAddress,
+ PUCHAR SymbolName,
+ WORD Hint );
static PVOID
-LdrPEFixupForward(PCHAR ForwardName);
+LdrPEFixupForward ( PCHAR ForwardName );
static NTSTATUS
-LdrPEPerformRelocations(PVOID DriverBase,
- ULONG DriverSize);
+LdrPEPerformRelocations (
+ PVOID DriverBase,
+ ULONG DriverSize );
static NTSTATUS
-LdrPEFixupImports(PMODULE_OBJECT Module);
+LdrPEFixupImports ( PMODULE_OBJECT Module );
/* FUNCTIONS
*****************************************************************/
VOID
-LdrInitDebug(PLOADER_MODULE Module, PWCH Name)
+LdrInitDebug ( PLOADER_MODULE Module, PWCH Name )
{
- PLIST_ENTRY current_entry;
- MODULE_TEXT_SECTION* current;
+ PLIST_ENTRY current_entry;
+ MODULE_TEXT_SECTION* current;
- current_entry = ModuleTextListHead.Flink;
- while (current_entry != &ModuleTextListHead)
+ current_entry = ModuleTextListHead.Flink;
+ while (current_entry != &ModuleTextListHead)
{
- current =
- CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION,
ListEntry);
- if (wcscmp(current->Name, Name) == 0)
- {
- break;
- }
- current_entry = current_entry->Flink;
+ current =
+ CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION,
ListEntry);
+ if (wcscmp(current->Name, Name) == 0)
+ {
+ break;
+ }
+ current_entry = current_entry->Flink;
}
- if (current_entry == &ModuleTextListHead)
+ if (current_entry == &ModuleTextListHead)
{
- return;
+ return;
}
}
VOID INIT_FUNCTION
-LdrInit1(VOID)
+LdrInit1 ( VOID )
{
- PIMAGE_NT_HEADERS NtHeader;
- PIMAGE_SECTION_HEADER SectionList;
+ PIMAGE_NT_HEADERS NtHeader;
+ PIMAGE_SECTION_HEADER SectionList;
- InitializeListHead(&ModuleTextListHead);
+ InitializeListHead(&ModuleTextListHead);
- /* Setup ntoskrnl.exe text section */
- /*
- * This isn't the base of the text segment, but the start of the
- * full image (in memory)
- * Also, the Length field isn't set to the length of the segment,
- * but is more like the offset, from the image base, to the end
- * of the segment.
- */
- NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE);
- SectionList = IMAGE_FIRST_SECTION(NtHeader);
- NtoskrnlTextSection.Base = KERNEL_BASE;
- NtoskrnlTextSection.Length = SectionList[0].Misc.VirtualSize +
- SectionList[0].VirtualAddress;
- NtoskrnlTextSection.Name = KERNEL_MODULE_NAME;
- NtoskrnlTextSection.OptionalHeader = OPTHDROFFSET(KERNEL_BASE);
- InsertTailList(&ModuleTextListHead, &NtoskrnlTextSection.ListEntry);
+ /* Setup ntoskrnl.exe text section */
+ /*
+ * This isn't the base of the text segment, but the start of the
+ * full image (in memory)
+ * Also, the Length field isn't set to the length of the segment,
+ * but is more like the offset, from the image base, to the end
+ * of the segment.
+ */
+ NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE);
+ SectionList = IMAGE_FIRST_SECTION(NtHeader);
+ NtoskrnlTextSection.Base = KERNEL_BASE;
+ NtoskrnlTextSection.Length = SectionList[0].Misc.VirtualSize
+ + SectionList[0].VirtualAddress;
+ NtoskrnlTextSection.Name = KERNEL_MODULE_NAME;
+ NtoskrnlTextSection.OptionalHeader = OPTHDROFFSET(KERNEL_BASE);
+ InsertTailList(&ModuleTextListHead,
&NtoskrnlTextSection.ListEntry);
- /* Setup hal.dll text section */
- /* Same comment as above applies */
- NtHeader = RtlImageNtHeader((PVOID)LdrHalBase);
- SectionList = IMAGE_FIRST_SECTION(NtHeader);
- LdrHalTextSection.Base = LdrHalBase;
- LdrHalTextSection.Length = SectionList[0].Misc.VirtualSize +
- SectionList[0].VirtualAddress;
- LdrHalTextSection.Name = HAL_MODULE_NAME;
- LdrHalTextSection.OptionalHeader = OPTHDROFFSET(LdrHalBase);
- InsertTailList(&ModuleTextListHead, &LdrHalTextSection.ListEntry);
+ /* Setup hal.dll text section */
+ /* Same comment as above applies */
+ NtHeader = RtlImageNtHeader((PVOID)LdrHalBase);
+ SectionList = IMAGE_FIRST_SECTION(NtHeader);
+ LdrHalTextSection.Base = LdrHalBase;
+ LdrHalTextSection.Length = SectionList[0].Misc.VirtualSize
+ + SectionList[0].VirtualAddress;
+ LdrHalTextSection.Name = HAL_MODULE_NAME;
+ LdrHalTextSection.OptionalHeader = OPTHDROFFSET(LdrHalBase);
+ InsertTailList(&ModuleTextListHead, &LdrHalTextSection.ListEntry);
- /* Hook for KDB on initialization of the loader. */
- KDB_LOADERINIT_HOOK(&NtoskrnlTextSection, &LdrHalTextSection);
+ /* Hook for KDB on initialization of the loader. */
+ KDB_LOADERINIT_HOOK(&NtoskrnlTextSection, &LdrHalTextSection);
}
VOID INIT_FUNCTION
-LdrInitModuleManagement(VOID)
+LdrInitModuleManagement ( VOID )
{
- PIMAGE_NT_HEADERS NtHeader;
+ PIMAGE_NT_HEADERS NtHeader;
- /* Initialize the module list and spinlock */
- InitializeListHead(&ModuleListHead);
- KeInitializeSpinLock(&ModuleListLock);
+ /* Initialize the module list and spinlock */
+ InitializeListHead(&ModuleListHead);
+ KeInitializeSpinLock(&ModuleListLock);
- /* Initialize ModuleObject for NTOSKRNL */
- RtlZeroMemory(&NtoskrnlModuleObject, sizeof(MODULE_OBJECT));
- NtoskrnlModuleObject.Base = (PVOID) KERNEL_BASE;
- NtoskrnlModuleObject.Flags = MODULE_FLAG_PE;
- RtlInitUnicodeString(&NtoskrnlModuleObject.FullName,
KERNEL_MODULE_NAME);
- LdrpBuildModuleBaseName(&NtoskrnlModuleObject.BaseName,
&NtoskrnlModuleObject.FullName);
+ /* Initialize ModuleObject for NTOSKRNL */
+ RtlZeroMemory(&NtoskrnlModuleObject, sizeof(MODULE_OBJECT));
+ NtoskrnlModuleObject.Base = (PVOID) KERNEL_BASE;
+ NtoskrnlModuleObject.Flags = MODULE_FLAG_PE;
+ RtlInitUnicodeString(&NtoskrnlModuleObject.FullName,
KERNEL_MODULE_NAME);
+ LdrpBuildModuleBaseName(&NtoskrnlModuleObject.BaseName,
&NtoskrnlModuleObject.FullName);
- NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE);
- NtoskrnlModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader;
- NtoskrnlModuleObject.Image.PE.OptionalHeader =
&NtHeader->OptionalHeader;
- NtoskrnlModuleObject.Image.PE.SectionList =
IMAGE_FIRST_SECTION(NtHeader);
- NtoskrnlModuleObject.EntryPoint = (PVOID) ((ULONG_PTR)
NtoskrnlModuleObject.Base +
NtHeader->OptionalHeader.AddressOfEntryPoint);
- DPRINT("ModuleObject:%08x entrypoint at %x\n",
&NtoskrnlModuleObject, NtoskrnlModuleObject.EntryPoint);
- NtoskrnlModuleObject.Length =
NtoskrnlModuleObject.Image.PE.OptionalHeader->SizeOfImage;
- NtoskrnlModuleObject.TextSection = &NtoskrnlTextSection;
+ NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE);
+ NtoskrnlModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader;
+ NtoskrnlModuleObject.Image.PE.OptionalHeader =
&NtHeader->OptionalHeader;
+ NtoskrnlModuleObject.Image.PE.SectionList =
IMAGE_FIRST_SECTION(NtHeader);
+ NtoskrnlModuleObject.EntryPoint = (PVOID) ((ULONG_PTR)
NtoskrnlModuleObject.Base +
NtHeader->OptionalHeader.AddressOfEntryPoint);
+ DPRINT("ModuleObject:%08x entrypoint at %x\n",
&NtoskrnlModuleObject, NtoskrnlModuleObject.EntryPoint);
+ NtoskrnlModuleObject.Length =
NtoskrnlModuleObject.Image.PE.OptionalHeader->SizeOfImage;
+ NtoskrnlModuleObject.TextSection = &NtoskrnlTextSection;
- InsertTailList(&ModuleListHead,
- &NtoskrnlModuleObject.ListEntry);
+ InsertTailList(&ModuleListHead,
+ &NtoskrnlModuleObject.ListEntry);
- /* Initialize ModuleObject for HAL */
- RtlZeroMemory(&HalModuleObject, sizeof(MODULE_OBJECT));
- HalModuleObject.Base = (PVOID) LdrHalBase;
- HalModuleObject.Flags = MODULE_FLAG_PE;
+ /* Initialize ModuleObject for HAL */
+ RtlZeroMemory(&HalModuleObject, sizeof(MODULE_OBJECT));
+ HalModuleObject.Base = (PVOID) LdrHalBase;
+ HalModuleObject.Flags = MODULE_FLAG_PE;
- RtlInitUnicodeString(&HalModuleObject.FullName, HAL_MODULE_NAME);
- LdrpBuildModuleBaseName(&HalModuleObject.BaseName,
&HalModuleObject.FullName);
+ RtlInitUnicodeString(&HalModuleObject.FullName, HAL_MODULE_NAME);
+ LdrpBuildModuleBaseName(&HalModuleObject.BaseName,
&HalModuleObject.FullName);
- NtHeader = RtlImageNtHeader((PVOID)LdrHalBase);
- HalModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader;
- HalModuleObject.Image.PE.OptionalHeader = &NtHeader->OptionalHeader;
- HalModuleObject.Image.PE.SectionList = IMAGE_FIRST_SECTION(NtHeader);
- HalModuleObject.EntryPoint = (PVOID) ((ULONG_PTR)
HalModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint);
- DPRINT("ModuleObject:%08x entrypoint at %x\n", &HalModuleObject,
HalModuleObject.EntryPoint);
- HalModuleObject.Length =
HalModuleObject.Image.PE.OptionalHeader->SizeOfImage;
- HalModuleObject.TextSection = &LdrHalTextSection;
+ NtHeader = RtlImageNtHeader((PVOID)LdrHalBase);
+ HalModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader;
+ HalModuleObject.Image.PE.OptionalHeader =
&NtHeader->OptionalHeader;
+ HalModuleObject.Image.PE.SectionList =
IMAGE_FIRST_SECTION(NtHeader);
+ HalModuleObject.EntryPoint = (PVOID) ((ULONG_PTR)
HalModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint);
+ DPRINT("ModuleObject:%08x entrypoint at %x\n", &HalModuleObject,
HalModuleObject.EntryPoint);
+ HalModuleObject.Length =
HalModuleObject.Image.PE.OptionalHeader->SizeOfImage;
+ HalModuleObject.TextSection = &LdrHalTextSection;
- InsertTailList(&ModuleListHead,
- &HalModuleObject.ListEntry);
+ InsertTailList(&ModuleListHead,
+ &HalModuleObject.ListEntry);
}
NTSTATUS
-LdrpLoadImage(PUNICODE_STRING DriverName,
- PVOID *ModuleBase,
- PVOID *SectionPointer,
- PVOID *EntryPoint,
- PVOID *ExportSectionPointer)
+LdrpLoadImage (
+ PUNICODE_STRING DriverName,
+ PVOID *ModuleBase,
+ PVOID *SectionPointer,
+ PVOID *EntryPoint,
+ PVOID *ExportSectionPointer )
{
- PMODULE_OBJECT ModuleObject;
- NTSTATUS Status;
+ PMODULE_OBJECT ModuleObject;
+ NTSTATUS Status;
- ModuleObject = LdrGetModuleObject(DriverName);
- if (ModuleObject == NULL)
+ ModuleObject = LdrGetModuleObject(DriverName);
+ if (ModuleObject == NULL)
{
- Status = LdrLoadModule(DriverName, &ModuleObject);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
+ Status = LdrLoadModule(DriverName, &ModuleObject);
+ if (!NT_SUCCESS(Status))
+ {
+ return(Status);
+ }
}
- if (ModuleBase)
- *ModuleBase = ModuleObject->Base;
+ if (ModuleBase)
+ *ModuleBase = ModuleObject->Base;
-// if (SectionPointer)
-// *SectionPointer = ModuleObject->
+ //if (SectionPointer)
+ // *SectionPointer = ModuleObject->
- if (EntryPoint)
- *EntryPoint = ModuleObject->EntryPoint;
+ if (EntryPoint)
+ *EntryPoint = ModuleObject->EntryPoint;
-// if (ExportSectionPointer)
-// *ExportSectionPointer = ModuleObject->
+ //if (ExportSectionPointer)
+ // *ExportSectionPointer = ModuleObject->
- return(STATUS_SUCCESS);
+ return(STATUS_SUCCESS);
}
NTSTATUS
-LdrpUnloadImage(PVOID ModuleBase)
+LdrpUnloadImage ( PVOID ModuleBase )
{
- return(STATUS_NOT_IMPLEMENTED);
+ return(STATUS_NOT_IMPLEMENTED);
}
NTSTATUS
-LdrpLoadAndCallImage(PUNICODE_STRING ModuleName)
+LdrpLoadAndCallImage ( PUNICODE_STRING ModuleName )
{
- PDRIVER_INITIALIZE DriverEntry;
- PMODULE_OBJECT ModuleObject;
- NTSTATUS Status;
+ PDRIVER_INITIALIZE DriverEntry;
+ PMODULE_OBJECT ModuleObject;
+ NTSTATUS Status;
- ModuleObject = LdrGetModuleObject(ModuleName);
- if (ModuleObject != NULL)
+ ModuleObject = LdrGetModuleObject(ModuleName);
+ if (ModuleObject != NULL)
{
- return(STATUS_IMAGE_ALREADY_LOADED);
+ return(STATUS_IMAGE_ALREADY_LOADED);
}
- Status = LdrLoadModule(ModuleName, &ModuleObject);
- if (!NT_SUCCESS(Status))
+ Status = LdrLoadModule(ModuleName, &ModuleObject);
+ if (!NT_SUCCESS(Status))
{
- return(Status);
+ return(Status);
}
- DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint;
+ DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint;
- Status = DriverEntry(NULL, NULL);
- if (!NT_SUCCESS(Status))
+ Status = DriverEntry(NULL, NULL);
+ if (!NT_SUCCESS(Status))
{
- LdrUnloadModule(ModuleObject);
+ LdrUnloadModule(ModuleObject);
}
- return(Status);
+ return(Status);
}
NTSTATUS
-LdrLoadModule(PUNICODE_STRING Filename,
- PMODULE_OBJECT *ModuleObject)
+LdrLoadModule(
+ PUNICODE_STRING Filename,
+ PMODULE_OBJECT *ModuleObject )
{
- PVOID ModuleLoadBase;
- NTSTATUS Status;
- HANDLE FileHandle;
- OBJECT_ATTRIBUTES ObjectAttributes;
- PMODULE_OBJECT Module;
- FILE_STANDARD_INFORMATION FileStdInfo;
- IO_STATUS_BLOCK IoStatusBlock;
+ PVOID ModuleLoadBase;
+ NTSTATUS Status;
+ HANDLE FileHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ PMODULE_OBJECT Module;
+ FILE_STANDARD_INFORMATION FileStdInfo;
+ IO_STATUS_BLOCK IoStatusBlock;
- *ModuleObject = NULL;
+ *ModuleObject = NULL;
- DPRINT("Loading Module %wZ...\n", Filename);
+ DPRINT("Loading Module %wZ...\n", Filename);
- /* Open the Module */
- InitializeObjectAttributes(&ObjectAttributes,
- Filename,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- CHECKPOINT;
- Status = ZwOpenFile(&FileHandle,
- FILE_ALL_ACCESS,
- &ObjectAttributes,
- &IoStatusBlock,
- 0,
- FILE_SYNCHRONOUS_IO_NONALERT);
- CHECKPOINT;
- if (!NT_SUCCESS(Status))
+ /* Open the Module */
+ InitializeObjectAttributes(&ObjectAttributes,
+ Filename,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ CHECKPOINT;
+ Status = ZwOpenFile(&FileHandle,
+ FILE_ALL_ACCESS,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ 0,
+ FILE_SYNCHRONOUS_IO_NONALERT);
+ CHECKPOINT;
+ if (!NT_SUCCESS(Status))
{
- CPRINT("Could not open module file: %wZ\n", Filename);
- return(Status);
+ CPRINT("Could not open module file: %wZ\n", Filename);
+ return(Status);
}
- CHECKPOINT;
+ CHECKPOINT;
- /* Get the size of the file */
- Status = ZwQueryInformationFile(FileHandle,
- &IoStatusBlock,
- &FileStdInfo,
- sizeof(FileStdInfo),
- FileStandardInformation);
- if (!NT_SUCCESS(Status))
+ /* Get the size of the file */
+ Status = ZwQueryInformationFile(FileHandle,
+ &IoStatusBlock,
+ &FileStdInfo,
+ sizeof(FileStdInfo),
+ FileStandardInformation);
+ if (!NT_SUCCESS(Status))
{
- CPRINT("Could not get file size\n");
- NtClose(FileHandle);
- return(Status);
+ CPRINT("Could not get file size\n");
+ NtClose(FileHandle);
+ return(Status);
}
- CHECKPOINT;
+ CHECKPOINT;
- /* Allocate nonpageable memory for driver */
- ModuleLoadBase = ExAllocatePoolWithTag(NonPagedPool,
-
FileStdInfo.EndOfFile.u.LowPart,
- TAG_DRIVER_MEM);
- if (ModuleLoadBase == NULL)
+ /* Allocate nonpageable memory for driver */
+ ModuleLoadBase = ExAllocatePoolWithTag(NonPagedPool,
+ FileStdInfo.EndOfFile.u.LowPart,
+ TAG_DRIVER_MEM);
+ if (ModuleLoadBase == NULL)
{
- CPRINT("Could not allocate memory for module");
- NtClose(FileHandle);
- return(STATUS_INSUFFICIENT_RESOURCES);
+ CPRINT("Could not allocate memory for module");
+ NtClose(FileHandle);
+ return(STATUS_INSUFFICIENT_RESOURCES);
}
- CHECKPOINT;
+ CHECKPOINT;
- /* Load driver into memory chunk */
- Status = ZwReadFile(FileHandle,
- 0, 0, 0,
- &IoStatusBlock,
- ModuleLoadBase,
- FileStdInfo.EndOfFile.u.LowPart,
- 0, 0);
- if (!NT_SUCCESS(Status))
+ /* Load driver into memory chunk */
+ Status = ZwReadFile(FileHandle,
+ 0, 0, 0,
+ &IoStatusBlock,
+ ModuleLoadBase,
+ FileStdInfo.EndOfFile.u.LowPart,
+ 0, 0);
+ if (!NT_SUCCESS(Status))
{
- CPRINT("Could not read module file into memory");
- ExFreePool(ModuleLoadBase);
- NtClose(FileHandle);
- return(Status);
+ CPRINT("Could not read module file into memory");
+ ExFreePool(ModuleLoadBase);
+ NtClose(FileHandle);
+ return(Status);
}
- CHECKPOINT;
+ CHECKPOINT;
- ZwClose(FileHandle);
+ ZwClose(FileHandle);
- Status = LdrProcessModule(ModuleLoadBase,
- Filename,
- &Module);
- if (!NT_SUCCESS(Status))
+ Status = LdrProcessModule(ModuleLoadBase,
+ Filename,
+ &Module);
+ if (!NT_SUCCESS(Status))
{
- CPRINT("Could not process module\n");
- ExFreePool(ModuleLoadBase);
- return(Status);
+ CPRINT("Could not process module\n");
+ ExFreePool(ModuleLoadBase);
+ return(Status);
}
- /* Cleanup */
- ExFreePool(ModuleLoadBase);
+ /* Cleanup */
+ ExFreePool(ModuleLoadBase);
- *ModuleObject = Module;
+ *ModuleObject = Module;
- /* Hook for KDB on loading a driver. */
- KDB_LOADDRIVER_HOOK(Filename, Module);
+ /* Hook for KDB on loading a driver. */
+ KDB_LOADDRIVER_HOOK(Filename, Module);
- return(STATUS_SUCCESS);
+ return(STATUS_SUCCESS);
}
NTSTATUS
-LdrUnloadModule(PMODULE_OBJECT ModuleObject)
+LdrUnloadModule ( PMODULE_OBJECT ModuleObject )
{
- KIRQL Irql;
+ KIRQL Irql;
- /* Remove the module from the module list */
- KeAcquireSpinLock(&ModuleListLock,&Irql);
- RemoveEntryList(&ModuleObject->ListEntry);
- KeReleaseSpinLock(&ModuleListLock, Irql);
+ /* Remove the module from the module list */
+ KeAcquireSpinLock(&ModuleListLock,&Irql);
+ RemoveEntryList(&ModuleObject->ListEntry);
+ KeReleaseSpinLock(&ModuleListLock, Irql);
- /* Hook for KDB on unloading a driver. */
- KDB_UNLOADDRIVER_HOOK(ModuleObject);
+ /* Hook for KDB on unloading a driver. */
+ KDB_UNLOADDRIVER_HOOK(ModuleObject);
- /* Free text section */
- if (ModuleObject->TextSection != NULL)
+ /* Free text section */
+ if (ModuleObject->TextSection != NULL)
{
- ExFreePool(ModuleObject->TextSection->Name);
- RemoveEntryList(&ModuleObject->TextSection->ListEntry);
- ExFreePool(ModuleObject->TextSection);
- ModuleObject->TextSection = NULL;
+ ExFreePool(ModuleObject->TextSection->Name);
+ RemoveEntryList(&ModuleObject->TextSection->ListEntry);
+ ExFreePool(ModuleObject->TextSection);
+ ModuleObject->TextSection = NULL;
}
- /* Free module section */
-// MmFreeSection(ModuleObject->Base);
+ /* Free module section */
+ // MmFreeSection(ModuleObject->Base);
- ExFreePool(ModuleObject->FullName.Buffer);
- ExFreePool(ModuleObject);
+ ExFreePool(ModuleObject->FullName.Buffer);
+ ExFreePool(ModuleObject);
- return(STATUS_SUCCESS);
+ return(STATUS_SUCCESS);
}
NTSTATUS
-LdrProcessModule(PVOID ModuleLoadBase,
- PUNICODE_STRING ModuleName,
- PMODULE_OBJECT *ModuleObject)
+LdrProcessModule(
+ PVOID ModuleLoadBase,
+ PUNICODE_STRING ModuleName,
+ PMODULE_OBJECT *ModuleObject )
{
- PIMAGE_DOS_HEADER PEDosHeader;
+ PIMAGE_DOS_HEADER PEDosHeader;
- /* If MZ header exists */
- PEDosHeader = (PIMAGE_DOS_HEADER) ModuleLoadBase;
- if (PEDosHeader->e_magic == IMAGE_DOS_SIGNATURE &&
PEDosHeader->e_lfanew != 0L)
+ /* If MZ header exists */
+ PEDosHeader = (PIMAGE_DOS_HEADER) ModuleLoadBase;
+ if (PEDosHeader->e_magic == IMAGE_DOS_SIGNATURE &&
PEDosHeader->e_lfanew != 0L)
{
- return LdrPEProcessModule(ModuleLoadBase,
- ModuleName,
- ModuleObject);
+ return LdrPEProcessModule(ModuleLoadBase,
+ ModuleName,
+ ModuleObject);
}
- CPRINT("Module wasn't PE\n");
- return STATUS_UNSUCCESSFUL;
+ CPRINT("Module wasn't PE\n");
+ return STATUS_UNSUCCESSFUL;
}
NTSTATUS
-LdrpQueryModuleInformation(PVOID Buffer,
- ULONG Size,
- PULONG ReqSize)
+LdrpQueryModuleInformation (
+ PVOID Buffer,
+ ULONG Size,
+ PULONG ReqSize )
{
- PLIST_ENTRY current_entry;
- PMODULE_OBJECT current;
- ULONG ModuleCount = 0;
- PSYSTEM_MODULE_INFORMATION Smi;
- ANSI_STRING AnsiName;
- PCHAR p;
- KIRQL Irql;
+ PLIST_ENTRY current_entry;
+ PMODULE_OBJECT current;
+ ULONG ModuleCount = 0;
+ PSYSTEM_MODULE_INFORMATION Smi;
+ ANSI_STRING AnsiName;
+ PCHAR p;
+ KIRQL Irql;
- KeAcquireSpinLock(&ModuleListLock,&Irql);
+ KeAcquireSpinLock(&ModuleListLock,&Irql);
- /* calculate required size */
- current_entry = ModuleListHead.Flink;
- while (current_entry != (&ModuleListHead))
+ /* calculate required size */
+ current_entry = ModuleListHead.Flink;
+ while (current_entry != (&ModuleListHead))
{
- ModuleCount++;
- current_entry = current_entry->Flink;
+ ModuleCount++;
+ current_entry = current_entry->Flink;
}
- *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+
- (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION_ENTRY);
+ *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+
+ (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION_ENTRY);
- if (Size < *ReqSize)
+ if (Size < *ReqSize)
{
- KeReleaseSpinLock(&ModuleListLock, Irql);
- return(STATUS_INFO_LENGTH_MISMATCH);
+ KeReleaseSpinLock(&ModuleListLock, Irql);
+ return(STATUS_INFO_LENGTH_MISMATCH);
}
- /* fill the buffer */
- memset(Buffer, '=', Size);
+ /* fill the buffer */
+ memset(Buffer, '=', Size);
- Smi = (PSYSTEM_MODULE_INFORMATION)Buffer;
- Smi->Count = ModuleCount;
+ Smi = (PSYSTEM_MODULE_INFORMATION)Buffer;
+ Smi->Count = ModuleCount;
- ModuleCount = 0;
- current_entry = ModuleListHead.Flink;
- while (current_entry != (&ModuleListHead))
+ ModuleCount = 0;
+ current_entry = ModuleListHead.Flink;
+ while (current_entry != (&ModuleListHead))
{
- current =
CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry);
+ current =
CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry);
- Smi->Module[ModuleCount].Unknown1 = 0; /* Always 0 */
- Smi->Module[ModuleCount].Unknown2 = 0; /* Always 0 */
- Smi->Module[ModuleCount].Base = current->Base;
- Smi->Module[ModuleCount].Size = current->Length;
- Smi->Module[ModuleCount].Flags = 0; /* Flags ???
(GN) */
- Smi->Module[ModuleCount].Index = (USHORT)ModuleCount;
- Smi->Module[ModuleCount].NameLength = 0;
- Smi->Module[ModuleCount].LoadCount = 0; /* FIXME */
+ Smi->Module[ModuleCount].Unknown1 = 0; /* Always
0 */
+ Smi->Module[ModuleCount].Unknown2 = 0; /* Always
0 */
+ Smi->Module[ModuleCount].Base = current->Base;
+ Smi->Module[ModuleCount].Size = current->Length;
+ Smi->Module[ModuleCount].Flags = 0; /* Flags ???
(GN) */
+ Smi->Module[ModuleCount].Index = (USHORT)ModuleCount;
+ Smi->Module[ModuleCount].NameLength = 0;
+ Smi->Module[ModuleCount].LoadCount = 0; /* FIXME */
- AnsiName.Length = 0;
- AnsiName.MaximumLength = 256;
- AnsiName.Buffer = Smi->Module[ModuleCount].ImageName;
- RtlUnicodeStringToAnsiString(&AnsiName,
- ¤t->FullName,
- FALSE);
+ AnsiName.Length = 0;
+ AnsiName.MaximumLength = 256;
+ AnsiName.Buffer = Smi->Module[ModuleCount].ImageName;
+ RtlUnicodeStringToAnsiString(&AnsiName,
+ ¤t->FullName,
+ FALSE);
- p = strrchr(AnsiName.Buffer, '\\');
- if (p == NULL)
- {
- Smi->Module[ModuleCount].PathLength = 0;
- }
- else
- {
- p++;
- Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer;
- }
+ p = strrchr(AnsiName.Buffer, '\\');
+ if (p == NULL)
+ {
+ Smi->Module[ModuleCount].PathLength = 0;
+ }
+ else
+ {
+ p++;
+ Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer;
+ }
- ModuleCount++;
- current_entry = current_entry->Flink;
+ ModuleCount++;
+ current_entry = current_entry->Flink;
}
- KeReleaseSpinLock(&ModuleListLock, Irql);
+ KeReleaseSpinLock(&ModuleListLock, Irql);
- return(STATUS_SUCCESS);
+ return(STATUS_SUCCESS);
}
static VOID
-LdrpBuildModuleBaseName(PUNICODE_STRING BaseName,
- PUNICODE_STRING FullName)
+LdrpBuildModuleBaseName (
+ PUNICODE_STRING BaseName,
+ PUNICODE_STRING FullName )
{
- PWCHAR p;
+ PWCHAR p;
- DPRINT("LdrpBuildModuleBaseName()\n");
- DPRINT("FullName %wZ\n", FullName);
+ DPRINT("LdrpBuildModuleBaseName()\n");
+ DPRINT("FullName %wZ\n", FullName);
- p = wcsrchr(FullName->Buffer, L'\\');
- if (p == NULL)
- {
- p = FullName->Buffer;
- }
- else
- {
- p++;
- }
+ p = wcsrchr(FullName->Buffer, L'\\');
+ if (p == NULL)
+ {
+ p = FullName->Buffer;
+ }
+ else
+ {
+ p++;
+ }
- DPRINT("p %S\n", p);
+ DPRINT("p %S\n", p);
- RtlInitUnicodeString(BaseName, p);
+ RtlInitUnicodeString(BaseName, p);
}
static LONG
-LdrpCompareModuleNames(IN PUNICODE_STRING String1,
- IN PUNICODE_STRING String2)
+LdrpCompareModuleNames (
+ IN PUNICODE_STRING String1,
+ IN PUNICODE_STRING String2 )
{
- ULONG len1, len2, i;
- PWCHAR s1, s2, p;
- WCHAR c1, c2;
+ ULONG len1, len2, i;
+ PWCHAR s1, s2, p;
+ WCHAR c1, c2;
- if (String1 && String2)
+ if (String1 && String2)
{
- /* Search String1 for last path component */
- len1 = String1->Length / sizeof(WCHAR);
- s1 = String1->Buffer;
- for (i = 0, p = String1->Buffer; i < String1->Length; i = i +
sizeof(WCHAR), p++)
- {
- if (*p == L'\\')
- {
- if (i == String1->Length - sizeof(WCHAR))
- {
- s1 = NULL;
- len1 = 0;
- }
- else
- {
- s1 = p + 1;
- len1 = (String1->Length - i) / sizeof(WCHAR);
- }
- }
- }
+ /* Search String1 for last path component */
+ len1 = String1->Length / sizeof(WCHAR);
+ s1 = String1->Buffer;
+ for (i = 0, p = String1->Buffer; i < String1->Length; i = i +
sizeof(WCHAR), p++)
+ {
+ if (*p == L'\\')
+ {
+ if (i == String1->Length - sizeof(WCHAR))
+ {
+ s1 = NULL;
+ len1 = 0;
+ }
+ else
+ {
+ s1 = p + 1;
+ len1 = (String1->Length - i) / sizeof(WCHAR);
+ }
+ }
+ }
- /* Search String2 for last path component */
- len2 = String2->Length / sizeof(WCHAR);
- s2 = String2->Buffer;
- for (i = 0, p = String2->Buffer; i < String2->Length; i = i +
sizeof(WCHAR), p++)
- {
- if (*p == L'\\')
- {
- if (i == String2->Length - sizeof(WCHAR))
- {
- s2 = NULL;
- len2 = 0;
- }
- else
- {
- s2 = p + 1;
- len2 = (String2->Length - i) / sizeof(WCHAR);
- }
- }
- }
+ /* Search String2 for last path component */
+ len2 = String2->Length / sizeof(WCHAR);
+ s2 = String2->Buffer;
+ for (i = 0, p = String2->Buffer; i < String2->Length; i = i +
sizeof(WCHAR), p++)
+ {
+ if (*p == L'\\')
+ {
+ if (i == String2->Length - sizeof(WCHAR))
+ {
+ s2 = NULL;
+ len2 = 0;
+ }
+ else
+ {
+ s2 = p + 1;
+ len2 = (String2->Length - i) / sizeof(WCHAR);
+ }
+ }
+ }
- /* Compare last path components */
- if (s1 && s2)
- {
- while (1)
- {
- c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0;
- c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0;
- if ((c1 == 0 && c2 == L'.') || (c1 == L'.' && c2
== 0))
- return(0);
- if (!c1 || !c2 || c1 != c2)
- return(c1 - c2);
- }
- }
+ /* Compare last path components */
+ if (s1 && s2)
+ {
+ while (1)
+ {
+ c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0;
+ c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0;
+ if ((c1 == 0 && c2 == L'.') || (c1 == L'.'
&& c2 == 0))
+ return(0);
+ if (!c1 || !c2 || c1 != c2)
+ return(c1 - c2);
+ }
+ }
}
- return(0);
+ return(0);
}
PMODULE_OBJECT
-LdrGetModuleObject(PUNICODE_STRING ModuleName)
+LdrGetModuleObject ( PUNICODE_STRING ModuleName )
{
- PMODULE_OBJECT Module;
- PLIST_ENTRY Entry;
- KIRQL Irql;
+ PMODULE_OBJECT Module;
+ PLIST_ENTRY Entry;
+ KIRQL Irql;
- DPRINT("LdrGetModuleObject(%wZ) called\n", ModuleName);
+ DPRINT("LdrGetModuleObject(%wZ) called\n", ModuleName);
- KeAcquireSpinLock(&ModuleListLock,&Irql);
+ KeAcquireSpinLock(&ModuleListLock,&Irql);
- Entry = ModuleListHead.Flink;
- while (Entry != &ModuleListHead)
+ Entry = ModuleListHead.Flink;
+ while (Entry != &ModuleListHead)
{
- Module = CONTAINING_RECORD(Entry, MODULE_OBJECT, ListEntry);
+ Module = CONTAINING_RECORD(Entry, MODULE_OBJECT, ListEntry);
- DPRINT("Comparing %wZ and %wZ\n",
- &Module->BaseName,
[truncated at 1000 lines; 1790 more skipped]