Author: janderwald Date: Sun Nov 9 08:22:43 2014 New Revision: 65338 URL: http://svn.reactos.org/svn/reactos?rev=65338&view=rev Log: [NTOS:PNPMGR] - Implement IoGetDeviceInterfaces with PhysicalDeviceObject support
Modified: trunk/reactos/ntoskrnl/io/iomgr/deviface.c Modified: trunk/reactos/ntoskrnl/io/iomgr/deviface.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/deviface.c?rev=65338&r1=65337&r2=65338&view=diff ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/deviface.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/deviface.c [iso-8859-1] Sun Nov 9 08:22:43 2014 @@ -462,6 +462,8 @@ PKEY_BASIC_INFORMATION ReferenceBi = NULL; PKEY_VALUE_PARTIAL_INFORMATION bip = NULL; PKEY_VALUE_PARTIAL_INFORMATION PartialInfo; + PEXTENDED_DEVOBJ_EXTENSION DeviceObjectExtension; + PUNICODE_STRING InstanceDevicePath = NULL; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; BOOLEAN FoundRightPDO = FALSE; @@ -470,6 +472,29 @@ NTSTATUS Status; PAGED_CODE(); + + if (PhysicalDeviceObject != NULL) + { + /* Parameters must pass three border of checks */ + DeviceObjectExtension = (PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension; + + /* 1st level: Presence of a Device Node */ + if (DeviceObjectExtension->DeviceNode == NULL) + { + DPRINT("PhysicalDeviceObject 0x%p doesn't have a DeviceNode\n", PhysicalDeviceObject); + return STATUS_INVALID_DEVICE_REQUEST; + } + + /* 2nd level: Presence of an non-zero length InstancePath */ + if (DeviceObjectExtension->DeviceNode->InstancePath.Length == 0) + { + DPRINT("PhysicalDeviceObject 0x%p's DOE has zero-length InstancePath\n", PhysicalDeviceObject); + return STATUS_INVALID_DEVICE_REQUEST; + } + + InstanceDevicePath = &DeviceObjectExtension->DeviceNode->InstancePath; + } + Status = IopOpenInterfaceKey(InterfaceClassGuid, KEY_ENUMERATE_SUB_KEYS, &InterfaceKey); if (!NT_SUCCESS(Status)) @@ -542,10 +567,46 @@ /* Check if we are on the right physical device object, * by reading the DeviceInstance string */ - DPRINT1("PhysicalDeviceObject != NULL. Case not implemented.\n"); - //FoundRightPDO = TRUE; - Status = STATUS_NOT_IMPLEMENTED; - goto cleanup; + RtlInitUnicodeString(&KeyName, L"DeviceInstance"); + Status = ZwQueryValueKey(DeviceKey, &KeyName, KeyValuePartialInformation, NULL, 0, &NeededLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + ActualLength = NeededLength; + PartialInfo = ExAllocatePool(NonPagedPool, ActualLength); + if (!PartialInfo) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwQueryValueKey(DeviceKey, &KeyName, KeyValuePartialInformation, PartialInfo, ActualLength, &NeededLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwQueryValueKey #2 failed (%x)\n", Status); + ExFreePool(PartialInfo); + goto cleanup; + } + if (PartialInfo->DataLength == InstanceDevicePath->Length) + { + if (RtlCompareMemory(PartialInfo->Data, InstanceDevicePath->Buffer, InstanceDevicePath->Length) == InstanceDevicePath->Length) + { + /* found right pdo */ + FoundRightPDO = TRUE; + } + } + ExFreePool(PartialInfo); + PartialInfo = NULL; + if (!FoundRightPDO) + { + /* not yet found */ + continue; + } + } + else + { + /* error */ + break; + } } /* Enumerate subkeys (ie the different reference strings) */