- Create device instance key for root device node.
- Add DeviceReference value for each non-root device node.
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
Modified: trunk/reactos/ntoskrnl/io/iomgr.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
_____
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
--- trunk/reactos/ntoskrnl/include/internal/io.h 2005-06-04
21:35:07 UTC (rev 15795)
+++ trunk/reactos/ntoskrnl/include/internal/io.h 2005-06-04
22:55:58 UTC (rev 15796)
@@ -16,8 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: include/internal/io.h
@@ -341,6 +340,9 @@
PnpInit(VOID);
VOID
+PnpInit2(VOID);
+
+VOID
IopInitDriverImplementation(VOID);
VOID
_____
Modified: trunk/reactos/ntoskrnl/io/iomgr.c
--- trunk/reactos/ntoskrnl/io/iomgr.c 2005-06-04 21:35:07 UTC (rev
15795)
+++ trunk/reactos/ntoskrnl/io/iomgr.c 2005-06-04 22:55:58 UTC (rev
15796)
@@ -40,7 +40,7 @@
NPAGED_LOOKASIDE_LIST IoSmallIrpLookaside;
/* INIT FUNCTIONS
************************************************************/
-
+
VOID
INIT_FUNCTION
IoInitCancelHandling(VOID)
@@ -64,11 +64,11 @@
ULONG i;
PKPRCB Prcb;
PNPAGED_LOOKASIDE_LIST CurrentList = NULL;
-
+
/* Calculate the sizes */
LargeIrpSize = sizeof(IRP) + (8 * sizeof(IO_STACK_LOCATION));
SmallIrpSize = sizeof(IRP) + sizeof(IO_STACK_LOCATION);
-
+
/* Initialize the Lookaside List for Large IRPs */
ExInitializeNPagedLookasideList(&IoLargeIrpLookaside,
NULL,
@@ -77,7 +77,7 @@
LargeIrpSize,
IO_LARGEIRP,
0);
-
+
/* Initialize the Lookaside List for Small IRPs */
ExInitializeNPagedLookasideList(&IoSmallIrpLookaside,
NULL,
@@ -95,14 +95,14 @@
sizeof(IO_COMPLETION_PACKET),
IOC_TAG1,
0);
-
+
/* Now allocate the per-processor lists */
for (i = 0; i < KeNumberProcessors; i++)
{
/* Get the PRCB for this CPU */
Prcb = ((PKPCR)(KPCR_BASE + i * PAGE_SIZE))->Prcb;
DPRINT("Setting up lookaside for CPU: %x, PRCB: %p\n", i,
Prcb);
-
+
/* Set the Large IRP List */
Prcb->PPLookasideList[LookasideLargeIrpList].L =
&IoLargeIrpLookaside.L;
CurrentList = ExAllocatePoolWithTag(NonPagedPool,
@@ -124,7 +124,7 @@
CurrentList = &IoLargeIrpLookaside;
}
Prcb->PPLookasideList[LookasideLargeIrpList].P =
&CurrentList->L;
-
+
/* Set the Small IRP List */
Prcb->PPLookasideList[LookasideSmallIrpList].L =
&IoSmallIrpLookaside.L;
CurrentList = ExAllocatePoolWithTag(NonPagedPool,
@@ -146,7 +146,7 @@
CurrentList = &IoSmallIrpLookaside;
}
Prcb->PPLookasideList[LookasideSmallIrpList].P =
&CurrentList->L;
-
+
/* Set the I/O Completion List */
Prcb->PPLookasideList[LookasideCompletionList].L =
&IoCompletionPacketLookaside.L;
CurrentList = ExAllocatePoolWithTag(NonPagedPool,
@@ -169,7 +169,7 @@
}
Prcb->PPLookasideList[LookasideCompletionList].P =
&CurrentList->L;
}
-
+
DPRINT("Done allocation\n");
}
@@ -187,7 +187,7 @@
IopInitDriverImplementation();
DPRINT("Creating Device Object Type\n");
-
+
/* Initialize the Driver object type */
RtlZeroMemory(&ObjectTypeInitializer,
sizeof(ObjectTypeInitializer));
RtlInitUnicodeString(&Name, L"Device");
@@ -198,16 +198,16 @@
ObjectTypeInitializer.UseDefaultObject = TRUE;
ObjectTypeInitializer.GenericMapping = IopFileMapping;
ObpCreateTypeObject(&ObjectTypeInitializer, &Name,
&IoDeviceObjectType);
-
+
/* Do the Adapter Type */
RtlInitUnicodeString(&Name, L"Adapter");
ObpCreateTypeObject(&ObjectTypeInitializer, &Name,
&IoAdapterObjectType);
-
+
/* Do the Controller Type */
RtlInitUnicodeString(&Name, L"Controller");
ObjectTypeInitializer.DefaultNonPagedPoolCharge =
sizeof(CONTROLLER_OBJECT);
- ObpCreateTypeObject(&ObjectTypeInitializer, &Name,
&IoControllerObjectType);
-
+ ObpCreateTypeObject(&ObjectTypeInitializer, &Name,
&IoControllerObjectType);
+
/* Initialize the File object type */
RtlInitUnicodeString(&Name, L"File");
ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
@@ -315,7 +315,7 @@
*/
PnpInit();
}
-
+
VOID
INIT_FUNCTION
IoInit2(BOOLEAN BootLog)
@@ -325,6 +325,8 @@
MODULE_OBJECT ModuleObject;
NTSTATUS Status;
+ PnpInit2();
+
IoCreateDriverList();
KeInitializeSpinLock (&IoStatisticsLock);
_____
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
--- trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-06-04 21:35:07 UTC (rev
15795)
+++ trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-06-04 22:55:58 UTC (rev
15796)
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/io/pnpmgr.c
@@ -893,6 +892,39 @@
ZwClose(LogConfKey);
}
+ if (DeviceNode->PhysicalDeviceObject != NULL)
+ {
+ /* Create the 'Control' key */
+ RtlInitUnicodeString(&KeyName,
+ L"Control");
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
+ InstanceKey,
+ NULL);
+ Status = ZwCreateKey(&LogConfKey,
+ KEY_ALL_ACCESS,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ REG_OPTION_VOLATILE,
+ NULL);
+ if (NT_SUCCESS(Status))
+ {
+ ULONG Reference = (ULONG)DeviceNode->PhysicalDeviceObject;
+ RtlInitUnicodeString(&KeyName,
+ L"DeviceReference");
+ Status = ZwSetValueKey(LogConfKey,
+ &KeyName,
+ 0,
+ REG_DWORD,
+ &Reference,
+ sizeof(PVOID));
+
+ ZwClose(LogConfKey);
+ }
+ }
+
DPRINT("IopSetDeviceInstanceData() done\n");
return STATUS_SUCCESS;
@@ -909,17 +941,17 @@
ULONG NumberOfResources = 0;
ULONG i;
NTSTATUS Status;
-
+
/* Fill DeviceNode->ResourceList and
DeviceNode->ResourceListTranslated;
* by using DeviceNode->ResourceRequirements */
-
+
if (!DeviceNode->ResourceRequirements
|| DeviceNode->ResourceRequirements->AlternativeLists == 0)
{
DeviceNode->ResourceList = DeviceNode->ResourceListTranslated =
NULL;
return STATUS_SUCCESS;
}
-
+
/* FIXME: that's here that PnP arbiter should go */
/* Actually, simply use resource list #0 as assigned resource list
*/
ResourceList = &DeviceNode->ResourceRequirements->List[0];
@@ -928,45 +960,45 @@
Status = STATUS_REVISION_MISMATCH;
goto ByeBye;
}
-
- DeviceNode->ResourceList = ExAllocatePool(PagedPool,
+
+ DeviceNode->ResourceList = ExAllocatePool(PagedPool,
sizeof(CM_RESOURCE_LIST) + ResourceList->Count *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
if (!DeviceNode->ResourceList)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto ByeBye;
}
-
- DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool,
+
+ DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool,
sizeof(CM_RESOURCE_LIST) + ResourceList->Count *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
if (!DeviceNode->ResourceListTranslated)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto ByeBye;
}
-
+
DeviceNode->ResourceList->Count = 1;
DeviceNode->ResourceList->List[0].InterfaceType =
DeviceNode->ResourceRequirements->InterfaceType;
DeviceNode->ResourceList->List[0].BusNumber =
DeviceNode->ResourceRequirements->BusNumber;
DeviceNode->ResourceList->List[0].PartialResourceList.Version = 1;
DeviceNode->ResourceList->List[0].PartialResourceList.Revision = 1;
-
+
DeviceNode->ResourceListTranslated->Count = 1;
DeviceNode->ResourceListTranslated->List[0].InterfaceType =
DeviceNode->ResourceRequirements->InterfaceType;
DeviceNode->ResourceListTranslated->List[0].BusNumber =
DeviceNode->ResourceRequirements->BusNumber;
DeviceNode->ResourceListTranslated->List[0].PartialResourceList.Version
= 1;
DeviceNode->ResourceListTranslated->List[0].PartialResourceList.Revision
= 1;
-
+
for (i = 0; i < ResourceList->Count; i++)
{
ResourceDescriptor = &ResourceList->Descriptors[i];
-
+
if (ResourceDescriptor->Option == 0 || ResourceDescriptor->Option
== IO_RESOURCE_PREFERRED)
{
DescriptorRaw =
&DeviceNode->ResourceList->List[0].PartialResourceList.PartialDescriptor
s[NumberOfResources];
DescriptorTranslated =
&DeviceNode->ResourceListTranslated->List[0].PartialResourceList.Partial
Descriptors[NumberOfResources];
NumberOfResources++;
-
+
/* Copy ResourceDescriptor to DescriptorRaw and
DescriptorTranslated */
DescriptorRaw->Type = DescriptorTranslated->Type =
ResourceDescriptor->Type;
DescriptorRaw->ShareDisposition =
DescriptorTranslated->ShareDisposition =
ResourceDescriptor->ShareDisposition;
@@ -1001,7 +1033,7 @@
DescriptorRaw->u.Interrupt.Vector = 9;
else
DescriptorRaw->u.Interrupt.Vector =
ResourceDescriptor->u.Interrupt.MinimumVector;
-
+
DescriptorTranslated->u.Interrupt.Vector =
HalGetInterruptVector(
DeviceNode->ResourceRequirements->InterfaceType,
DeviceNode->ResourceRequirements->BusNumber,
@@ -1069,12 +1101,12 @@
NumberOfResources--;
}
}
-
+
}
-
+
DeviceNode->ResourceList->List[0].PartialResourceList.Count =
NumberOfResources;
DeviceNode->ResourceListTranslated->List[0].PartialResourceList.Count =
NumberOfResources;
-
+
return STATUS_SUCCESS;
ByeBye:
@@ -1818,7 +1850,8 @@
DeviceNode,
IopActionInitBootServices,
DeviceNode);
- } else
+ }
+ else
{
IopInitDeviceTreeTraverseContext(
&Context,
@@ -1981,6 +2014,35 @@
}
+static NTSTATUS INIT_FUNCTION
+IopSetRootDeviceInstanceData(PDEVICE_NODE DeviceNode)
+{
+ PWSTR KeyBuffer;
+ HANDLE InstanceKey = NULL;
+ NTSTATUS Status;
+
+ /* Create registry key for the instance id, if it doesn't exist yet
*/
+ KeyBuffer = ExAllocatePool(PagedPool,
+ (49 * sizeof(WCHAR)) +
DeviceNode->InstancePath.Length);
+ wcscpy(KeyBuffer,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\");
+ wcscat(KeyBuffer, DeviceNode->InstancePath.Buffer);
+ Status = IopCreateDeviceKeyPath(KeyBuffer,
+ &InstanceKey);
+ ExFreePool(KeyBuffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create the instance key! (Status %lx)\n",
Status);
+ return Status;
+ }
+
+ /* FIXME: Set 'ConfigFlags' value */
+
+ ZwClose(InstanceKey);
+
+ return Status;
+}
+
+
VOID INIT_FUNCTION
PnpInit(VOID)
{
@@ -2026,7 +2088,7 @@
}
if (!IopCreateUnicodeString(&IopRootDeviceNode->InstancePath,
- L"HTREE\\Root\\0",
+ L"HTREE\\ROOT\\0",
PagedPool))
{
CPRINT("Failed to create the instance path!\n");
@@ -2044,4 +2106,19 @@
IopRootDeviceNode->PhysicalDeviceObject);
}
+
+VOID INIT_FUNCTION
+PnpInit2(VOID)
+{
+ NTSTATUS Status;
+
+ /* Set root device instance data */
+ Status = IopSetRootDeviceInstanceData(IopRootDeviceNode);
+ if (!NT_SUCCESS(Status))
+ {
+ CPRINT("Failed to set instance data\n");
+ KEBUGCHECKEX(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0);
+ }
+}
+
/* EOF */