mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 15:26:02 +00:00
- 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:
parent
6dc593f684
commit
07b9937721
7 changed files with 244 additions and 201 deletions
|
@ -41,26 +41,8 @@ LdrProcessModule(
|
|||
PLDR_DATA_TABLE_ENTRY *ModuleObject
|
||||
);
|
||||
|
||||
#if defined (ALLOC_PRAGMA)
|
||||
#pragma alloc_text(INIT, IopInitDriverImplementation)
|
||||
#endif
|
||||
|
||||
|
||||
/* PRIVATE FUNCTIONS **********************************************************/
|
||||
|
||||
VOID
|
||||
INIT_FUNCTION
|
||||
IopInitDriverImplementation(VOID)
|
||||
{
|
||||
InitializeListHead(&DriverReinitListHead);
|
||||
KeInitializeSpinLock(&DriverReinitListLock);
|
||||
DriverReinitTailEntry = NULL;
|
||||
|
||||
InitializeListHead(&DriverBootReinitListHead);
|
||||
KeInitializeSpinLock(&DriverBootReinitListLock);
|
||||
DriverBootReinitTailEntry = NULL;
|
||||
}
|
||||
|
||||
NTSTATUS STDCALL
|
||||
IopInvalidDeviceRequest(
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
|
|
|
@ -31,16 +31,9 @@ BOOLEAN IopLogPortConnected;
|
|||
HANDLE IopLogPort;
|
||||
WORK_QUEUE_ITEM IopErrorLogWorkItem;
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
PDEVICE_OBJECT IopErrorLogObject;
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
IopInitErrorLog(VOID)
|
||||
{
|
||||
/* Initialize the locks and list head */
|
||||
KeInitializeSpinLock(&IopLogListLock);
|
||||
InitializeListHead(&IopLogListHead);
|
||||
}
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
|
|
|
@ -23,6 +23,14 @@ IoSynchronousInvalidateDeviceRelations(
|
|||
IN DEVICE_RELATION_TYPE Type
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
IopTimerDispatch(
|
||||
IN PKDPC Dpc,
|
||||
IN PVOID DeferredContext,
|
||||
IN PVOID SystemArgument1,
|
||||
IN PVOID SystemArgument2
|
||||
);
|
||||
|
||||
/* DATA ********************************************************************/
|
||||
|
||||
|
@ -49,16 +57,38 @@ extern LIST_ENTRY ShutdownListHead;
|
|||
extern KSPIN_LOCK ShutdownListLock;
|
||||
extern NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside;
|
||||
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 IoSmallIrpLookaside;
|
||||
NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
|
||||
|
||||
VOID INIT_FUNCTION IopInitLookasideLists(VOID);
|
||||
|
||||
#if defined (ALLOC_PRAGMA)
|
||||
#pragma alloc_text(INIT, IoInitCancelHandling)
|
||||
#pragma alloc_text(INIT, IoInitShutdownNotification)
|
||||
#pragma alloc_text(INIT, IopInitLookasideLists)
|
||||
#pragma alloc_text(INIT, IoInitSystem)
|
||||
#endif
|
||||
|
||||
|
@ -66,22 +96,7 @@ VOID INIT_FUNCTION IopInitLookasideLists(VOID);
|
|||
|
||||
VOID
|
||||
INIT_FUNCTION
|
||||
IoInitCancelHandling(VOID)
|
||||
{
|
||||
extern KSPIN_LOCK CancelSpinLock;
|
||||
KeInitializeSpinLock(&CancelSpinLock);
|
||||
}
|
||||
|
||||
VOID
|
||||
INIT_FUNCTION
|
||||
IoInitShutdownNotification (VOID)
|
||||
{
|
||||
InitializeListHead(&ShutdownListHead);
|
||||
KeInitializeSpinLock(&ShutdownListLock);
|
||||
}
|
||||
|
||||
VOID
|
||||
INIT_FUNCTION
|
||||
NTAPI
|
||||
IopInitLookasideLists(VOID)
|
||||
{
|
||||
ULONG LargeIrpSize, SmallIrpSize, MdlSize;
|
||||
|
@ -225,28 +240,15 @@ IopInitLookasideLists(VOID)
|
|||
}
|
||||
Prcb->PPLookasideList[LookasideMdlList].P = &CurrentList->L;
|
||||
}
|
||||
|
||||
DPRINT("Done allocation\n");
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
INIT_FUNCTION
|
||||
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;
|
||||
UNICODE_STRING Name;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING DirName;
|
||||
UNICODE_STRING LinkName = RTL_CONSTANT_STRING(L"\\DosDevices");
|
||||
HANDLE Handle;
|
||||
|
||||
/* Initialize default settings */
|
||||
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
|
||||
|
@ -259,19 +261,28 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
|
||||
/* Do the Adapter Type */
|
||||
RtlInitUnicodeString(&Name, L"Adapter");
|
||||
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoAdapterObjectType);
|
||||
if (!NT_SUCCESS(ObCreateObjectType(&Name,
|
||||
&ObjectTypeInitializer,
|
||||
NULL,
|
||||
&IoAdapterObjectType))) return FALSE;
|
||||
|
||||
/* Do the Controller Type */
|
||||
RtlInitUnicodeString(&Name, L"Controller");
|
||||
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");
|
||||
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(DEVICE_OBJECT);
|
||||
ObjectTypeInitializer.ParseProcedure = IopParseDevice;
|
||||
ObjectTypeInitializer.SecurityProcedure = IopSecurityFile;
|
||||
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoDeviceObjectType);
|
||||
if (!NT_SUCCESS(ObCreateObjectType(&Name,
|
||||
&ObjectTypeInitializer,
|
||||
NULL,
|
||||
&IoDeviceObjectType))) return FALSE;
|
||||
|
||||
/* Initialize the Driver object type */
|
||||
RtlInitUnicodeString(&Name, L"Driver");
|
||||
|
@ -279,7 +290,10 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
ObjectTypeInitializer.DeleteProcedure = IopDeleteDriver;
|
||||
ObjectTypeInitializer.ParseProcedure = 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 */
|
||||
RtlInitUnicodeString(&Name, L"IoCompletion");
|
||||
|
@ -288,7 +302,10 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
ObjectTypeInitializer.InvalidAttributes |= OBJ_PERMANENT;
|
||||
ObjectTypeInitializer.GenericMapping = IopCompletionMapping;
|
||||
ObjectTypeInitializer.DeleteProcedure = IopDeleteIoCompletion;
|
||||
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoCompletionType);
|
||||
if (!NT_SUCCESS(ObCreateObjectType(&Name,
|
||||
&ObjectTypeInitializer,
|
||||
NULL,
|
||||
&IoCompletionType))) return FALSE;
|
||||
|
||||
/* Initialize the File object type */
|
||||
RtlInitUnicodeString(&Name, L"File");
|
||||
|
@ -303,105 +320,188 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
ObjectTypeInitializer.QueryNameProcedure = IopQueryNameFile;
|
||||
ObjectTypeInitializer.ParseProcedure = IopParseFile;
|
||||
ObjectTypeInitializer.UseDefaultObject = FALSE;
|
||||
ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &IoFileObjectType);
|
||||
if (!NT_SUCCESS(ObCreateObjectType(&Name,
|
||||
&ObjectTypeInitializer,
|
||||
NULL,
|
||||
&IoFileObjectType))) return FALSE;
|
||||
|
||||
/*
|
||||
* Create the '\Driver' object directory
|
||||
*/
|
||||
/* Success */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
INIT_FUNCTION
|
||||
NTAPI
|
||||
IopCreateRootDirectories()
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING DirName;
|
||||
HANDLE Handle;
|
||||
|
||||
/* Create the '\Driver' object directory */
|
||||
RtlInitUnicodeString(&DirName, L"\\Driver");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&DirName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
ZwCreateDirectoryObject(&Handle,
|
||||
0,
|
||||
&ObjectAttributes);
|
||||
&DirName,
|
||||
OBJ_PERMANENT,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes))) return FALSE;
|
||||
NtClose(Handle);
|
||||
|
||||
/*
|
||||
* Create the '\FileSystem' object directory
|
||||
*/
|
||||
RtlInitUnicodeString(&DirName,
|
||||
L"\\FileSystem");
|
||||
/* Create the '\FileSystem' object directory */
|
||||
RtlInitUnicodeString(&DirName, L"\\FileSystem");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&DirName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
ZwCreateDirectoryObject(&Handle,
|
||||
0,
|
||||
&ObjectAttributes);
|
||||
&DirName,
|
||||
OBJ_PERMANENT,
|
||||
NULL,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(NtCreateDirectoryObject(&Handle,
|
||||
DIRECTORY_ALL_ACCESS,
|
||||
&ObjectAttributes))) return FALSE;
|
||||
NtClose(Handle);
|
||||
|
||||
/*
|
||||
* Create the '\Device' directory
|
||||
*/
|
||||
RtlInitUnicodeString(&DirName,
|
||||
L"\\Device");
|
||||
/* Return success */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
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,
|
||||
&DirName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
ZwCreateDirectoryObject(&Handle,
|
||||
0,
|
||||
&ObjectAttributes);
|
||||
&DeviceName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
NULL,
|
||||
NULL);
|
||||
Status = ZwOpenFile(&FileHandle,
|
||||
FILE_READ_ATTRIBUTES,
|
||||
&ObjectAttributes,
|
||||
&IoStatusBlock,
|
||||
0,
|
||||
FILE_NON_DIRECTORY_FILE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
KeBugCheckEx(INACCESSIBLE_BOOT_DEVICE,
|
||||
(ULONG_PTR)&DeviceName,
|
||||
Status,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the '\??' directory
|
||||
*/
|
||||
RtlInitUnicodeString(&DirName,
|
||||
L"\\??");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&DirName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
ZwCreateDirectoryObject(&Handle,
|
||||
0,
|
||||
&ObjectAttributes);
|
||||
/* Get the DO */
|
||||
Status = ObReferenceObjectByHandle(FileHandle,
|
||||
0,
|
||||
IoFileObjectType,
|
||||
KernelMode,
|
||||
(PVOID *)&FileObject,
|
||||
NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
RtlFreeUnicodeString(&DeviceName);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create the '\ArcName' directory
|
||||
*/
|
||||
RtlInitUnicodeString(&DirName,
|
||||
L"\\ArcName");
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&DirName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
ZwCreateDirectoryObject(&Handle,
|
||||
0,
|
||||
&ObjectAttributes);
|
||||
/* Mark it as the boot partition */
|
||||
FileObject->DeviceObject->Flags |= DO_SYSTEM_BOOT_PARTITION;
|
||||
|
||||
/*
|
||||
* Initialize remaining subsubsystem
|
||||
*/
|
||||
IopInitDriverImplementation();
|
||||
IoInitCancelHandling();
|
||||
IoInitFileSystemImplementation();
|
||||
IoInitVpbImplementation();
|
||||
IoInitShutdownNotification();
|
||||
IopInitPnpNotificationImplementation();
|
||||
IopInitErrorLog();
|
||||
IopInitTimerImplementation();
|
||||
/* Save a copy of the DO for the I/O Error Logger */
|
||||
ObReferenceObject(FileObject->DeviceObject);
|
||||
IopErrorLogObject = FileObject->DeviceObject;
|
||||
|
||||
/* Cleanup and return success */
|
||||
RtlFreeUnicodeString(&DeviceName);
|
||||
NtClose(FileHandle);
|
||||
ObDereferenceObject(FileObject);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
/*
|
||||
* Create link from '\DosDevices' to '\??' directory
|
||||
*/
|
||||
RtlInitUnicodeString(&DirName,
|
||||
L"\\??");
|
||||
IoCreateSymbolicLink(&LinkName,
|
||||
&DirName);
|
||||
/* Initialize all locks and lists */
|
||||
ExInitializeResource(&IopDatabaseResource);
|
||||
ExInitializeResource(&FileSystemListLock);
|
||||
ExInitializeResource(&IopSecurityResource);
|
||||
KeInitializeGuardedMutex(&FsChangeNotifyListLock);
|
||||
KeInitializeGuardedMutex(&PnpNotifyListLock);
|
||||
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
|
||||
*/
|
||||
PnpInit();
|
||||
|
||||
RtlInitEmptyAnsiString(&NtBootPath, Buffer, sizeof(Buffer));
|
||||
|
||||
PnpInit2();
|
||||
|
||||
IoCreateDriverList();
|
||||
|
@ -466,6 +566,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|||
/* Create ARC names for boot devices */
|
||||
IopCreateArcNames(LoaderBlock);
|
||||
|
||||
/* Mark the system boot partition */
|
||||
if (!IopMarkBootPartition(LoaderBlock)) return FALSE;
|
||||
|
||||
/* Read KDB Data */
|
||||
KdbInit();
|
||||
|
||||
|
|
|
@ -82,25 +82,6 @@ IopRemoveTimerFromTimerList(IN PIO_TIMER Timer)
|
|||
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 **********************************************************/
|
||||
|
||||
/*
|
||||
|
|
|
@ -30,30 +30,6 @@ KSPIN_LOCK IoVpbLock;
|
|||
|
||||
/* 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
|
||||
NTAPI
|
||||
IopCheckVpbMounted(IN POPEN_PACKET OpenPacket,
|
||||
|
|
|
@ -31,8 +31,8 @@ typedef struct _PNP_NOTIFY_ENTRY
|
|||
PDRIVER_NOTIFICATION_CALLBACK_ROUTINE PnpNotificationProc;
|
||||
} PNP_NOTIFY_ENTRY, *PPNP_NOTIFY_ENTRY;
|
||||
|
||||
static KGUARDED_MUTEX PnpNotifyListLock;
|
||||
static LIST_ENTRY PnpNotifyListHead;
|
||||
KGUARDED_MUTEX PnpNotifyListLock;
|
||||
LIST_ENTRY PnpNotifyListHead;
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
|
@ -323,11 +323,4 @@ IopNotifyPlugPlayNotification(
|
|||
ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY);
|
||||
}
|
||||
|
||||
VOID INIT_FUNCTION
|
||||
IopInitPnpNotificationImplementation(VOID)
|
||||
{
|
||||
KeInitializeGuardedMutex(&PnpNotifyListLock);
|
||||
InitializeListHead(&PnpNotifyListHead);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -127,6 +127,8 @@ ObInit(VOID)
|
|||
SECURITY_DESCRIPTOR SecurityDescriptor;
|
||||
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
|
||||
OBP_LOOKUP_CONTEXT Context;
|
||||
UNICODE_STRING LinkName = RTL_CONSTANT_STRING(L"\\DosDevices");
|
||||
HANDLE Handle;
|
||||
PKPRCB Prcb = KeGetCurrentPrcb();
|
||||
|
||||
/* Check if this is actually Phase 1 initialization */
|
||||
|
@ -287,6 +289,19 @@ ObPostPhase0:
|
|||
/* Create 'symbolic link' object type */
|
||||
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! */
|
||||
ObSystemDeviceMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(*ObSystemDeviceMap), TAG('O', 'b', 'D', 'm'));
|
||||
RtlZeroMemory(ObSystemDeviceMap, sizeof(*ObSystemDeviceMap));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue