mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
- Remove obsolete variables from the DEVICE_NODE structure and store it in the registry instead.
- IoGetDeviceProperty() supports more properties (untested). svn path=/trunk/; revision=11377
This commit is contained in:
parent
2461583881
commit
c647cbd575
2 changed files with 183 additions and 156 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: device.c,v 1.77 2004/08/21 20:51:25 tamlin Exp $
|
||||
/* $Id: device.c,v 1.78 2004/10/22 11:00:41 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -65,7 +65,7 @@ IopInitializeDevice(
|
|||
|
||||
DPRINT("Sending IRP_MN_START_DEVICE to driver\n");
|
||||
|
||||
Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->BootResourcesList;
|
||||
Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->BootResourceList;
|
||||
/* FIXME: Translate the resource list */
|
||||
Stack.Parameters.StartDevice.AllocatedResourcesTranslated = NULL;
|
||||
|
||||
|
@ -641,7 +641,7 @@ IoCreateDevice(
|
|||
CreatedDeviceObject->DeviceType == FILE_DEVICE_CD_ROM ||
|
||||
CreatedDeviceObject->DeviceType == FILE_DEVICE_TAPE)
|
||||
{
|
||||
IoAttachVpb(CreatedDeviceObject);
|
||||
IoAttachVpb(CreatedDeviceObject);
|
||||
}
|
||||
CreatedDeviceObject->SectorSize = 512; /* FIXME */
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: pnpmgr.c,v 1.40 2004/10/21 03:39:37 arty Exp $
|
||||
/* $Id: pnpmgr.c,v 1.41 2004/10/22 11:00:41 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -77,6 +77,7 @@ IoGetDeviceProperty(
|
|||
PDEVICE_NODE DeviceNode = IopGetDeviceNode(DeviceObject);
|
||||
ULONG Length;
|
||||
PVOID Data;
|
||||
PWSTR Ptr;
|
||||
|
||||
DPRINT("IoGetDeviceProperty(%x %d)\n", DeviceObject, DeviceProperty);
|
||||
|
||||
|
@ -140,6 +141,10 @@ IoGetDeviceProperty(
|
|||
case DevicePropertyDriverKeyName:
|
||||
case DevicePropertyManufacturer:
|
||||
case DevicePropertyFriendlyName:
|
||||
case DevicePropertyHardwareID:
|
||||
case DevicePropertyCompatibleIDs:
|
||||
case DevicePropertyDeviceDescription:
|
||||
case DevicePropertyLocationInformation:
|
||||
{
|
||||
LPWSTR RegistryPropertyName, KeyNameBuffer;
|
||||
UNICODE_STRING KeyName, ValueName;
|
||||
|
@ -161,6 +166,14 @@ IoGetDeviceProperty(
|
|||
RegistryPropertyName = L"Mfg"; break;
|
||||
case DevicePropertyFriendlyName:
|
||||
RegistryPropertyName = L"FriendlyName"; break;
|
||||
case DevicePropertyHardwareID:
|
||||
RegistryPropertyName = L"HardwareID"; break;
|
||||
case DevicePropertyCompatibleIDs:
|
||||
RegistryPropertyName = L"CompatibleIDs"; break;
|
||||
case DevicePropertyDeviceDescription:
|
||||
RegistryPropertyName = L"DeviceDesc"; break;
|
||||
case DevicePropertyLocationInformation:
|
||||
RegistryPropertyName = L"LocationInformation"; break;
|
||||
default:
|
||||
RegistryPropertyName = NULL; break;
|
||||
}
|
||||
|
@ -221,12 +234,38 @@ IoGetDeviceProperty(
|
|||
}
|
||||
|
||||
case DevicePropertyBootConfiguration:
|
||||
Length = 0;
|
||||
if (DeviceNode->BootResourceList->Count != 0)
|
||||
{
|
||||
Length = sizeof(CM_RESOURCE_LIST) +
|
||||
((DeviceNode->BootResourceList->Count - 1) * sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
|
||||
}
|
||||
Data = &DeviceNode->BootResourceList;
|
||||
break;
|
||||
|
||||
/* FIXME: use a translated boot configuration instead */
|
||||
case DevicePropertyBootConfigurationTranslated:
|
||||
case DevicePropertyCompatibleIDs:
|
||||
case DevicePropertyDeviceDescription:
|
||||
Length = 0;
|
||||
if (DeviceNode->BootResourceList->Count != 0)
|
||||
{
|
||||
Length = sizeof(CM_RESOURCE_LIST) +
|
||||
((DeviceNode->BootResourceList->Count - 1) * sizeof(CM_FULL_RESOURCE_DESCRIPTOR));
|
||||
}
|
||||
Data = &DeviceNode->BootResourceList;
|
||||
break;
|
||||
|
||||
case DevicePropertyEnumeratorName:
|
||||
case DevicePropertyHardwareID:
|
||||
case DevicePropertyLocationInformation:
|
||||
Ptr = wcschr(DeviceNode->InstancePath.Buffer, L'\\');
|
||||
if (Ptr != NULL)
|
||||
{
|
||||
Length = (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)DeviceNode->InstancePath.Buffer) + sizeof(WCHAR);
|
||||
}
|
||||
else
|
||||
{
|
||||
Length = 0;
|
||||
Data = NULL;
|
||||
}
|
||||
|
||||
case DevicePropertyPhysicalDeviceObjectName:
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
|
@ -239,6 +278,13 @@ IoGetDeviceProperty(
|
|||
return STATUS_BUFFER_TOO_SMALL;
|
||||
RtlCopyMemory(PropertyBuffer, Data, Length);
|
||||
|
||||
/* Terminate the string */
|
||||
if (DeviceProperty == DevicePropertyEnumeratorName)
|
||||
{
|
||||
Ptr = (PWSTR)PropertyBuffer;
|
||||
Ptr[(Length / sizeof(WCHAR)) - 1] = 0;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -488,9 +534,9 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode)
|
|||
ExFreePool(DeviceNode->CmResourceList);
|
||||
}
|
||||
|
||||
if (DeviceNode->BootResourcesList)
|
||||
if (DeviceNode->BootResourceList)
|
||||
{
|
||||
ExFreePool(DeviceNode->BootResourcesList);
|
||||
ExFreePool(DeviceNode->BootResourceList);
|
||||
}
|
||||
|
||||
if (DeviceNode->ResourceRequirementsList)
|
||||
|
@ -498,18 +544,6 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode)
|
|||
ExFreePool(DeviceNode->ResourceRequirementsList);
|
||||
}
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->DeviceID);
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->InstanceID);
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->HardwareIDs);
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->CompatibleIDs);
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->DeviceText);
|
||||
|
||||
RtlFreeUnicodeString(&DeviceNode->DeviceTextLocation);
|
||||
|
||||
if (DeviceNode->BusInformation)
|
||||
{
|
||||
ExFreePool(DeviceNode->BusInformation);
|
||||
|
@ -785,69 +819,6 @@ IopSetDeviceInstanceData(HANDLE InstanceKey,
|
|||
|
||||
DPRINT("IopSetDeviceInstanceData() called\n");
|
||||
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"CompatibleIDs");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_MULTI_SZ,
|
||||
DeviceNode->CompatibleIDs.Buffer,
|
||||
DeviceNode->CompatibleIDs.MaximumLength);
|
||||
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"HardwareID");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_MULTI_SZ,
|
||||
DeviceNode->HardwareIDs.Buffer,
|
||||
DeviceNode->HardwareIDs.MaximumLength);
|
||||
|
||||
/* Set 'DeviceDesc' value */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"DeviceDesc");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_SZ,
|
||||
DeviceNode->DeviceText.Buffer,
|
||||
DeviceNode->DeviceText.MaximumLength);
|
||||
|
||||
/* Set 'LocationInformation' value */
|
||||
DPRINT("LocationInformation: %wZ\n", &DeviceNode->DeviceTextLocation);
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"LocationInformation");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_SZ,
|
||||
DeviceNode->DeviceTextLocation.Buffer,
|
||||
DeviceNode->DeviceTextLocation.MaximumLength);
|
||||
|
||||
/* Set 'Capabilities' value */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"Capabilities");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
(PVOID)((ULONG_PTR)&DeviceNode->CapabilityFlags + 4),
|
||||
sizeof(ULONG));
|
||||
|
||||
/* Set 'UINumber' value */
|
||||
if (DeviceNode->CapabilityFlags != NULL &&
|
||||
DeviceNode->CapabilityFlags->UINumber != (ULONG)-1)
|
||||
{
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"UINumber");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&KeyName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&DeviceNode->CapabilityFlags->UINumber,
|
||||
sizeof(ULONG));
|
||||
}
|
||||
|
||||
/* Create the 'LogConf' key */
|
||||
RtlInitUnicodeString(&KeyName,
|
||||
L"LogConf");
|
||||
|
@ -866,9 +837,9 @@ IopSetDeviceInstanceData(HANDLE InstanceKey,
|
|||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
/* Set 'BootConfig' value */
|
||||
if (DeviceNode->BootResourcesList != NULL)
|
||||
if (DeviceNode->BootResourceList != NULL)
|
||||
{
|
||||
ResCount = DeviceNode->BootResourcesList->Count;
|
||||
ResCount = DeviceNode->BootResourceList->Count;
|
||||
if (ResCount != 0)
|
||||
{
|
||||
ListSize = sizeof(CM_RESOURCE_LIST) +
|
||||
|
@ -880,7 +851,7 @@ IopSetDeviceInstanceData(HANDLE InstanceKey,
|
|||
&KeyName,
|
||||
0,
|
||||
REG_RESOURCE_LIST,
|
||||
&DeviceNode->BootResourcesList,
|
||||
&DeviceNode->BootResourceList,
|
||||
ListSize);
|
||||
}
|
||||
}
|
||||
|
@ -942,6 +913,7 @@ IopActionInterrogateDeviceStack(
|
|||
USHORT Length;
|
||||
USHORT TotalLength;
|
||||
HANDLE InstanceKey = NULL;
|
||||
UNICODE_STRING ValueName;
|
||||
|
||||
DPRINT("IopActionInterrogateDeviceStack(%p, %p)\n", DeviceNode, Context);
|
||||
DPRINT("PDO %x\n", DeviceNode->Pdo);
|
||||
|
@ -986,9 +958,8 @@ IopActionInterrogateDeviceStack(
|
|||
&Stack);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RtlInitUnicodeString(
|
||||
&DeviceNode->DeviceID,
|
||||
(PWSTR)IoStatusBlock.Information);
|
||||
/* Copy the device id string */
|
||||
wcscpy(InstancePath, (PWSTR)IoStatusBlock.Information);
|
||||
|
||||
/*
|
||||
* FIXME: Check for valid characters, if there is invalid characters
|
||||
|
@ -998,7 +969,6 @@ IopActionInterrogateDeviceStack(
|
|||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->DeviceID, NULL);
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n");
|
||||
|
@ -1011,9 +981,9 @@ IopActionInterrogateDeviceStack(
|
|||
&Stack);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RtlInitUnicodeString(
|
||||
&DeviceNode->InstanceID,
|
||||
(PWSTR)IoStatusBlock.Information);
|
||||
/* Append the instance id string */
|
||||
wcscat(InstancePath, L"\\");
|
||||
wcscat(InstancePath, (PWSTR)IoStatusBlock.Information);
|
||||
|
||||
/*
|
||||
* FIXME: Check for valid characters, if there is invalid characters
|
||||
|
@ -1023,7 +993,71 @@ IopActionInterrogateDeviceStack(
|
|||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->InstanceID, NULL);
|
||||
}
|
||||
|
||||
Status = IopQueryCapabilities(DeviceNode->Pdo, &DeviceNode->CapabilityFlags);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
if (!DeviceNode->CapabilityFlags->UniqueID)
|
||||
{
|
||||
DPRINT("Instance ID is not unique\n");
|
||||
/* FIXME: Add information from parent bus driver to InstancePath */
|
||||
}
|
||||
|
||||
if (!IopCreateUnicodeString(&DeviceNode->InstancePath, InstancePath, PagedPool))
|
||||
{
|
||||
DPRINT("No resources\n");
|
||||
/* FIXME: Cleanup and disable device */
|
||||
}
|
||||
|
||||
DPRINT1("InstancePath is %S\n", DeviceNode->InstancePath.Buffer);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
||||
if (DeviceNode->CapabilityFlags != NULL)
|
||||
{
|
||||
/* Set 'Capabilities' value */
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"Capabilities");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
(PVOID)((ULONG_PTR)&DeviceNode->CapabilityFlags + 4),
|
||||
sizeof(ULONG));
|
||||
|
||||
/* Set 'UINumber' value */
|
||||
if (DeviceNode->CapabilityFlags->UINumber != (ULONG)-1)
|
||||
{
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"UINumber");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_DWORD,
|
||||
&DeviceNode->CapabilityFlags->UINumber,
|
||||
sizeof(ULONG));
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_ID.BusQueryHardwareIDs to device stack\n");
|
||||
|
@ -1054,14 +1088,22 @@ IopActionInterrogateDeviceStack(
|
|||
DPRINT("TotalLength: %hu\n", TotalLength);
|
||||
DPRINT("\n");
|
||||
|
||||
DeviceNode->HardwareIDs.Length = TotalLength * sizeof(WCHAR);
|
||||
DeviceNode->HardwareIDs.MaximumLength = DeviceNode->HardwareIDs.Length + sizeof(WCHAR);
|
||||
DeviceNode->HardwareIDs.Buffer = (PWSTR)IoStatusBlock.Information;
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"HardwareID");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_MULTI_SZ,
|
||||
(PVOID)IoStatusBlock.Information,
|
||||
(TotalLength + 1) * sizeof(WCHAR));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->HardwareIDs, NULL);
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_ID.BusQueryCompatibleIDs to device stack\n");
|
||||
|
@ -1092,23 +1134,24 @@ IopActionInterrogateDeviceStack(
|
|||
DPRINT("TotalLength: %hu\n", TotalLength);
|
||||
DPRINT("\n");
|
||||
|
||||
DeviceNode->CompatibleIDs.Length = TotalLength * sizeof(WCHAR);
|
||||
DeviceNode->CompatibleIDs.MaximumLength = DeviceNode->CompatibleIDs.Length + sizeof(WCHAR);
|
||||
DeviceNode->CompatibleIDs.Buffer = (PWSTR)IoStatusBlock.Information;
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"CompatibleIDs");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_MULTI_SZ,
|
||||
(PVOID)IoStatusBlock.Information,
|
||||
(TotalLength + 1) * sizeof(WCHAR));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->CompatibleIDs, NULL);
|
||||
}
|
||||
|
||||
Status = IopQueryCapabilities(DeviceNode->Pdo, &DeviceNode->CapabilityFlags);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextDescription to device stack\n");
|
||||
|
||||
|
@ -1121,14 +1164,22 @@ IopActionInterrogateDeviceStack(
|
|||
&Stack);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RtlInitUnicodeString(
|
||||
&DeviceNode->DeviceText,
|
||||
(PWSTR)IoStatusBlock.Information);
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"DeviceDesc");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_SZ,
|
||||
(PVOID)IoStatusBlock.Information,
|
||||
(wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->DeviceText, NULL);
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_DEVICE_TEXT.DeviceTextLocation to device stack\n");
|
||||
|
@ -1142,14 +1193,23 @@ IopActionInterrogateDeviceStack(
|
|||
&Stack);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RtlInitUnicodeString(
|
||||
&DeviceNode->DeviceTextLocation,
|
||||
(PWSTR)IoStatusBlock.Information);
|
||||
DPRINT("LocationInformation: %wZ\n", &DeviceNode->DeviceTextLocation);
|
||||
RtlInitUnicodeString(&ValueName,
|
||||
L"LocationInformation");
|
||||
Status = NtSetValueKey(InstanceKey,
|
||||
&ValueName,
|
||||
0,
|
||||
REG_SZ,
|
||||
(PVOID)IoStatusBlock.Information,
|
||||
(wcslen((PWSTR)IoStatusBlock.Information) + 1) * sizeof(WCHAR));
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
RtlInitUnicodeString(&DeviceNode->DeviceTextLocation, NULL);
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_BUS_INFORMATION to device stack\n");
|
||||
|
@ -1179,14 +1239,14 @@ IopActionInterrogateDeviceStack(
|
|||
NULL);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
DeviceNode->BootResourcesList =
|
||||
DeviceNode->BootResourceList =
|
||||
(PCM_RESOURCE_LIST)IoStatusBlock.Information;
|
||||
DeviceNode->Flags |= DNF_HAS_BOOT_CONFIG;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("IopInitiatePnpIrp() failed (Status %x)\n", Status);
|
||||
DeviceNode->BootResourcesList = NULL;
|
||||
DeviceNode->BootResourceList = NULL;
|
||||
}
|
||||
|
||||
DPRINT("Sending IRP_MN_QUERY_RESOURCE_REQUIREMENTS to device stack\n");
|
||||
|
@ -1207,47 +1267,14 @@ IopActionInterrogateDeviceStack(
|
|||
DeviceNode->ResourceRequirementsList = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Assemble the instance path for the device
|
||||
*/
|
||||
|
||||
wcscpy(InstancePath, DeviceNode->DeviceID.Buffer);
|
||||
wcscat(InstancePath, L"\\");
|
||||
wcscat(InstancePath, DeviceNode->InstanceID.Buffer);
|
||||
|
||||
if (!DeviceNode->CapabilityFlags || !DeviceNode->CapabilityFlags->UniqueID)
|
||||
{
|
||||
DPRINT("Instance ID is not unique\n");
|
||||
/* FIXME: Add information from parent bus driver to InstancePath */
|
||||
}
|
||||
|
||||
if (!IopCreateUnicodeString(&DeviceNode->InstancePath, InstancePath, PagedPool))
|
||||
{
|
||||
DPRINT("No resources\n");
|
||||
/* FIXME: Cleanup and disable device */
|
||||
}
|
||||
|
||||
DPRINT("InstancePath is %S\n", DeviceNode->InstancePath.Buffer);
|
||||
|
||||
/*
|
||||
* 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 (InstanceKey != NULL)
|
||||
{
|
||||
IopSetDeviceInstanceData(InstanceKey, DeviceNode);
|
||||
NtClose(InstanceKey);
|
||||
}
|
||||
|
||||
NtClose(InstanceKey);
|
||||
|
||||
DeviceNode->Flags |= DNF_PROCESSED;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
|
Loading…
Reference in a new issue