* JF 26/01/2000 Recoded some parts to retrieve export details correctly
* DW 27/06/2000 Removed redundant header files
* CSH 11/04/2001 Added automatic loading of module symbols if they exist
+ * KJK 02/04/2003 Nebbet-ized a couple of type names
*/
Length = wcslen(Start);
wcsncpy(Buffer, Start, Length);
+ Buffer[Length] = 0;
RtlCreateUnicodeString(&DeviceNode->ServiceName, Buffer);
Status = IopInitializeDriver(ModuleObject->EntryPoint,
PLIST_ENTRY current_entry;
PMODULE_OBJECT current;
ULONG ModuleCount = 0;
- PSYSTEM_MODULE_INFORMATION Smi;
+ PSYSTEM_MODULES Smi;
ANSI_STRING AnsiName;
PCHAR p;
KIRQL Irql;
current_entry = current_entry->Flink;
}
- *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+
- (ModuleCount - 1) * sizeof(SYSTEM_MODULE_ENTRY);
+ *ReqSize = sizeof(SYSTEM_MODULES)+
+ (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION);
if (Size < *ReqSize)
{
/* fill the buffer */
memset(Buffer, '=', Size);
- Smi = (PSYSTEM_MODULE_INFORMATION)Buffer;
+ Smi = (PSYSTEM_MODULES)Buffer;
Smi->Count = ModuleCount;
ModuleCount = 0;
{
current = CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry);
- Smi->Module[ModuleCount].Unknown2 = 0; /* Always 0 */
- Smi->Module[ModuleCount].BaseAddress = current->Base;
- Smi->Module[ModuleCount].Size = current->Length;
- Smi->Module[ModuleCount].Flags = 0; /* Flags ??? (GN) */
- Smi->Module[ModuleCount].EntryIndex = ModuleCount;
+ Smi->Modules[ModuleCount].Reserved[0] = 0; /* Always 0 */
+ Smi->Modules[ModuleCount].Reserved[1] = 0; /* Always 0 */
+ Smi->Modules[ModuleCount].Base = current->Base;
+ Smi->Modules[ModuleCount].Size = current->Length;
+ Smi->Modules[ModuleCount].Flags = 0; /* Flags ??? (GN) */
+ Smi->Modules[ModuleCount].Index = ModuleCount;
+ Smi->Modules[ModuleCount].Unknown = 0;
+ Smi->Modules[ModuleCount].LoadCount = 0; /* FIXME */
AnsiName.Length = 0;
AnsiName.MaximumLength = 256;
- AnsiName.Buffer = Smi->Module[ModuleCount].Name;
+ AnsiName.Buffer = Smi->Modules[ModuleCount].ImageName;
RtlUnicodeStringToAnsiString(&AnsiName,
¤t->FullName,
FALSE);
p = strrchr(AnsiName.Buffer, '\\');
if (p == NULL)
{
- Smi->Module[ModuleCount].PathLength = 0;
- Smi->Module[ModuleCount].NameLength = strlen(AnsiName.Buffer);
+ Smi->Modules[ModuleCount].ModuleNameOffset = 0;
}
else
{
p++;
- Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer;
- Smi->Module[ModuleCount].NameLength = strlen(p);
+ Smi->Modules[ModuleCount].ModuleNameOffset = p - AnsiName.Buffer;
}
ModuleCount++;
LibraryModuleObject = LdrGetModuleObject(&ModuleName);
if (LibraryModuleObject == NULL)
{
- CPRINT("Module '%wZ' not loaded yet\n", &ModuleName);
+ DPRINT("Module '%wZ' not loaded yet\n", &ModuleName);
wcscpy(NameBuffer, L"\\SystemRoot\\system32\\drivers\\");
wcscat(NameBuffer, ModuleName.Buffer);
RtlInitUnicodeString(&NameString, NameBuffer);
Status = LdrLoadModule(&NameString, &LibraryModuleObject);
if (!NT_SUCCESS(Status))
{
- CPRINT("Unknown import module: %wZ (Status %lx)\n", &ModuleName, Status);
- return(Status);
+ wcscpy(NameBuffer, L"\\SystemRoot\\system32\\");
+ wcscat(NameBuffer, ModuleName.Buffer);
+ RtlInitUnicodeString(&NameString, NameBuffer);
+ Status = LdrLoadModule(&NameString, &LibraryModuleObject);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Unknown import module: %wZ (Status %lx)\n", &ModuleName, Status);
+ return(Status);
+ }
}
}
/* Get the import address list */
{
ULONG Offset;
ULONG Type;
- PDWORD RelocItem;
+ PULONG RelocItem;
Offset = RelocEntry[Idx].TypeOffset & 0xfff;
Type = (RelocEntry[Idx].TypeOffset >> 12) & 0xf;