Author: sir_richard Date: Sun Apr 11 23:25:50 2010 New Revision: 46845
URL: http://svn.reactos.org/svn/reactos?rev=46845&view=rev Log: [NTOS]: Rename IopBusTypeGuidList to PnpBusTypeGuidList to match Windows 2003 PnP Namespace instead of Windows 2000. [NTOS]: Use PnpBusTypeGuidList->Lock instead of PnpBusTypeGuidListLock. [NTOS]: Implement PipAllocateDeviceNode for setting up device nodes and linking them to a PDO. Only used for Root PnP now. Main ABI change is that allocate in ReactOS right now includes "insert". These will be seperate in the new PnP ABI. [NTOS]: Implement IopInitializePnpServices to replace PnpInit. Mostly the same work is done, but using new PnP ABI. [NTOS]: Implement new helper: IopCreateRegistryKeyEx.
Modified: trunk/reactos/ntoskrnl/include/internal/io.h trunk/reactos/ntoskrnl/io/iomgr/iomgr.c trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
Modified: trunk/reactos/ntoskrnl/include/internal/io.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/io.h [iso-8859-1] Sun Apr 11 23:25:50 2010 @@ -517,8 +517,9 @@ IN PDRIVER_OBJECT DriverObject );
-VOID -PnpInit( +NTSTATUS +NTAPI +IopInitializePlugPlayServices( VOID );
@@ -557,6 +558,12 @@ IN PDEVICE_OBJECT *DeviceObject );
+PDEVICE_NODE +NTAPI +PipAllocateDeviceNode( + IN PDEVICE_OBJECT PhysicalDeviceObject +); + NTSTATUS IopCreateDeviceNode( IN PDEVICE_NODE ParentNode, @@ -644,14 +651,32 @@
NTSTATUS NTAPI -IopGetRegistryValue(IN HANDLE Handle, - IN PWSTR ValueName, - OUT PKEY_VALUE_FULL_INFORMATION *Information); - +IopGetRegistryValue( + IN HANDLE Handle, + IN PWSTR ValueName, + OUT PKEY_VALUE_FULL_INFORMATION *Information +); + +NTSTATUS +NTAPI +IopCreateRegistryKeyEx( + OUT PHANDLE Handle, + IN HANDLE BaseHandle OPTIONAL, + IN PUNICODE_STRING KeyName, + IN ACCESS_MASK DesiredAccess, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL +);
// // PnP Routines // +NTSTATUS +NTAPI +IopUpdateRootKey( + VOID +); + NTSTATUS NTAPI PiInitCacheGroupInformation( @@ -1138,6 +1163,7 @@ // extern POBJECT_TYPE IoCompletionType; extern PDEVICE_NODE IopRootDeviceNode; +extern KSPIN_LOCK IopDeviceTreeLock; extern ULONG IopTraceLevel; extern GENERAL_LOOKASIDE IopMdlLookasideList; extern GENERIC_MAPPING IopCompletionMapping; @@ -1147,6 +1173,8 @@ extern LIST_ENTRY IopErrorLogListHead; extern ULONG IopNumTriageDumpDataBlocks; extern PVOID IopTriageDumpDataBlocks[64]; +extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList; +extern PDRIVER_OBJECT IopRootDriverObject;
// // Inlined Functions
Modified: trunk/reactos/ntoskrnl/io/iomgr/iomgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iomgr.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/iomgr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/iomgr.c [iso-8859-1] Sun Apr 11 23:25:50 2010 @@ -488,10 +488,7 @@ if (!IopCreateRootDirectories()) return FALSE;
/* Initialize PnP manager */ - PnpInit(); - - /* Setup the group cache */ - if (!NT_SUCCESS(PiInitCacheGroupInformation())) return FALSE; + IopInitializePlugPlayServices();
/* Load boot start drivers */ IopInitializeBootDrivers();
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c [iso-8859-1] Sun Apr 11 23:25:50 2010 @@ -14,10 +14,33 @@
/* GLOBALS ********************************************************************/
+typedef struct _IOPNP_DEVICE_EXTENSION +{ + PWCHAR CompatibleIdList; + ULONG CompatibleIdListSize; +} IOPNP_DEVICE_EXTENSION, *PIOPNP_DEVICE_EXTENSION; + PUNICODE_STRING PiInitGroupOrderTable; ULONG PiInitGroupOrderTableCount; - +INTERFACE_TYPE PnpDefaultInterfaceType; + /* FUNCTIONS ******************************************************************/ + +INTERFACE_TYPE +NTAPI +IopDetermineDefaultInterfaceType(VOID) +{ + /* FIXME: ReactOS doesn't support MicroChannel yet */ + return Isa; +} + +NTSTATUS +NTAPI +IopInitializeArbiters(VOID) +{ + /* FIXME: TODO */ + return STATUS_SUCCESS; +}
NTSTATUS NTAPI @@ -330,4 +353,150 @@ return Status; }
+NTSTATUS +NTAPI +IopInitializePlugPlayServices(VOID) +{ + NTSTATUS Status; + ULONG Disposition; + HANDLE KeyHandle, EnumHandle, ParentHandle, TreeHandle; + UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET"); + PDEVICE_OBJECT Pdo; + + /* Initialize locks and such */ + KeInitializeSpinLock(&IopDeviceTreeLock); + + /* Get the default interface */ + PnpDefaultInterfaceType = IopDetermineDefaultInterfaceType(); + + /* Initialize arbiters */ + Status = IopInitializeArbiters(); + if (!NT_SUCCESS(Status)) return Status; + + /* Setup the group cache */ + Status = PiInitCacheGroupInformation(); + if (!NT_SUCCESS(Status)) return Status; + + /* Open the current control set */ + Status = IopOpenRegistryKeyEx(&KeyHandle, + NULL, + &KeyName, + KEY_ALL_ACCESS); + if (!NT_SUCCESS(Status)) return Status; + + /* Create the enum key */ + RtlInitUnicodeString(&KeyName, REGSTR_KEY_ENUM); + Status = IopCreateRegistryKeyEx(&EnumHandle, + KeyHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + &Disposition); + if (!NT_SUCCESS(Status)) return Status; + + /* Check if it's a new key */ + if (Disposition == REG_CREATED_NEW_KEY) + { + /* FIXME: DACLs */ + DPRINT1("Need to build DACL\n"); + } + + /* Create the root key */ + ParentHandle = EnumHandle; + RtlInitUnicodeString(&KeyName, REGSTR_KEY_ROOTENUM); + Status = IopCreateRegistryKeyEx(&EnumHandle, + ParentHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + &Disposition); + NtClose(ParentHandle); + if (!NT_SUCCESS(Status)) return Status; + NtClose(EnumHandle); + + /* Open the root key now */ + RtlInitUnicodeString(&KeyName, L"\REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\ENUM"); + Status = IopOpenRegistryKeyEx(&EnumHandle, + NULL, + &KeyName, + KEY_ALL_ACCESS); + if (NT_SUCCESS(Status)) + { + /* Create the root dev node */ + RtlInitUnicodeString(&KeyName, REGSTR_VAL_ROOT_DEVNODE); + Status = IopCreateRegistryKeyEx(&TreeHandle, + EnumHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL); + NtClose(EnumHandle); + if (NT_SUCCESS(Status)) NtClose(TreeHandle); + } + + /* Create the root driver */ + Status = IoCreateDriver(NULL, PnpRootDriverEntry); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDriverObject() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + /* Create the root PDO */ + Status = IoCreateDevice(IopRootDriverObject, + sizeof(IOPNP_DEVICE_EXTENSION), + NULL, + FILE_DEVICE_CONTROLLER, + 0, + FALSE, + &Pdo); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDevice() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + /* This is a bus enumerated device */ + Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; + + /* Create the root device node */ + IopRootDeviceNode = PipAllocateDeviceNode(Pdo); + + /* Set flags */ + IopRootDeviceNode->Flags |= DNF_STARTED + DNF_PROCESSED + DNF_ENUMERATED + + DNF_MADEUP + DNF_NO_RESOURCE_REQUIRED + + DNF_ADDED; + + /* Create instance path */ + RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, + REGSTR_VAL_ROOT_DEVNODE); + + /* Call the add device routine */ + IopRootDriverObject->DriverExtension->AddDevice(IopRootDriverObject, + IopRootDeviceNode->PhysicalDeviceObject); + + /* Initialize PnP-Event notification support */ + Status = IopInitPlugPlayEvents(); + if (!NT_SUCCESS(Status)) return Status; + + /* Report the device to the user-mode pnp manager */ + IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, + &IopRootDeviceNode->InstancePath); + + /* Initialize the Bus Type GUID List */ + PnpBusTypeGuidList = ExAllocatePool(PagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); + RtlZeroMemory(PnpBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); + ExInitializeFastMutex(&PnpBusTypeGuidList->Lock); + + /* Launch the firmware mapper */ + Status = IopUpdateRootKey(); + if (!NT_SUCCESS(Status)) return Status; + + /* Close the handle to the control set */ + NtClose(KeyHandle); + + /* We made it */ + return STATUS_SUCCESS; +} + /* EOF */
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] Sun Apr 11 23:25:50 2010 @@ -29,8 +29,7 @@ /* DATA **********************************************************************/
PDRIVER_OBJECT IopRootDriverObject; -FAST_MUTEX IopBusTypeGuidListLock; -PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList = NULL; +PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList = NULL;
#if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, PnpInit) @@ -340,14 +339,14 @@ PVOID NewList;
/* Acquire the lock */ - ExAcquireFastMutex(&IopBusTypeGuidListLock); + ExAcquireFastMutex(&PnpBusTypeGuidList->Lock);
/* Loop all entries */ - while (i < IopBusTypeGuidList->GuidCount) + while (i < PnpBusTypeGuidList->GuidCount) { /* Try to find a match */ if (RtlCompareMemory(BusTypeGuid, - &IopBusTypeGuidList->Guids[i], + &PnpBusTypeGuidList->Guids[i], sizeof(GUID)) == sizeof(GUID)) { /* Found it */ @@ -358,43 +357,43 @@ }
/* Check if we have to grow the list */ - if (IopBusTypeGuidList->GuidCount) + if (PnpBusTypeGuidList->GuidCount) { /* Calculate the new size */ NewSize = sizeof(IO_BUS_TYPE_GUID_LIST) + - (sizeof(GUID) * IopBusTypeGuidList->GuidCount); + (sizeof(GUID) * PnpBusTypeGuidList->GuidCount);
/* Allocate the new copy */ NewList = ExAllocatePool(PagedPool, NewSize);
if (!NewList) { /* Fail */ - ExFreePool(IopBusTypeGuidList); + ExFreePool(PnpBusTypeGuidList); goto Quickie; }
/* Now copy them, decrease the size too */ NewSize -= sizeof(GUID); - RtlCopyMemory(NewList, IopBusTypeGuidList, NewSize); + RtlCopyMemory(NewList, PnpBusTypeGuidList, NewSize);
/* Free the old list */ - ExFreePool(IopBusTypeGuidList); + ExFreePool(PnpBusTypeGuidList);
/* Use the new buffer */ - IopBusTypeGuidList = NewList; + PnpBusTypeGuidList = NewList; }
/* Copy the new GUID */ - RtlCopyMemory(&IopBusTypeGuidList->Guids[IopBusTypeGuidList->GuidCount], + RtlCopyMemory(&PnpBusTypeGuidList->Guids[PnpBusTypeGuidList->GuidCount], BusTypeGuid, sizeof(GUID));
/* The new entry is the index */ - FoundIndex = (USHORT)IopBusTypeGuidList->GuidCount; - IopBusTypeGuidList->GuidCount++; + FoundIndex = (USHORT)PnpBusTypeGuidList->GuidCount; + PnpBusTypeGuidList->GuidCount++;
Quickie: - ExReleaseFastMutex(&IopBusTypeGuidListLock); + ExReleaseFastMutex(&PnpBusTypeGuidList->Lock); return FoundIndex; }
@@ -1671,7 +1670,7 @@ { PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); }
*ResourceList = ExAllocatePool(PagedPool, Size); @@ -1821,8 +1820,8 @@ for (i = 0; i < DeviceNode->BootResources->Count; i++) { pPartialResourceList = &DeviceNode->BootResources->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); for (j = 0; j < pPartialResourceList->Count; j++) { if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) @@ -1865,8 +1864,8 @@ for (i = 0; i < DeviceNode->ResourceList->Count; i++) { pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); }
Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); @@ -3153,7 +3152,7 @@ BootResourcesLength = pValueInformation->DataLength; else BootResourcesLength = ParentBootResourcesLength - + pValueInformation->DataLength + + pValueInformation->DataLength - Header; BootResources = ExAllocatePool(PagedPool, BootResourcesLength); if (!BootResources) @@ -3585,7 +3584,8 @@ #endif }
-static NTSTATUS INIT_FUNCTION +NTSTATUS +NTAPI IopUpdateRootKey(VOID) { UNICODE_STRING EnumU = RTL_CONSTANT_STRING(L"\Registry\Machine\SYSTEM\CurrentControlSet\Enum"); @@ -3694,6 +3694,131 @@
NTSTATUS NTAPI +IopCreateRegistryKeyEx(OUT PHANDLE Handle, + IN HANDLE RootHandle OPTIONAL, + IN PUNICODE_STRING KeyName, + IN ACCESS_MASK DesiredAccess, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG KeyDisposition, RootHandleIndex = 0, i = 1, NestedCloseLevel = 0, Length; + HANDLE HandleArray[2]; + BOOLEAN Recursing = TRUE; + PWCHAR pp, p, p1; + UNICODE_STRING KeyString; + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + /* P1 is start, pp is end */ + p1 = KeyName->Buffer; + pp = (PVOID)((ULONG_PTR)p1 + KeyName->Length); + + /* Create the target key */ + InitializeObjectAttributes(&ObjectAttributes, + KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + RootHandle, + NULL); + Status = ZwCreateKey(&HandleArray[i], + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + CreateOptions, + &KeyDisposition); + + /* Now we check if this failed */ + if ((Status == STATUS_OBJECT_NAME_NOT_FOUND) && (RootHandle)) + { + /* Target key failed, so we'll need to create its parent. Setup array */ + HandleArray[0] = NULL; + HandleArray[1] = RootHandle; + + /* Keep recursing for each missing parent */ + while (Recursing) + { + /* And if we're deep enough, close the last handle */ + if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); + + /* We're setup to ping-pong between the two handle array entries */ + RootHandleIndex = i; + i = (i + 1) & 1; + + /* Clear the one we're attempting to open now */ + HandleArray[i] = NULL; + + /* Process the parent key name */ + for (p = p1; ((p < pp) && (*p != OBJ_NAME_PATH_SEPARATOR)); p++); + Length = (p - p1) * sizeof(WCHAR); + + /* Is there a parent name? */ + if (Length) + { + /* Build the unicode string for it */ + KeyString.Buffer = p1; + KeyString.Length = KeyString.MaximumLength = Length; + + /* Now try opening the parent */ + InitializeObjectAttributes(&ObjectAttributes, + &KeyString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + HandleArray[RootHandleIndex], + NULL); + Status = ZwCreateKey(&HandleArray[i], + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + CreateOptions, + &KeyDisposition); + if (NT_SUCCESS(Status)) + { + /* It worked, we have one more handle */ + NestedCloseLevel++; + } + else + { + /* Parent key creation failed, abandon loop */ + Recursing = FALSE; + continue; + } + } + else + { + /* We don't have a parent name, probably corrupted key name */ + Status = STATUS_INVALID_PARAMETER; + Recursing = FALSE; + continue; + } + + /* Now see if there's more parents to create */ + p1 = p + 1; + if ((p == pp) || (p1 == pp)) + { + /* We're done, hopefully successfully, so stop */ + Recursing = FALSE; + } + } + + /* Outer loop check for handle nesting that requires closing the top handle */ + if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); + } + + /* Check if we broke out of the loop due to success */ + if (NT_SUCCESS(Status)) + { + /* Return the target handle (we closed all the parent ones) and disposition */ + *Handle = HandleArray[i]; + if (Disposition) *Disposition = KeyDisposition; + } + + /* Return the success state */ + return Status; +} + +NTSTATUS +NTAPI IopGetRegistryValue(IN HANDLE Handle, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *Information) @@ -3737,95 +3862,6 @@ return STATUS_SUCCESS; }
-static NTSTATUS INIT_FUNCTION -NTAPI -PnpDriverInitializeEmpty(IN struct _DRIVER_OBJECT *DriverObject, IN PUNICODE_STRING RegistryPath) -{ - return STATUS_SUCCESS; -} - -VOID INIT_FUNCTION -PnpInit(VOID) -{ - PDEVICE_OBJECT Pdo; - NTSTATUS Status; - - DPRINT("PnpInit()\n"); - - KeInitializeSpinLock(&IopDeviceTreeLock); - ExInitializeFastMutex(&IopBusTypeGuidListLock); - - /* Initialize the Bus Type GUID List */ - IopBusTypeGuidList = ExAllocatePool(NonPagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); - if (!IopBusTypeGuidList) { - DPRINT1("ExAllocatePool() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); - } - - RtlZeroMemory(IopBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); - ExInitializeFastMutex(&IopBusTypeGuidList->Lock); - - /* Initialize PnP-Event notification support */ - Status = IopInitPlugPlayEvents(); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopInitPlugPlayEvents() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - /* - * Create root device node - */ - - Status = IopCreateDriver(NULL, PnpDriverInitializeEmpty, NULL, 0, 0, &IopRootDriverObject); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDriverObject() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - Status = IoCreateDevice(IopRootDriverObject, 0, NULL, FILE_DEVICE_CONTROLLER, - 0, FALSE, &Pdo); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDevice() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - Status = IopCreateDeviceNode(NULL, Pdo, NULL, &IopRootDeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Insufficient resources\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - if (!RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, - L"HTREE\ROOT\0")) - { - DPRINT1("Failed to create the instance path!\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); - } - - /* Report the device to the user-mode pnp manager */ - IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, - &IopRootDeviceNode->InstancePath); - - IopRootDeviceNode->PhysicalDeviceObject->Flags |= DO_BUS_ENUMERATED_DEVICE; - PnpRootDriverEntry(IopRootDriverObject, NULL); - IopRootDeviceNode->PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - IopRootDriverObject->DriverExtension->AddDevice( - IopRootDriverObject, - IopRootDeviceNode->PhysicalDeviceObject); - - /* Move information about devices detected by Freeloader to SYSTEM\CurrentControlSet\Root\ */ - Status = IopUpdateRootKey(); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopUpdateRootKey() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } -} - RTL_GENERIC_COMPARE_RESULTS NTAPI PiCompareInstancePath(IN PRTL_AVL_TABLE Table, @@ -3911,6 +3947,49 @@ KeBugCheck(UNEXPECTED_INITIALIZATION_CALL); return FALSE; } +} + +LONG IopNumberDeviceNodes; + +PDEVICE_NODE +NTAPI +PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject) +{ + PDEVICE_NODE DeviceNode; + PAGED_CODE(); + + /* Allocate it */ + DeviceNode = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), 'donD'); + if (!DeviceNode) return DeviceNode; + + /* Statistics */ + InterlockedIncrement(&IopNumberDeviceNodes); + + /* Set it up */ + RtlZeroMemory(DeviceNode, sizeof(DEVICE_NODE)); + DeviceNode->InterfaceType = InterfaceTypeUndefined; + DeviceNode->BusNumber = -1; + DeviceNode->ChildInterfaceType = InterfaceTypeUndefined; + DeviceNode->ChildBusNumber = -1; + DeviceNode->ChildBusTypeIndex = -1; +// KeInitializeEvent(&DeviceNode->EnumerationMutex, SynchronizationEvent, TRUE); + InitializeListHead(&DeviceNode->DeviceArbiterList); + InitializeListHead(&DeviceNode->DeviceTranslatorList); + InitializeListHead(&DeviceNode->TargetDeviceNotify); + InitializeListHead(&DeviceNode->DockInfo.ListEntry); + InitializeListHead(&DeviceNode->PendedSetInterfaceState); + + /* Check if there is a PDO */ + if (PhysicalDeviceObject) + { + /* Link it and remove the init flag */ + DeviceNode->PhysicalDeviceObject = PhysicalDeviceObject; + ((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode = DeviceNode; + PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + } + + /* Return the node */ + return DeviceNode; }
/* PUBLIC FUNCTIONS **********************************************************/ @@ -3953,7 +4032,7 @@ case DevicePropertyBusTypeGuid: /* Sanity check */ if ((DeviceNode->ChildBusTypeIndex != 0xFFFF) && - (DeviceNode->ChildBusTypeIndex < IopBusTypeGuidList->GuidCount)) + (DeviceNode->ChildBusTypeIndex < PnpBusTypeGuidList->GuidCount)) { /* Return the GUID */ *ResultLength = sizeof(GUID); @@ -3966,7 +4045,7 @@
/* Copy the GUID */ RtlCopyMemory(PropertyBuffer, - &(IopBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), + &(PnpBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), sizeof(GUID)); return STATUS_SUCCESS; }
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] Sun Apr 11 23:25:50 2010 @@ -1185,6 +1185,8 @@ { DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath);
+ IopRootDriverObject = DriverObject; + DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;