[NTOS:FORMATTING]

- Fix spacing in IopActionInterrogateDeviceStack. No code changes.

svn path=/trunk/; revision=74016
This commit is contained in:
Thomas Faber 2017-03-01 19:07:13 +00:00
parent 3238412b08
commit b6a16efc88

View file

@ -1868,357 +1868,352 @@ NTSTATUS
IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
PVOID Context) PVOID Context)
{ {
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
PDEVICE_NODE ParentDeviceNode; PDEVICE_NODE ParentDeviceNode;
WCHAR InstancePath[MAX_PATH]; WCHAR InstancePath[MAX_PATH];
IO_STACK_LOCATION Stack; IO_STACK_LOCATION Stack;
NTSTATUS Status; NTSTATUS Status;
ULONG RequiredLength; ULONG RequiredLength;
LCID LocaleId; LCID LocaleId;
HANDLE InstanceKey = NULL; HANDLE InstanceKey = NULL;
UNICODE_STRING ValueName; UNICODE_STRING ValueName;
UNICODE_STRING ParentIdPrefix = { 0, 0, NULL }; UNICODE_STRING ParentIdPrefix = { 0, 0, NULL };
UNICODE_STRING InstancePathU; UNICODE_STRING InstancePathU;
DEVICE_CAPABILITIES DeviceCapabilities; DEVICE_CAPABILITIES DeviceCapabilities;
PDEVICE_OBJECT OldDeviceObject; PDEVICE_OBJECT OldDeviceObject;
DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context); DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context);
DPRINT("PDO 0x%p\n", DeviceNode->PhysicalDeviceObject); DPRINT("PDO 0x%p\n", DeviceNode->PhysicalDeviceObject);
ParentDeviceNode = (PDEVICE_NODE)Context; ParentDeviceNode = (PDEVICE_NODE)Context;
/* /*
* We are called for the parent too, but we don't need to do special * We are called for the parent too, but we don't need to do special
* handling for this node * handling for this node
*/ */
if (DeviceNode == ParentDeviceNode)
{
DPRINT("Success\n");
return STATUS_SUCCESS;
}
if (DeviceNode == ParentDeviceNode) /*
{ * Make sure this device node is a direct child of the parent device node
DPRINT("Success\n"); * that is given as an argument
return STATUS_SUCCESS; */
} if (DeviceNode->Parent != ParentDeviceNode)
{
DPRINT("Skipping 2+ level child\n");
return STATUS_SUCCESS;
}
/* /* Skip processing if it was already completed before */
* Make sure this device node is a direct child of the parent device node if (DeviceNode->Flags & DNF_PROCESSED)
* that is given as an argument {
*/ /* Nothing to do */
return STATUS_SUCCESS;
}
if (DeviceNode->Parent != ParentDeviceNode) /* Get Locale ID */
{ Status = ZwQueryDefaultLocale(FALSE, &LocaleId);
DPRINT("Skipping 2+ level child\n"); if (!NT_SUCCESS(Status))
return STATUS_SUCCESS; {
} DPRINT1("ZwQueryDefaultLocale() failed with status 0x%lx\n", Status);
return Status;
}
/* Skip processing if it was already completed before */ /*
if (DeviceNode->Flags & DNF_PROCESSED) * FIXME: For critical errors, cleanup and disable device, but always
{ * return STATUS_SUCCESS.
/* Nothing to do */ */
return STATUS_SUCCESS;
}
/* Get Locale ID */ DPRINT("Sending IRP_MN_QUERY_ID.BusQueryDeviceID to device stack\n");
Status = ZwQueryDefaultLocale(FALSE, &LocaleId);
if (!NT_SUCCESS(Status))
{
DPRINT1("ZwQueryDefaultLocale() failed with status 0x%lx\n", Status);
return Status;
}
/* Stack.Parameters.QueryId.IdType = BusQueryDeviceID;
* FIXME: For critical errors, cleanup and disable device, but always Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject,
* return STATUS_SUCCESS. &IoStatusBlock,
*/ IRP_MN_QUERY_ID,
&Stack);
if (NT_SUCCESS(Status))
{
/* Copy the device id string */
wcscpy(InstancePath, (PWSTR)IoStatusBlock.Information);
DPRINT("Sending IRP_MN_QUERY_ID.BusQueryDeviceID to device stack\n"); /*
* FIXME: Check for valid characters, if there is invalid characters
* then bugcheck.
*/
}
else
{
DPRINT1("IopInitiatePnpIrp() failed (Status %x)\n", Status);
Stack.Parameters.QueryId.IdType = BusQueryDeviceID; /* We have to return success otherwise we abort the traverse operation */
Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, return STATUS_SUCCESS;
&IoStatusBlock, }
IRP_MN_QUERY_ID,
&Stack);
if (NT_SUCCESS(Status))
{
/* Copy the device id string */
wcscpy(InstancePath, (PWSTR)IoStatusBlock.Information);
/* DPRINT("Sending IRP_MN_QUERY_CAPABILITIES to device stack (after enumeration)\n");
* 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 */ Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCapabilities);
return STATUS_SUCCESS; if (!NT_SUCCESS(Status))
} {
DPRINT1("IopInitiatePnpIrp() failed (Status 0x%08lx)\n", Status);
DPRINT("Sending IRP_MN_QUERY_CAPABILITIES to device stack (after enumeration)\n"); /* We have to return success otherwise we abort the traverse operation */
return STATUS_SUCCESS;
}
Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCapabilities); /* This bit is only check after enumeration */
if (!NT_SUCCESS(Status)) if (DeviceCapabilities.HardwareDisabled)
{ {
DPRINT1("IopInitiatePnpIrp() failed (Status 0x%08lx)\n", Status); /* FIXME: Cleanup device */
DeviceNode->Flags |= DNF_DISABLED;
return STATUS_SUCCESS;
}
else
{
DeviceNode->Flags &= ~DNF_DISABLED;
}
/* We have to return success otherwise we abort the traverse operation */ if (!DeviceCapabilities.UniqueID)
return STATUS_SUCCESS; {
} /* 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);
/* This bit is only check after enumeration */ /* We have to return success otherwise we abort the traverse operation */
if (DeviceCapabilities.HardwareDisabled) return STATUS_SUCCESS;
{ }
/* FIXME: Cleanup device */ }
DeviceNode->Flags |= DNF_DISABLED;
return STATUS_SUCCESS;
}
else
DeviceNode->Flags &= ~DNF_DISABLED;
if (!DeviceCapabilities.UniqueID) DPRINT("Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n");
{
/* 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 */ Stack.Parameters.QueryId.IdType = BusQueryInstanceID;
return STATUS_SUCCESS; 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);
}
DPRINT("Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n"); /*
* FIXME: Check for valid characters, if there is invalid characters
* then bugcheck
*/
}
else
{
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
}
RtlFreeUnicodeString(&ParentIdPrefix);
Stack.Parameters.QueryId.IdType = BusQueryInstanceID; if (!RtlCreateUnicodeString(&InstancePathU, InstancePath))
Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject, {
&IoStatusBlock, DPRINT("No resources\n");
IRP_MN_QUERY_ID, /* FIXME: Cleanup and disable device */
&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);
/* /* Verify that this is not a duplicate */
* FIXME: Check for valid characters, if there is invalid characters OldDeviceObject = IopGetDeviceObjectFromDeviceInstance(&InstancePathU);
* then bugcheck if (OldDeviceObject != NULL)
*/ {
} PDEVICE_NODE OldDeviceNode = IopGetDeviceNode(OldDeviceObject);
else
{
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
}
RtlFreeUnicodeString(&ParentIdPrefix);
if (!RtlCreateUnicodeString(&InstancePathU, InstancePath)) DPRINT1("Duplicate device instance '%wZ'\n", &InstancePathU);
{ DPRINT1("Current instance parent: '%wZ'\n", &DeviceNode->Parent->InstancePath);
DPRINT("No resources\n"); DPRINT1("Old instance parent: '%wZ'\n", &OldDeviceNode->Parent->InstancePath);
/* FIXME: Cleanup and disable device */
}
/* Verify that this is not a duplicate */ KeBugCheckEx(PNP_DETECTED_FATAL_ERROR,
OldDeviceObject = IopGetDeviceObjectFromDeviceInstance(&InstancePathU); 0x01,
if (OldDeviceObject != NULL) (ULONG_PTR)DeviceNode->PhysicalDeviceObject,
{ (ULONG_PTR)OldDeviceObject,
PDEVICE_NODE OldDeviceNode = IopGetDeviceNode(OldDeviceObject); 0);
}
DPRINT1("Duplicate device instance '%wZ'\n", &InstancePathU); DeviceNode->InstancePath = InstancePathU;
DPRINT1("Current instance parent: '%wZ'\n", &DeviceNode->Parent->InstancePath);
DPRINT1("Old instance parent: '%wZ'\n", &OldDeviceNode->Parent->InstancePath);
KeBugCheckEx(PNP_DETECTED_FATAL_ERROR, DPRINT("InstancePath is %S\n", DeviceNode->InstancePath.Buffer);
0x01,
(ULONG_PTR)DeviceNode->PhysicalDeviceObject,
(ULONG_PTR)OldDeviceObject,
0);
}
DeviceNode->InstancePath = InstancePathU; /*
* 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);
DPRINT("InstancePath is %S\n", DeviceNode->InstancePath.Buffer); /* We have to return success otherwise we abort the traverse operation */
return STATUS_SUCCESS;
}
/* IopQueryHardwareIds(DeviceNode, InstanceKey);
* 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 */ IopQueryCompatibleIds(DeviceNode, InstanceKey);
return STATUS_SUCCESS;
}
IopQueryHardwareIds(DeviceNode, InstanceKey); DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n");
IopQueryCompatibleIds(DeviceNode, InstanceKey); 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);
DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n"); Status = ZwSetValueKey(InstanceKey,
&ValueName,
0,
REG_SZ,
DeviceDesc.Buffer,
DeviceDesc.MaximumLength);
if (!NT_SUCCESS(Status))
{
DPRINT1("ZwSetValueKey() failed (Status 0x%lx)\n", Status);
}
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, DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation to device stack\n");
&ValueName,
0,
REG_SZ,
DeviceDesc.Buffer,
DeviceDesc.MaximumLength);
if (!NT_SUCCESS(Status)) Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextLocationInformation;
{ Stack.Parameters.QueryDeviceText.LocaleId = LocaleId;
DPRINT1("ZwSetValueKey() failed (Status 0x%lx)\n", Status); 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");
}
DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation 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;
Stack.Parameters.QueryDeviceText.DeviceTextType = DeviceTextLocationInformation; DeviceNode->ChildBusNumber = BusInformation->BusNumber;
Stack.Parameters.QueryDeviceText.LocaleId = LocaleId; DeviceNode->ChildInterfaceType = BusInformation->LegacyBusType;
Status = IopInitiatePnpIrp( DeviceNode->ChildBusTypeIndex = IopGetBusTypeGuidIndex(&BusInformation->BusTypeGuid);
DeviceNode->PhysicalDeviceObject, ExFreePool(BusInformation);
&IoStatusBlock, }
IRP_MN_QUERY_DEVICE_TEXT, else
&Stack); {
if (NT_SUCCESS(Status) && IoStatusBlock.Information) DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status);
{
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"); DeviceNode->ChildBusNumber = 0xFFFFFFF0;
DeviceNode->ChildInterfaceType = InterfaceTypeUndefined;
DeviceNode->ChildBusTypeIndex = -1;
}
Status = IopInitiatePnpIrp( DPRINT("Sending IRP_MN_QUERY_RESOURCES to device stack\n");
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; Status = IopInitiatePnpIrp(DeviceNode->PhysicalDeviceObject,
DeviceNode->ChildInterfaceType = BusInformation->LegacyBusType; &IoStatusBlock,
DeviceNode->ChildBusTypeIndex = IopGetBusTypeGuidIndex(&BusInformation->BusTypeGuid); IRP_MN_QUERY_RESOURCES,
ExFreePool(BusInformation); NULL);
} if (NT_SUCCESS(Status) && IoStatusBlock.Information)
else {
{ DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information;
DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status); IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG);
}
else
{
DPRINT("IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n", Status);
DeviceNode->BootResources = NULL;
}
DeviceNode->ChildBusNumber = 0xFFFFFFF0; DPRINT("Sending IRP_MN_QUERY_RESOURCE_REQUIREMENTS to device stack\n");
DeviceNode->ChildInterfaceType = InterfaceTypeUndefined;
DeviceNode->ChildBusTypeIndex = -1;
}
DPRINT("Sending IRP_MN_QUERY_RESOURCES 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;
}
Status = IopInitiatePnpIrp( if (InstanceKey != NULL)
DeviceNode->PhysicalDeviceObject, {
&IoStatusBlock, IopSetDeviceInstanceData(InstanceKey, DeviceNode);
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"); ZwClose(InstanceKey);
Status = IopInitiatePnpIrp( IopDeviceNodeSetFlag(DeviceNode, DNF_PROCESSED);
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) if (!IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER))
{ {
IopSetDeviceInstanceData(InstanceKey, DeviceNode); /* Report the device to the user-mode pnp manager */
} IopQueueTargetDeviceEvent(&GUID_DEVICE_ENUMERATED,
&DeviceNode->InstancePath);
}
ZwClose(InstanceKey); return STATUS_SUCCESS;
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 static