Author: tfaber Date: Wed Mar 1 19:07:13 2017 New Revision: 74016
URL: http://svn.reactos.org/svn/reactos?rev=74016&view=rev Log: [NTOS:FORMATTING] - Fix spacing in IopActionInterrogateDeviceStack. No code changes.
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
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] Wed Mar 1 19:07:13 2017 @@ -1868,357 +1868,352 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, PVOID Context) { - IO_STATUS_BLOCK IoStatusBlock; - PDEVICE_NODE ParentDeviceNode; - WCHAR InstancePath[MAX_PATH]; - IO_STACK_LOCATION Stack; - NTSTATUS Status; - ULONG RequiredLength; - LCID LocaleId; - HANDLE InstanceKey = NULL; - UNICODE_STRING ValueName; - UNICODE_STRING ParentIdPrefix = { 0, 0, NULL }; - UNICODE_STRING InstancePathU; - DEVICE_CAPABILITIES DeviceCapabilities; - PDEVICE_OBJECT OldDeviceObject; - - DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context); - DPRINT("PDO 0x%p\n", DeviceNode->PhysicalDeviceObject); - - ParentDeviceNode = (PDEVICE_NODE)Context; - - /* - * We are called for the parent too, but we don't need to do special - * handling for this node - */ - - if (DeviceNode == ParentDeviceNode) - { - DPRINT("Success\n"); - return STATUS_SUCCESS; - } - - /* - * Make sure this device node is a direct child of the parent device node - * that is given as an argument - */ - - if (DeviceNode->Parent != ParentDeviceNode) - { - DPRINT("Skipping 2+ level child\n"); - return STATUS_SUCCESS; - } - - /* Skip processing if it was already completed before */ - if (DeviceNode->Flags & DNF_PROCESSED) - { - /* Nothing to do */ - return STATUS_SUCCESS; - } - - /* Get Locale ID */ - Status = ZwQueryDefaultLocale(FALSE, &LocaleId); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwQueryDefaultLocale() failed with status 0x%lx\n", Status); - return Status; - } - - /* - * FIXME: For critical errors, cleanup and disable device, but always - * return STATUS_SUCCESS. - */ - - DPRINT("Sending IRP_MN_QUERY_ID.BusQueryDeviceID to device stack\n"); - - Stack.Parameters.QueryId.IdType = BusQueryDeviceID; - Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_ID, - &Stack); - if (NT_SUCCESS(Status)) - { - /* Copy the device id string */ - wcscpy(InstancePath, (PWSTR)IoStatusBlock.Information); - - /* - * FIXME: Check for valid characters, if there is invalid characters - * then bugcheck. - */ - } - else - { - DPRINT1("IopInitiatePnpIrp() failed (Status %x)\n", Status); - - /* We have to return success otherwise we abort the traverse operation */ - return STATUS_SUCCESS; - } - - DPRINT("Sending IRP_MN_QUERY_CAPABILITIES to device stack (after enumeration)\n"); - - Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCapabilities); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopInitiatePnpIrp() failed (Status 0x%08lx)\n", Status); - - /* We have to return success otherwise we abort the traverse operation */ - return STATUS_SUCCESS; - } - - /* This bit is only check after enumeration */ - if (DeviceCapabilities.HardwareDisabled) - { - /* FIXME: Cleanup device */ - DeviceNode->Flags |= DNF_DISABLED; - return STATUS_SUCCESS; - } - else - DeviceNode->Flags &= ~DNF_DISABLED; - - if (!DeviceCapabilities.UniqueID) - { - /* Device has not a unique ID. We need to prepend parent bus unique identifier */ - DPRINT("Instance ID is not unique\n"); - Status = IopGetParentIdPrefix(DeviceNode, &ParentIdPrefix); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopGetParentIdPrefix() failed (Status 0x%08lx)\n", Status); - - /* We have to return success otherwise we abort the traverse operation */ - return STATUS_SUCCESS; - } - } - - DPRINT("Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n"); - - Stack.Parameters.QueryId.IdType = BusQueryInstanceID; - Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_ID, - &Stack); - if (NT_SUCCESS(Status)) - { - /* Append the instance id string */ - wcscat(InstancePath, L"\"); - if (ParentIdPrefix.Length > 0) - { - /* Add information from parent bus device to InstancePath */ - wcscat(InstancePath, ParentIdPrefix.Buffer); - if (IoStatusBlock.Information && *(PWSTR)IoStatusBlock.Information) - wcscat(InstancePath, L"&"); - } - if (IoStatusBlock.Information) - wcscat(InstancePath, (PWSTR)IoStatusBlock.Information); - - /* - * FIXME: Check for valid characters, if there is invalid characters - * then bugcheck - */ - } - else - { - DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status); - } - RtlFreeUnicodeString(&ParentIdPrefix); - - if (!RtlCreateUnicodeString(&InstancePathU, InstancePath)) - { - DPRINT("No resources\n"); - /* FIXME: Cleanup and disable device */ - } - - /* Verify that this is not a duplicate */ - OldDeviceObject = IopGetDeviceObjectFromDeviceInstance(&InstancePathU); - if (OldDeviceObject != NULL) - { - PDEVICE_NODE OldDeviceNode = IopGetDeviceNode(OldDeviceObject); - - DPRINT1("Duplicate device instance '%wZ'\n", &InstancePathU); - DPRINT1("Current instance parent: '%wZ'\n", &DeviceNode->Parent->InstancePath); - DPRINT1("Old instance parent: '%wZ'\n", &OldDeviceNode->Parent->InstancePath); - - KeBugCheckEx(PNP_DETECTED_FATAL_ERROR, - 0x01, - (ULONG_PTR)DeviceNode->PhysicalDeviceObject, - (ULONG_PTR)OldDeviceObject, - 0); - } - - DeviceNode->InstancePath = InstancePathU; - - DPRINT("InstancePath is %S\n", DeviceNode->InstancePath.Buffer); - - /* - * Create registry key for the instance id, if it doesn't exist yet - */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create the instance key! (Status %lx)\n", Status); - - /* We have to return success otherwise we abort the traverse operation */ - return STATUS_SUCCESS; - } - - IopQueryHardwareIds(DeviceNode, InstanceKey); - - IopQueryCompatibleIds(DeviceNode, InstanceKey); - - DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n"); - - Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextDescription; - Stack.Parameters.QueryDeviceText.LocaleId = LocaleId; - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_DEVICE_TEXT, - &Stack); - /* This key is mandatory, so even if the Irp fails, we still write it */ - RtlInitUnicodeString(&ValueName, L"DeviceDesc"); - if (ZwQueryValueKey(InstanceKey, &ValueName, KeyValueBasicInformation, NULL, 0, &RequiredLength) == STATUS_OBJECT_NAME_NOT_FOUND) - { - if (NT_SUCCESS(Status) && - IoStatusBlock.Information && - (*(PWSTR)IoStatusBlock.Information != 0)) - { - /* This key is overriden when a driver is installed. Don't write the - * new description if another one already exists */ - Status = ZwSetValueKey(InstanceKey, - &ValueName, - 0, - REG_SZ, - (PVOID)IoStatusBlock.Information, - ((ULONG)wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR)); - } - else - { - UNICODE_STRING DeviceDesc = RTL_CONSTANT_STRING(L"Unknown device"); - DPRINT("Driver didn't return DeviceDesc (Status 0x%08lx), so place unknown device there\n", Status); - - Status = ZwSetValueKey(InstanceKey, - &ValueName, - 0, - REG_SZ, - DeviceDesc.Buffer, - DeviceDesc.MaximumLength); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwSetValueKey() failed (Status 0x%lx)\n", Status); - } - - } - } - - DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation to device stack\n"); - - Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextLocationInformation; - Stack.Parameters.QueryDeviceText.LocaleId = LocaleId; - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_DEVICE_TEXT, - &Stack); - if (NT_SUCCESS(Status) && IoStatusBlock.Information) - { - DPRINT("LocationInformation: %S\n", (PWSTR)IoStatusBlock.Information); - RtlInitUnicodeString(&ValueName, L"LocationInformation"); - Status = ZwSetValueKey(InstanceKey, - &ValueName, - 0, - REG_SZ, - (PVOID)IoStatusBlock.Information, - ((ULONG)wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR)); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status); - } - } - else - { - DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); - } - - DPRINT("Sending IRP_MN_QUERY_BUS_INFORMATION to device stack\n"); - - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_BUS_INFORMATION, - NULL); - if (NT_SUCCESS(Status) && IoStatusBlock.Information) - { - PPNP_BUS_INFORMATION BusInformation = - (PPNP_BUS_INFORMATION)IoStatusBlock.Information; - - DeviceNode->ChildBusNumber = BusInformation->BusNumber; - DeviceNode->ChildInterfaceType = BusInformation->LegacyBusType; - DeviceNode->ChildBusTypeIndex = IopGetBusTypeGuidIndex(&BusInformation->BusTypeGuid); - ExFreePool(BusInformation); - } - else - { - DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); - - DeviceNode->ChildBusNumber = 0xFFFFFFF0; - DeviceNode->ChildInterfaceType = InterfaceTypeUndefined; - DeviceNode->ChildBusTypeIndex = -1; - } - - DPRINT("Sending IRP_MN_QUERY_RESOURCES to device stack\n"); - - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_RESOURCES, - NULL); - if (NT_SUCCESS(Status) && IoStatusBlock.Information) - { - DeviceNode->BootResources = - (PCM_RESOURCE_LIST)IoStatusBlock.Information; - IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); - } - else - { - DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); - DeviceNode->BootResources = NULL; - } - - DPRINT("Sending IRP_MN_QUERY_RESOURCE_REQUIREMENTS to device stack\n"); - - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_QUERY_RESOURCE_REQUIREMENTS, - NULL); - if (NT_SUCCESS(Status)) - { - DeviceNode->ResourceRequirements = - (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - } - else - { - DPRINT("IopInitiatePnpIrp() failed (Status %08lx)\n", Status); - DeviceNode->ResourceRequirements = NULL; - } - - if (InstanceKey != NULL) - { - IopSetDeviceInstanceData(InstanceKey, DeviceNode); - } - - ZwClose(InstanceKey); - - IopDeviceNodeSetFlag(DeviceNode, DNF_PROCESSED); - - if (!IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER)) - { - /* Report the device to the user-mode pnp manager */ - IopQueueTargetDeviceEvent(&GUID_DEVICE_ENUMERATED, - &DeviceNode->InstancePath); - } - - return STATUS_SUCCESS; + IO_STATUS_BLOCK IoStatusBlock; + PDEVICE_NODE ParentDeviceNode; + WCHAR InstancePath[MAX_PATH]; + IO_STACK_LOCATION Stack; + NTSTATUS Status; + ULONG RequiredLength; + LCID LocaleId; + HANDLE InstanceKey = NULL; + UNICODE_STRING ValueName; + UNICODE_STRING ParentIdPrefix = { 0, 0, NULL }; + UNICODE_STRING InstancePathU; + DEVICE_CAPABILITIES DeviceCapabilities; + PDEVICE_OBJECT OldDeviceObject; + + DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context); + DPRINT("PDO 0x%p\n", DeviceNode->PhysicalDeviceObject); + + ParentDeviceNode = (PDEVICE_NODE)Context; + + /* + * We are called for the parent too, but we don't need to do special + * handling for this node + */ + if (DeviceNode == ParentDeviceNode) + { + DPRINT("Success\n"); + return STATUS_SUCCESS; + } + + /* + * Make sure this device node is a direct child of the parent device node + * that is given as an argument + */ + if (DeviceNode->Parent != ParentDeviceNode) + { + DPRINT("Skipping 2+ level child\n"); + return STATUS_SUCCESS; + } + + /* Skip processing if it was already completed before */ + if (DeviceNode->Flags & DNF_PROCESSED) + { + /* Nothing to do */ + return STATUS_SUCCESS; + } + + /* Get Locale ID */ + Status = ZwQueryDefaultLocale(FALSE, &LocaleId); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwQueryDefaultLocale() failed with status 0x%lx\n", Status); + return Status; + } + + /* + * FIXME: For critical errors, cleanup and disable device, but always + * return STATUS_SUCCESS. + */ + + DPRINT("Sending IRP_MN_QUERY_ID.BusQueryDeviceID to device stack\n"); + + Stack.Parameters.QueryId.IdType = BusQueryDeviceID; + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_ID, + &Stack); + if (NT_SUCCESS(Status)) + { + /* Copy the device id string */ + wcscpy(InstancePath, (PWSTR)IoStatusBlock.Information); + + /* + * FIXME: Check for valid characters, if there is invalid characters + * then bugcheck. + */ + } + else + { + DPRINT1("IopInitiatePnpIrp() failed (Status %x)\n", Status); + + /* We have to return success otherwise we abort the traverse operation */ + return STATUS_SUCCESS; + } + + DPRINT("Sending IRP_MN_QUERY_CAPABILITIES to device stack (after enumeration)\n"); + + Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCapabilities); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopInitiatePnpIrp() failed (Status 0x%08lx)\n", Status); + + /* We have to return success otherwise we abort the traverse operation */ + return STATUS_SUCCESS; + } + + /* This bit is only check after enumeration */ + if (DeviceCapabilities.HardwareDisabled) + { + /* FIXME: Cleanup device */ + DeviceNode->Flags |= DNF_DISABLED; + return STATUS_SUCCESS; + } + else + { + DeviceNode->Flags &= ~DNF_DISABLED; + } + + if (!DeviceCapabilities.UniqueID) + { + /* Device has not a unique ID. We need to prepend parent bus unique identifier */ + DPRINT("Instance ID is not unique\n"); + Status = IopGetParentIdPrefix(DeviceNode, &ParentIdPrefix); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopGetParentIdPrefix() failed (Status 0x%08lx)\n", Status); + + /* We have to return success otherwise we abort the traverse operation */ + return STATUS_SUCCESS; + } + } + + DPRINT("Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n"); + + Stack.Parameters.QueryId.IdType = BusQueryInstanceID; + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_ID, + &Stack); + if (NT_SUCCESS(Status)) + { + /* Append the instance id string */ + wcscat(InstancePath, L"\"); + if (ParentIdPrefix.Length > 0) + { + /* Add information from parent bus device to InstancePath */ + wcscat(InstancePath, ParentIdPrefix.Buffer); + if (IoStatusBlock.Information && *(PWSTR)IoStatusBlock.Information) + { + wcscat(InstancePath, L"&"); + } + } + if (IoStatusBlock.Information) + { + wcscat(InstancePath, (PWSTR)IoStatusBlock.Information); + } + + /* + * FIXME: Check for valid characters, if there is invalid characters + * then bugcheck + */ + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status); + } + RtlFreeUnicodeString(&ParentIdPrefix); + + if (!RtlCreateUnicodeString(&InstancePathU, InstancePath)) + { + DPRINT("No resources\n"); + /* FIXME: Cleanup and disable device */ + } + + /* Verify that this is not a duplicate */ + OldDeviceObject = IopGetDeviceObjectFromDeviceInstance(&InstancePathU); + if (OldDeviceObject != NULL) + { + PDEVICE_NODE OldDeviceNode = IopGetDeviceNode(OldDeviceObject); + + DPRINT1("Duplicate device instance '%wZ'\n", &InstancePathU); + DPRINT1("Current instance parent: '%wZ'\n", &DeviceNode->Parent->InstancePath); + DPRINT1("Old instance parent: '%wZ'\n", &OldDeviceNode->Parent->InstancePath); + + KeBugCheckEx(PNP_DETECTED_FATAL_ERROR, + 0x01, + (ULONG_PTR)DeviceNode->PhysicalDeviceObject, + (ULONG_PTR)OldDeviceObject, + 0); + } + + DeviceNode->InstancePath = InstancePathU; + + DPRINT("InstancePath is %S\n", DeviceNode->InstancePath.Buffer); + + /* + * Create registry key for the instance id, if it doesn't exist yet + */ + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create the instance key! (Status %lx)\n", Status); + + /* We have to return success otherwise we abort the traverse operation */ + return STATUS_SUCCESS; + } + + IopQueryHardwareIds(DeviceNode, InstanceKey); + + IopQueryCompatibleIds(DeviceNode, InstanceKey); + + DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n"); + + Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextDescription; + Stack.Parameters.QueryDeviceText.LocaleId = LocaleId; + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_DEVICE_TEXT, + &Stack); + /* This key is mandatory, so even if the Irp fails, we still write it */ + RtlInitUnicodeString(&ValueName, L"DeviceDesc"); + if (ZwQueryValueKey(InstanceKey, &ValueName, KeyValueBasicInformation, NULL, 0, &RequiredLength) == STATUS_OBJECT_NAME_NOT_FOUND) + { + if (NT_SUCCESS(Status) && + IoStatusBlock.Information && + (*(PWSTR)IoStatusBlock.Information != 0)) + { + /* This key is overriden when a driver is installed. Don't write the + * new description if another one already exists */ + Status = ZwSetValueKey(InstanceKey, + &ValueName, + 0, + REG_SZ, + (PVOID)IoStatusBlock.Information, + ((ULONG)wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR)); + } + else + { + UNICODE_STRING DeviceDesc = RTL_CONSTANT_STRING(L"Unknown device"); + DPRINT("Driver didn't return DeviceDesc (Status 0x%08lx), so place unknown device there\n", Status); + + Status = ZwSetValueKey(InstanceKey, + &ValueName, + 0, + REG_SZ, + DeviceDesc.Buffer, + DeviceDesc.MaximumLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwSetValueKey() failed (Status 0x%lx)\n", Status); + } + + } + } + + DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation to device stack\n"); + + Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextLocationInformation; + Stack.Parameters.QueryDeviceText.LocaleId = LocaleId; + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_DEVICE_TEXT, + &Stack); + if (NT_SUCCESS(Status) && IoStatusBlock.Information) + { + DPRINT("LocationInformation: %S\n", (PWSTR)IoStatusBlock.Information); + RtlInitUnicodeString(&ValueName, L"LocationInformation"); + Status = ZwSetValueKey(InstanceKey, + &ValueName, + 0, + REG_SZ, + (PVOID)IoStatusBlock.Information, + ((ULONG)wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwSetValueKey() failed (Status %lx)\n", Status); + } + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); + } + + DPRINT("Sending IRP_MN_QUERY_BUS_INFORMATION to device stack\n"); + + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_BUS_INFORMATION, + NULL); + if (NT_SUCCESS(Status) && IoStatusBlock.Information) + { + PPNP_BUS_INFORMATION BusInformation = (PPNP_BUS_INFORMATION)IoStatusBlock.Information; + + DeviceNode->ChildBusNumber = BusInformation->BusNumber; + DeviceNode->ChildInterfaceType = BusInformation->LegacyBusType; + DeviceNode->ChildBusTypeIndex = IopGetBusTypeGuidIndex(&BusInformation->BusTypeGuid); + ExFreePool(BusInformation); + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); + + DeviceNode->ChildBusNumber = 0xFFFFFFF0; + DeviceNode->ChildInterfaceType = InterfaceTypeUndefined; + DeviceNode->ChildBusTypeIndex = -1; + } + + DPRINT("Sending IRP_MN_QUERY_RESOURCES to device stack\n"); + + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_RESOURCES, + NULL); + if (NT_SUCCESS(Status) && IoStatusBlock.Information) + { + DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information; + IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); + DeviceNode->BootResources = NULL; + } + + DPRINT("Sending IRP_MN_QUERY_RESOURCE_REQUIREMENTS to device stack\n"); + + Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_RESOURCE_REQUIREMENTS, + NULL); + if (NT_SUCCESS(Status)) + { + DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + } + else + { + DPRINT("IopInitiatePnpIrp() failed (Status %08lx)\n", Status); + DeviceNode->ResourceRequirements = NULL; + } + + if (InstanceKey != NULL) + { + IopSetDeviceInstanceData(InstanceKey, DeviceNode); + } + + ZwClose(InstanceKey); + + IopDeviceNodeSetFlag(DeviceNode, DNF_PROCESSED); + + if (!IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER)) + { + /* Report the device to the user-mode pnp manager */ + IopQueueTargetDeviceEvent(&GUID_DEVICE_ENUMERATED, + &DeviceNode->InstancePath); + } + + return STATUS_SUCCESS; }
static