Needed by many native PnP drivers, including the FA-124 USB driver.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/pnp.c | 29 +++++++++++++++++++++++++++++ include/ddk/wdm.h | 1 + 3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 6b5b127a62..40341d8f0c 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -423,7 +423,7 @@ @ stdcall IoIsWdmVersionAvailable(long long) @ stub IoMakeAssociatedIrp @ stub IoOpenDeviceInterfaceRegistryKey -@ stub IoOpenDeviceRegistryKey +@ stdcall IoOpenDeviceRegistryKey(ptr long long ptr) @ stub IoPageRead @ stub IoPnPDeliverServicePowerNotification @ stdcall IoQueryDeviceDescription(ptr ptr ptr ptr ptr ptr ptr ptr) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 863e1d9d53..2acc7ade47 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -844,6 +844,35 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla return status; }
+/*********************************************************************** + * IoOpenDeviceRegistryKey (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoOpenDeviceRegistryKey( DEVICE_OBJECT *device, ULONG type, ACCESS_MASK access, HANDLE *key ) +{ + SP_DEVINFO_DATA sp_device = {sizeof(sp_device)}; + WCHAR device_instance_id[MAX_DEVICE_ID_LEN]; + NTSTATUS status; + HDEVINFO set; + + TRACE("device %p, type %#x, access %#x, key %p.\n", device, type, access, key); + + if ((status = get_device_instance_id( device, device_instance_id ))) + { + ERR("Failed to get device instance ID, error %#x.\n", status); + return status; + } + + set = SetupDiCreateDeviceInfoList( &GUID_NULL, NULL ); + + SetupDiOpenDeviceInfoW( set, device_instance_id, NULL, 0, &sp_device ); + + *key = SetupDiOpenDevRegKey( set, &sp_device, DICS_FLAG_GLOBAL, 0, type, access ); + if (*key == INVALID_HANDLE_VALUE) + return GetLastError(); + SetupDiDestroyDeviceInfoList( set ); + return STATUS_SUCCESS; +} + /*********************************************************************** * PoSetPowerState (NTOSKRNL.EXE.@) */ diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 53ea9e17cf..b4325cec6c 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1607,6 +1607,7 @@ void WINAPI IoGetStackLimits(ULONG_PTR*,ULONG_PTR*); void WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR); VOID WINAPI IoInitializeRemoveLockEx(PIO_REMOVE_LOCK,ULONG,ULONG,ULONG,ULONG); void WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE); +NTSTATUS WINAPI IoOpenDeviceRegistryKey(DEVICE_OBJECT*,ULONG,ACCESS_MASK,HANDLE*); void WINAPI IoQueueWorkItem(PIO_WORKITEM,PIO_WORKITEM_ROUTINE,WORK_QUEUE_TYPE,void*); NTSTATUS WINAPI IoRegisterDeviceInterface(PDEVICE_OBJECT,const GUID*,PUNICODE_STRING,PUNICODE_STRING); void WINAPI IoReleaseCancelSpinLock(KIRQL);
On 3/15/20 5:04 AM, Zebediah Figura wrote:
Needed by many native PnP drivers, including the FA-124 USB driver.
Signed-off-by: Zebediah Figura z.figura12@gmail.com
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/pnp.c | 29 +++++++++++++++++++++++++++++ include/ddk/wdm.h | 1 + 3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 6b5b127a62..40341d8f0c 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -423,7 +423,7 @@ @ stdcall IoIsWdmVersionAvailable(long long) @ stub IoMakeAssociatedIrp @ stub IoOpenDeviceInterfaceRegistryKey -@ stub IoOpenDeviceRegistryKey +@ stdcall IoOpenDeviceRegistryKey(ptr long long ptr) @ stub IoPageRead @ stub IoPnPDeliverServicePowerNotification @ stdcall IoQueryDeviceDescription(ptr ptr ptr ptr ptr ptr ptr ptr) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 863e1d9d53..2acc7ade47 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -844,6 +844,35 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla return status; }
+/***********************************************************************
IoOpenDeviceRegistryKey (NTOSKRNL.EXE.@)
- */
+NTSTATUS WINAPI IoOpenDeviceRegistryKey( DEVICE_OBJECT *device, ULONG type, ACCESS_MASK access, HANDLE *key ) +{
- SP_DEVINFO_DATA sp_device = {sizeof(sp_device)};
- WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
- NTSTATUS status;
- HDEVINFO set;
- TRACE("device %p, type %#x, access %#x, key %p.\n", device, type, access, key);
- if ((status = get_device_instance_id( device, device_instance_id )))
- {
ERR("Failed to get device instance ID, error %#x.\n", status);
return status;
- }
- set = SetupDiCreateDeviceInfoList( &GUID_NULL, NULL );
- SetupDiOpenDeviceInfoW( set, device_instance_id, NULL, 0, &sp_device );
- *key = SetupDiOpenDevRegKey( set, &sp_device, DICS_FLAG_GLOBAL, 0, type, access );
- if (*key == INVALID_HANDLE_VALUE)
return GetLastError();
Leaking 'set' on error path.
- SetupDiDestroyDeviceInfoList( set );
- return STATUS_SUCCESS;
+}
/***********************************************************************
PoSetPowerState (NTOSKRNL.EXE.@)
*/ diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 53ea9e17cf..b4325cec6c 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1607,6 +1607,7 @@ void WINAPI IoGetStackLimits(ULONG_PTR*,ULONG_PTR*); void WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR); VOID WINAPI IoInitializeRemoveLockEx(PIO_REMOVE_LOCK,ULONG,ULONG,ULONG,ULONG); void WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE); +NTSTATUS WINAPI IoOpenDeviceRegistryKey(DEVICE_OBJECT*,ULONG,ACCESS_MASK,HANDLE*); void WINAPI IoQueueWorkItem(PIO_WORKITEM,PIO_WORKITEM_ROUTINE,WORK_QUEUE_TYPE,void*); NTSTATUS WINAPI IoRegisterDeviceInterface(PDEVICE_OBJECT,const GUID*,PUNICODE_STRING,PUNICODE_STRING); void WINAPI IoReleaseCancelSpinLock(KIRQL);