mirror of
https://github.com/reactos/reactos.git
synced 2024-11-19 21:48:10 +00:00
[NTOS:FORMATTING]
- Fix spacing in IopActionInterrogateDeviceStack. No code changes. svn path=/trunk/; revision=74016
This commit is contained in:
parent
3238412b08
commit
b6a16efc88
1 changed files with 297 additions and 302 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue