Aric Stewart : hidclass.sys: Use IoRegisterDeviceInterface.

Alexandre Julliard julliard at winehq.org
Tue Nov 13 15:01:57 CST 2018


Module: wine
Branch: master
Commit: ec2234102acba5d027a2aa4dcba068957bbff815
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ec2234102acba5d027a2aa4dcba068957bbff815

Author: Aric Stewart <aric at codeweavers.com>
Date:   Fri Nov  2 08:45:42 2018 -0500

hidclass.sys: Use IoRegisterDeviceInterface.

Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/hidclass.sys/device.c | 60 ++++++++++++++++------------------------------
 dlls/hidclass.sys/hid.h    |  2 +-
 dlls/hidclass.sys/pnp.c    |  4 +---
 3 files changed, 22 insertions(+), 44 deletions(-)

diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
index 3364eb3..1591390 100644
--- a/dlls/hidclass.sys/device.c
+++ b/dlls/hidclass.sys/device.c
@@ -42,12 +42,6 @@ WINE_DECLARE_DEBUG_CHANNEL(hid_report);
 
 static const WCHAR device_name_fmtW[] = {'\\','D','e','v','i','c','e',
     '\\','H','I','D','#','%','p','&','%','p',0};
-static const WCHAR device_link_fmtW[] = {'\\','?','?','\\','%','s','#','%','s',0};
-/* GUID_DEVINTERFACE_HID */
-static const WCHAR class_guid[] = {'{','4','D','1','E','5','5','B','2',
-    '-','F','1','6','F','-','1','1','C','F','-','8','8','C','B','-','0','0',
-    '1','1','1','1','0','0','0','0','3','0','}',0};
-
 
 NTSTATUS HID_CreateDevice(DEVICE_OBJECT *native_device, HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT **device)
 {
@@ -75,7 +69,7 @@ NTSTATUS HID_CreateDevice(DEVICE_OBJECT *native_device, HID_MINIDRIVER_REGISTRAT
     ext->deviceExtension.NextDeviceObject = native_device;
     ext->device_name = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(dev_name) + 1) * sizeof(WCHAR));
     lstrcpyW(ext->device_name, dev_name);
-    ext->link_name = NULL;
+    ext->link_name.Buffer = NULL;
 
     IoAttachDeviceToDeviceStack(*device, native_device);
 
@@ -84,10 +78,8 @@ NTSTATUS HID_CreateDevice(DEVICE_OBJECT *native_device, HID_MINIDRIVER_REGISTRAT
 
 NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device)
 {
-    WCHAR dev_link[255];
-    WCHAR *ptr;
     SP_DEVINFO_DATA Data;
-    UNICODE_STRING nameW, linkW;
+    UNICODE_STRING nameW;
     NTSTATUS status;
     HDEVINFO devinfo;
     GUID hidGuid;
@@ -96,25 +88,7 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device)
     HidD_GetHidGuid(&hidGuid);
     ext = device->DeviceExtension;
 
-    sprintfW(dev_link, device_link_fmtW, ext->instance_id, class_guid);
-    ptr = dev_link + 4;
-    do { if (*ptr == '\\') *ptr = '#'; } while (*ptr++);
-    struprW(dev_link);
-
     RtlInitUnicodeString( &nameW, ext->device_name);
-    RtlInitUnicodeString( &linkW, dev_link );
-
-    TRACE("Create link %s\n", debugstr_w(dev_link));
-
-    ext->link_name = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * (lstrlenW(dev_link) + 1));
-    lstrcpyW(ext->link_name, dev_link);
-
-    status = IoCreateSymbolicLink( &linkW, &nameW );
-    if (status)
-    {
-        FIXME( "failed to create link error %x\n", status );
-        return status;
-    }
 
     devinfo = SetupDiGetClassDevsW(&GUID_DEVCLASS_HIDCLASS, NULL, NULL, DIGCF_DEVICEINTERFACE);
     if (!devinfo)
@@ -138,13 +112,22 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device)
         FIXME( "failed to Register Device Info %x\n", GetLastError());
         goto error;
     }
-    if (!SetupDiCreateDeviceInterfaceW( devinfo, &Data,  &hidGuid, NULL, 0, NULL))
+    SetupDiDestroyDeviceInfoList(devinfo);
+
+    status = IoRegisterDeviceInterface(device, &hidGuid, NULL, &ext->link_name);
+    if (status != STATUS_SUCCESS)
     {
-        FIXME( "failed to Create Device Interface %x\n", GetLastError());
-        goto error;
+        FIXME( "failed to register device interface %x\n", status );
+        return status;
+    }
+
+    status = IoCreateSymbolicLink( &ext->link_name, &nameW );
+    if (status != STATUS_SUCCESS)
+    {
+        FIXME( "failed to create link error %x\n", status );
+        return status;
     }
 
-    SetupDiDestroyDeviceInfoList(devinfo);
     return STATUS_SUCCESS;
 
 error:
@@ -156,20 +139,17 @@ void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device
 {
     NTSTATUS status;
     BASE_DEVICE_EXTENSION *ext;
-    UNICODE_STRING linkW;
     LIST_ENTRY *entry;
     IRP *irp;
 
     ext = device->DeviceExtension;
 
-    if (ext->link_name)
+    if (ext->link_name.Buffer)
     {
-        TRACE("Delete link %s\n", debugstr_w(ext->link_name));
-        RtlInitUnicodeString(&linkW, ext->link_name);
-
-        IoSetDeviceInterfaceState(&linkW, FALSE);
+        TRACE("Delete link %s\n", debugstr_w(ext->link_name.Buffer));
 
-        status = IoDeleteSymbolicLink(&linkW);
+        IoSetDeviceInterfaceState(&ext->link_name, FALSE);
+        status = IoDeleteSymbolicLink(&ext->link_name);
         if (status != STATUS_SUCCESS)
             ERR("Delete Symbolic Link failed (%x)\n",status);
     }
@@ -196,7 +176,7 @@ void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION *driver, DEVICE_OBJECT *device
 
     TRACE("Delete device(%p) %s\n", device, debugstr_w(ext->device_name));
     HeapFree(GetProcessHeap(), 0, ext->device_name);
-    HeapFree(GetProcessHeap(), 0, ext->link_name);
+    RtlFreeUnicodeString(&ext->link_name);
 
     IoDeleteDevice(device);
 }
diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h
index 4e8ba3c..769b715 100644
--- a/dlls/hidclass.sys/hid.h
+++ b/dlls/hidclass.sys/hid.h
@@ -47,7 +47,7 @@ typedef struct _BASE_DEVICE_EXTENSION {
 
     ULONG poll_interval;
     WCHAR *device_name;
-    WCHAR *link_name;
+    UNICODE_STRING link_name;
     WCHAR device_id[MAX_DEVICE_ID_LEN];
     WCHAR instance_id[MAX_DEVICE_ID_LEN];
     struct ReportRingBuffer *ring_buffer;
diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c
index 34bd944..47bd443 100644
--- a/dlls/hidclass.sys/pnp.c
+++ b/dlls/hidclass.sys/pnp.c
@@ -286,12 +286,10 @@ NTSTATUS WINAPI HID_PNP_Dispatch(DEVICE_OBJECT *device, IRP *irp)
         case IRP_MN_START_DEVICE:
         {
             BASE_DEVICE_EXTENSION *ext = device->DeviceExtension;
-            UNICODE_STRING linkU;
 
             rc = minidriver->PNPDispatch(device, irp);
 
-            RtlInitUnicodeString(&linkU, ext->link_name);
-            IoSetDeviceInterfaceState(&linkU, TRUE);
+            IoSetDeviceInterfaceState(&ext->link_name, TRUE);
             return rc;
         }
         case IRP_MN_REMOVE_DEVICE:




More information about the wine-cvs mailing list