From: Aric Stewart Subject: [PATCH] ntoskrnl.exe: Implement DevicePropertyEnumeratorName for IoGetDeviceProperty Message-Id: <94103054-8bb3-3f2e-56f7-a0475af5c166@codeweavers.com> Date: Thu, 25 Aug 2016 14:39:02 -0500 Signed-off-by: Aric Stewart --- dlls/ntoskrnl.exe/ntoskrnl.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 7c35d14..d05c43c 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -189,6 +189,46 @@ static HANDLE get_device_manager(void) return ret; } +static NTSTATUS WINAPI internalComplete(DEVICE_OBJECT *deviceObject, IRP *irp, + void *context ) +{ + SetEvent(irp->UserEvent); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +static NTSTATUS get_device_id(DEVICE_OBJECT *device, BUS_QUERY_ID_TYPE type, WCHAR **id) +{ + NTSTATUS status; + IO_STACK_LOCATION *irpsp; + IO_STATUS_BLOCK irp_status; + IRP *irp; + HANDLE event = CreateEventA(NULL, FALSE, FALSE, NULL); + + irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, device, NULL, 0, NULL, NULL, &irp_status); + if (irp == NULL) + return STATUS_NO_MEMORY; + + irp->UserEvent = event; + irpsp = IoGetNextIrpStackLocation(irp); + irpsp->MinorFunction = IRP_MN_QUERY_ID; + irpsp->Parameters.QueryId.IdType = type; + irpsp->CompletionRoutine = internalComplete; + irpsp->Control = SL_INVOKE_ON_SUCCESS | SL_INVOKE_ON_ERROR; + + IoCallDriver(device, irp); + + if (irp->IoStatus.u.Status == STATUS_PENDING) + WaitForSingleObject(event, INFINITE); + + *id = (WCHAR*)irp->IoStatus.Information; + status = irp->IoStatus.u.Status; + IoCompleteRequest(irp, IO_NO_INCREMENT ); + CloseHandle(event); + + return status; +} + + static NTSTATUS dispatch_irp( DEVICE_OBJECT *device, IRP *irp ) { LARGE_INTEGER count; @@ -1145,6 +1185,31 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP property_buffer, result_length ); switch (device_property) { + case DevicePropertyEnumeratorName: + { + DWORD len; + WCHAR *id, *ptr; + status = get_device_id(device, BusQueryInstanceID, &id); + if (status != STATUS_SUCCESS) + { + ERR("Failed to get device id\n"); + break; + } + struprW(id); + TRACE("Device ID %s\n",debugstr_w(id)); + ptr = strchrW(id, '\\'); + len = (ptr - id); + *result_length = sizeof(WCHAR) * (len+1); + if (buffer_length < *result_length) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + lstrcpynW(property_buffer, id, len+1); + ((WCHAR*)property_buffer)[len] = 0; + break; + } case DevicePropertyPhysicalDeviceObjectName: { ULONG used_len, len = buffer_length + sizeof(OBJECT_NAME_INFORMATION);