- Merge some parts of IoInitSystem in the same main function instead of calling out to 10 external modules.

- Re-factor some code into smaller functions.
- Don't create some Object Directories twice, since now ExpCreateSystemRootLink does some of them.
- Add some failure paths to I/O Init.
- Implement a function to mark the boot partition DO_SYSTEM_BOOT_PARTITION in order to better catch some bugchecks.

svn path=/trunk/; revision=24552
This commit is contained in:
Alex Ionescu 2006-10-17 05:14:57 +00:00
parent 6dc593f684
commit 07b9937721
7 changed files with 244 additions and 201 deletions

View file

@ -41,26 +41,8 @@ LdrProcessModule(
PLDR_DATA_TABLE_ENTRY *ModuleObject PLDR_DATA_TABLE_ENTRY *ModuleObject
); );
#if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, IopInitDriverImplementation)
#endif
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
VOID
INIT_FUNCTION
IopInitDriverImplementation(VOID)
{
InitializeListHead(&DriverReinitListHead);
KeInitializeSpinLock(&DriverReinitListLock);
DriverReinitTailEntry = NULL;
InitializeListHead(&DriverBootReinitListHead);
KeInitializeSpinLock(&DriverBootReinitListLock);
DriverBootReinitTailEntry = NULL;
}
NTSTATUS STDCALL NTSTATUS STDCALL
IopInvalidDeviceRequest( IopInvalidDeviceRequest(
PDEVICE_OBJECT DeviceObject, PDEVICE_OBJECT DeviceObject,

View file

@ -31,16 +31,9 @@ BOOLEAN IopLogPortConnected;
HANDLE IopLogPort; HANDLE IopLogPort;
WORK_QUEUE_ITEM IopErrorLogWorkItem; WORK_QUEUE_ITEM IopErrorLogWorkItem;
/* PRIVATE FUNCTIONS *********************************************************/ PDEVICE_OBJECT IopErrorLogObject;
VOID /* PRIVATE FUNCTIONS *********************************************************/
NTAPI
IopInitErrorLog(VOID)
{
/* Initialize the locks and list head */
KeInitializeSpinLock(&IopLogListLock);
InitializeListHead(&IopLogListHead);
}
VOID VOID
NTAPI NTAPI

View file

@ -23,6 +23,14 @@ IoSynchronousInvalidateDeviceRelations(
IN DEVICE_RELATION_TYPE Type IN DEVICE_RELATION_TYPE Type
); );
VOID
NTAPI
IopTimerDispatch(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
/* DATA ********************************************************************/ /* DATA ********************************************************************/
@ -49,16 +57,38 @@ extern LIST_ENTRY ShutdownListHead;
extern KSPIN_LOCK ShutdownListLock; extern KSPIN_LOCK ShutdownListLock;
extern NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside; extern NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside;
extern POBJECT_TYPE IoAdapterObjectType; extern POBJECT_TYPE IoAdapterObjectType;
ERESOURCE IopDatabaseResource;
extern ERESOURCE FileSystemListLock;
ERESOURCE IopSecurityResource;
extern KGUARDED_MUTEX FsChangeNotifyListLock;
extern KGUARDED_MUTEX PnpNotifyListLock;
extern LIST_ENTRY IopDiskFsListHead;
extern LIST_ENTRY IopCdRomFsListHead;
extern LIST_ENTRY IopTapeFsListHead;
extern LIST_ENTRY IopNetworkFsListHead;
extern LIST_ENTRY DriverBootReinitListHead;
extern LIST_ENTRY DriverReinitListHead;
extern LIST_ENTRY PnpNotifyListHead;
extern LIST_ENTRY FsChangeNotifyListHead;
extern LIST_ENTRY IopLogListHead;
extern LIST_ENTRY IopTimerQueueHead;
extern KDPC IopTimerDpc;
extern KTIMER IopTimer;
extern KSPIN_LOCK CancelSpinLock;
extern KSPIN_LOCK IoVpbLock;
extern KSPIN_LOCK IoStatisticsLock;
extern KSPIN_LOCK DriverReinitListLock;
extern KSPIN_LOCK DriverBootReinitListLock;
extern KSPIN_LOCK IopLogListLock;
extern KSPIN_LOCK IopTimerLock;
extern PDEVICE_OBJECT IopErrorLogObject;
NPAGED_LOOKASIDE_LIST IoLargeIrpLookaside; NPAGED_LOOKASIDE_LIST IoLargeIrpLookaside;
NPAGED_LOOKASIDE_LIST IoSmallIrpLookaside; NPAGED_LOOKASIDE_LIST IoSmallIrpLookaside;
NPAGED_LOOKASIDE_LIST IopMdlLookasideList; NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
VOID INIT_FUNCTION IopInitLookasideLists(VOID);
#if defined (ALLOC_PRAGMA) #if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, IoInitCancelHandling)
#pragma alloc_text(INIT, IoInitShutdownNotification)
#pragma alloc_text(INIT, IopInitLookasideLists)
#pragma alloc_text(INIT, IoInitSystem) #pragma alloc_text(INIT, IoInitSystem)
#endif #endif
@ -66,22 +96,7 @@ VOID INIT_FUNCTION IopInitLookasideLists(VOID);
VOID VOID
INIT_FUNCTION INIT_FUNCTION
IoInitCancelHandling(VOID) NTAPI
{
extern KSPIN_LOCK CancelSpinLock;
KeInitializeSpinLock(&CancelSpinLock);
}
VOID
INIT_FUNCTION
IoInitShutdownNotification (VOID)
{
InitializeListHead(&ShutdownListHead);
KeInitializeSpinLock(&ShutdownListLock);
}
VOID
INIT_FUNCTION
IopInitLookasideLists(VOID) IopInitLookasideLists(VOID)
{ {
ULONG LargeIrpSize, SmallIrpSize, MdlSize; ULONG LargeIrpSize, SmallIrpSize, MdlSize;
@ -225,28 +240,15 @@ IopInitLookasideLists(VOID)
} }
Prcb->PPLookasideList[LookasideMdlList].P = &CurrentList->L; Prcb->PPLookasideList[LookasideMdlList].P = &CurrentList->L;
} }
DPRINT("Done allocation\n");
} }
BOOLEAN BOOLEAN
INIT_FUNCTION INIT_FUNCTION
NTAPI NTAPI
IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) IopCreateObjectTypes(VOID)
{ {
PDEVICE_NODE DeviceNode;
PDRIVER_OBJECT DriverObject;
LDR_DATA_TABLE_ENTRY ModuleObject;
NTSTATUS Status;
CHAR Buffer[256];
ANSI_STRING NtBootPath, RootString;
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
UNICODE_STRING Name; UNICODE_STRING Name;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirName;
UNICODE_STRING LinkName = RTL_CONSTANT_STRING(L"\\DosDevices");
HANDLE Handle;
/* Initialize default settings */ /* Initialize default settings */
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
@ -259,19 +261,28 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
/* Do the Adapter Type */ /* Do the Adapter Type */
RtlInitUnicodeString(&Name, L"Adapter"); RtlInitUnicodeString(&Name, L"Adapter");
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoAdapterObjectType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoAdapterObjectType))) return FALSE;
/* Do the Controller Type */ /* Do the Controller Type */
RtlInitUnicodeString(&Name, L"Controller"); RtlInitUnicodeString(&Name, L"Controller");
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CONTROLLER_OBJECT); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(CONTROLLER_OBJECT);
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoControllerObjectType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoControllerObjectType))) return FALSE;
/* Do the Device Type */ /* Do the Device Type. FIXME: Needs Delete Routine! */
RtlInitUnicodeString(&Name, L"Device"); RtlInitUnicodeString(&Name, L"Device");
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT);
ObjectTypeInitializer.ParseProcedure = IopParseDevice; ObjectTypeInitializer.ParseProcedure = IopParseDevice;
ObjectTypeInitializer.SecurityProcedure = IopSecurityFile; ObjectTypeInitializer.SecurityProcedure = IopSecurityFile;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDeviceObjectType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoDeviceObjectType))) return FALSE;
/* Initialize the Driver object type */ /* Initialize the Driver object type */
RtlInitUnicodeString(&Name, L"Driver"); RtlInitUnicodeString(&Name, L"Driver");
@ -279,7 +290,10 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver; ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver;
ObjectTypeInitializer.ParseProcedure = NULL; ObjectTypeInitializer.ParseProcedure = NULL;
ObjectTypeInitializer.SecurityProcedure = NULL; ObjectTypeInitializer.SecurityProcedure = NULL;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDriverObjectType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoDriverObjectType))) return FALSE;
/* Initialize the I/O Completion object type */ /* Initialize the I/O Completion object type */
RtlInitUnicodeString(&Name, L"IoCompletion"); RtlInitUnicodeString(&Name, L"IoCompletion");
@ -288,7 +302,10 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
ObjectTypeInitializer.InvalidAttributes |= OBJ_PERMANENT; ObjectTypeInitializer.InvalidAttributes |= OBJ_PERMANENT;
ObjectTypeInitializer.GenericMapping = IopCompletionMapping; ObjectTypeInitializer.GenericMapping = IopCompletionMapping;
ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion; ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoCompletionType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoCompletionType))) return FALSE;
/* Initialize the File object type */ /* Initialize the File object type */
RtlInitUnicodeString(&Name, L"File"); RtlInitUnicodeString(&Name, L"File");
@ -303,105 +320,188 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
ObjectTypeInitializer.QueryNameProcedure = IopQueryNameFile; ObjectTypeInitializer.QueryNameProcedure = IopQueryNameFile;
ObjectTypeInitializer.ParseProcedure = IopParseFile; ObjectTypeInitializer.ParseProcedure = IopParseFile;
ObjectTypeInitializer.UseDefaultObject = FALSE; ObjectTypeInitializer.UseDefaultObject = FALSE;
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoFileObjectType); if (!NT_SUCCESS(ObCreateObjectType(&Name,
&ObjectTypeInitializer,
NULL,
&IoFileObjectType))) return FALSE;
/* /* Success */
* Create the '\Driver' object directory return TRUE;
*/ }
BOOLEAN
INIT_FUNCTION
NTAPI
IopCreateRootDirectories()
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING DirName;
HANDLE Handle;
/* Create the '\Driver' object directory */
RtlInitUnicodeString(&DirName, L"\\Driver"); RtlInitUnicodeString(&DirName, L"\\Driver");
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&DirName, &DirName,
0, OBJ_PERMANENT,
NULL, NULL,
NULL); NULL);
ZwCreateDirectoryObject(&Handle, if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
0, DIRECTORY_ALL_ACCESS,
&ObjectAttributes); &ObjectAttributes))) return FALSE;
NtClose(Handle);
/* /* Create the '\FileSystem' object directory */
* Create the '\FileSystem' object directory RtlInitUnicodeString(&DirName, L"\\FileSystem");
*/
RtlInitUnicodeString(&DirName,
L"\\FileSystem");
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&DirName, &DirName,
0, OBJ_PERMANENT,
NULL, NULL,
NULL); NULL);
ZwCreateDirectoryObject(&Handle, if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
0, DIRECTORY_ALL_ACCESS,
&ObjectAttributes); &ObjectAttributes))) return FALSE;
NtClose(Handle);
/* /* Return success */
* Create the '\Device' directory return TRUE;
*/ }
RtlInitUnicodeString(&DirName,
L"\\Device"); BOOLEAN
INIT_FUNCTION
NTAPI
IopMarkBootPartition(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
OBJECT_ATTRIBUTES ObjectAttributes;
STRING DeviceString;
CHAR Buffer[256];
UNICODE_STRING DeviceName;
NTSTATUS Status;
HANDLE FileHandle;
IO_STATUS_BLOCK IoStatusBlock;
PFILE_OBJECT FileObject;
/* Build the ARC device name */
sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName);
RtlInitAnsiString(&DeviceString, Buffer);
Status = RtlAnsiStringToUnicodeString(&DeviceName, &DeviceString, TRUE);
if (!NT_SUCCESS(Status)) return FALSE;
/* Open it */
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
&DirName, &DeviceName,
0, OBJ_CASE_INSENSITIVE,
NULL, NULL,
NULL); NULL);
ZwCreateDirectoryObject(&Handle, Status = ZwOpenFile(&FileHandle,
0, FILE_READ_ATTRIBUTES,
&ObjectAttributes); &ObjectAttributes,
&IoStatusBlock,
0,
FILE_NON_DIRECTORY_FILE);
if (!NT_SUCCESS(Status))
{
/* Fail */
KeBugCheckEx(INACCESSIBLE_BOOT_DEVICE,
(ULONG_PTR)&DeviceName,
Status,
0,
0);
}
/* /* Get the DO */
* Create the '\??' directory Status = ObReferenceObjectByHandle(FileHandle,
*/ 0,
RtlInitUnicodeString(&DirName, IoFileObjectType,
L"\\??"); KernelMode,
InitializeObjectAttributes(&ObjectAttributes, (PVOID *)&FileObject,
&DirName, NULL);
0, if (!NT_SUCCESS(Status))
NULL, {
NULL); /* Fail */
ZwCreateDirectoryObject(&Handle, RtlFreeUnicodeString(&DeviceName);
0, return FALSE;
&ObjectAttributes); }
/* /* Mark it as the boot partition */
* Create the '\ArcName' directory FileObject->DeviceObject->Flags |= DO_SYSTEM_BOOT_PARTITION;
*/
RtlInitUnicodeString(&DirName,
L"\\ArcName");
InitializeObjectAttributes(&ObjectAttributes,
&DirName,
0,
NULL,
NULL);
ZwCreateDirectoryObject(&Handle,
0,
&ObjectAttributes);
/* /* Save a copy of the DO for the I/O Error Logger */
* Initialize remaining subsubsystem ObReferenceObject(FileObject->DeviceObject);
*/ IopErrorLogObject = FileObject->DeviceObject;
IopInitDriverImplementation();
IoInitCancelHandling(); /* Cleanup and return success */
IoInitFileSystemImplementation(); RtlFreeUnicodeString(&DeviceName);
IoInitVpbImplementation(); NtClose(FileHandle);
IoInitShutdownNotification(); ObDereferenceObject(FileObject);
IopInitPnpNotificationImplementation(); return TRUE;
IopInitErrorLog(); }
IopInitTimerImplementation();
BOOLEAN
INIT_FUNCTION
NTAPI
IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
LARGE_INTEGER ExpireTime;
PDEVICE_NODE DeviceNode;
PDRIVER_OBJECT DriverObject;
LDR_DATA_TABLE_ENTRY ModuleObject;
NTSTATUS Status;
CHAR Buffer[256];
ANSI_STRING NtBootPath, RootString;
/* Initialize empty NT Boot Path */
RtlInitEmptyAnsiString(&NtBootPath, Buffer, sizeof(Buffer));
/* Initialize the lookaside lists */
IopInitLookasideLists(); IopInitLookasideLists();
/* /* Initialize all locks and lists */
* Create link from '\DosDevices' to '\??' directory ExInitializeResource(&IopDatabaseResource);
*/ ExInitializeResource(&FileSystemListLock);
RtlInitUnicodeString(&DirName, ExInitializeResource(&IopSecurityResource);
L"\\??"); KeInitializeGuardedMutex(&FsChangeNotifyListLock);
IoCreateSymbolicLink(&LinkName, KeInitializeGuardedMutex(&PnpNotifyListLock);
&DirName); InitializeListHead(&IopDiskFsListHead);
InitializeListHead(&IopCdRomFsListHead);
InitializeListHead(&IopTapeFsListHead);
InitializeListHead(&IopNetworkFsListHead);
InitializeListHead(&DriverBootReinitListHead);
InitializeListHead(&DriverReinitListHead);
InitializeListHead(&PnpNotifyListHead);
InitializeListHead(&ShutdownListHead);
InitializeListHead(&FsChangeNotifyListHead);
InitializeListHead(&IopLogListHead);
KeInitializeSpinLock(&CancelSpinLock);
KeInitializeSpinLock(&IoVpbLock);
KeInitializeSpinLock(&IoStatisticsLock);
KeInitializeSpinLock(&DriverReinitListLock);
KeInitializeSpinLock(&DriverBootReinitListLock);
KeInitializeSpinLock(&ShutdownListLock);
KeInitializeSpinLock(&IopLogListLock);
/* Initialize Timer List Lock */
KeInitializeSpinLock(&IopTimerLock);
/* Initialize Timer List */
InitializeListHead(&IopTimerQueueHead);
/* Initialize the DPC/Timer which will call the other Timer Routines */
ExpireTime.QuadPart = -10000000;
KeInitializeDpc(&IopTimerDpc, IopTimerDispatch, NULL);
KeInitializeTimerEx(&IopTimer, SynchronizationTimer);
KeSetTimerEx(&IopTimer, ExpireTime, 1000, &IopTimerDpc);
/* Create Object Types */
if (!IopCreateObjectTypes()) return FALSE;
/* Create Object Directories */
if (!IopCreateRootDirectories()) return FALSE;
/* /*
* Initialize PnP manager * Initialize PnP manager
*/ */
PnpInit(); PnpInit();
RtlInitEmptyAnsiString(&NtBootPath, Buffer, sizeof(Buffer));
PnpInit2(); PnpInit2();
IoCreateDriverList(); IoCreateDriverList();
@ -466,6 +566,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
/* Create ARC names for boot devices */ /* Create ARC names for boot devices */
IopCreateArcNames(LoaderBlock); IopCreateArcNames(LoaderBlock);
/* Mark the system boot partition */
if (!IopMarkBootPartition(LoaderBlock)) return FALSE;
/* Read KDB Data */ /* Read KDB Data */
KdbInit(); KdbInit();

View file

@ -82,25 +82,6 @@ IopRemoveTimerFromTimerList(IN PIO_TIMER Timer)
KeReleaseSpinLock(&IopTimerLock, OldIrql); KeReleaseSpinLock(&IopTimerLock, OldIrql);
} }
VOID
FASTCALL
IopInitTimerImplementation(VOID)
{
LARGE_INTEGER ExpireTime;
/* Initialize Timer List Lock */
KeInitializeSpinLock(&IopTimerLock);
/* Initialize Timer List */
InitializeListHead(&IopTimerQueueHead);
/* Initialize the DPC/Timer which will call the other Timer Routines */
ExpireTime.QuadPart = -10000000;
KeInitializeDpc(&IopTimerDpc, IopTimerDispatch, NULL);
KeInitializeTimerEx(&IopTimer, SynchronizationTimer);
KeSetTimerEx(&IopTimer, ExpireTime, 1000, &IopTimerDpc);
}
/* PUBLIC FUNCTIONS **********************************************************/ /* PUBLIC FUNCTIONS **********************************************************/
/* /*

View file

@ -30,30 +30,6 @@ KSPIN_LOCK IoVpbLock;
/* PRIVATE FUNCTIONS *********************************************************/ /* PRIVATE FUNCTIONS *********************************************************/
VOID
INIT_FUNCTION
NTAPI
IoInitVpbImplementation(VOID)
{
/* Just initialize the VPB Lock */
KeInitializeSpinLock(&IoVpbLock);
}
VOID
INIT_FUNCTION
NTAPI
IoInitFileSystemImplementation(VOID)
{
/* Initialize the FS Lists and Locks */
InitializeListHead(&IopDiskFsListHead);
InitializeListHead(&IopNetworkFsListHead);
InitializeListHead(&IopCdRomFsListHead);
InitializeListHead(&IopTapeFsListHead);
ExInitializeResourceLite(&FileSystemListLock);
InitializeListHead(&FsChangeNotifyListHead);
KeInitializeGuardedMutex(&FsChangeNotifyListLock);
}
PVPB PVPB
NTAPI NTAPI
IopCheckVpbMounted(IN POPEN_PACKET OpenPacket, IopCheckVpbMounted(IN POPEN_PACKET OpenPacket,

View file

@ -31,8 +31,8 @@ typedef struct _PNP_NOTIFY_ENTRY
PDRIVER_NOTIFICATION_CALLBACK_ROUTINE PnpNotificationProc; PDRIVER_NOTIFICATION_CALLBACK_ROUTINE PnpNotificationProc;
} PNP_NOTIFY_ENTRY, *PPNP_NOTIFY_ENTRY; } PNP_NOTIFY_ENTRY, *PPNP_NOTIFY_ENTRY;
static KGUARDED_MUTEX PnpNotifyListLock; KGUARDED_MUTEX PnpNotifyListLock;
static LIST_ENTRY PnpNotifyListHead; LIST_ENTRY PnpNotifyListHead;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
@ -323,11 +323,4 @@ IopNotifyPlugPlayNotification(
ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY); ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY);
} }
VOID INIT_FUNCTION
IopInitPnpNotificationImplementation(VOID)
{
KeInitializeGuardedMutex(&PnpNotifyListLock);
InitializeListHead(&PnpNotifyListHead);
}
/* EOF */ /* EOF */

View file

@ -127,6 +127,8 @@ ObInit(VOID)
SECURITY_DESCRIPTOR SecurityDescriptor; SECURITY_DESCRIPTOR SecurityDescriptor;
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
OBP_LOOKUP_CONTEXT Context; OBP_LOOKUP_CONTEXT Context;
UNICODE_STRING LinkName = RTL_CONSTANT_STRING(L"\\DosDevices");
HANDLE Handle;
PKPRCB Prcb = KeGetCurrentPrcb(); PKPRCB Prcb = KeGetCurrentPrcb();
/* Check if this is actually Phase 1 initialization */ /* Check if this is actually Phase 1 initialization */
@ -287,6 +289,19 @@ ObPostPhase0:
/* Create 'symbolic link' object type */ /* Create 'symbolic link' object type */
ObInitSymbolicLinkImplementation(); ObInitSymbolicLinkImplementation();
/* Create the '\??' directory */
RtlInitUnicodeString(&Name, L"\\??");
InitializeObjectAttributes(&ObjectAttributes,
&Name,
0,
NULL,
NULL);
ZwCreateDirectoryObject(&Handle, 0, &ObjectAttributes);
/* Create link from '\DosDevices' to '\??' directory */
RtlInitUnicodeString(&Name, L"\\??");
IoCreateSymbolicLink(&LinkName, &Name);
/* FIXME: Hack Hack! */ /* FIXME: Hack Hack! */
ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm')); ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm'));
RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap)); RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap));