mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:52:59 +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
|
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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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 **********************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue