Juan Lang : setupapi: Implement SetupDiGetDeviceInstanceIdW.

Alexandre Julliard julliard at winehq.org
Fri Sep 21 07:23:04 CDT 2007


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Sep 20 09:09:43 2007 -0700

setupapi: Implement SetupDiGetDeviceInstanceIdW.

---

 dlls/setupapi/devinst.c       |   56 +++++++++++++++++++++++++++++++++++-----
 dlls/setupapi/tests/devinst.c |   11 --------
 2 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 9c844ba..95221de 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -97,7 +97,10 @@ static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId)
         devInfo->instanceId = HeapAlloc(GetProcessHeap(), 0,
                 (lstrlenW(instanceId) + 1) * sizeof(WCHAR));
         if (devInfo->instanceId)
+        {
             lstrcpyW(devInfo->instanceId, instanceId);
+            struprW(devInfo->instanceId);
+        }
         else
         {
             HeapFree(GetProcessHeap(), 0, devInfo);
@@ -886,7 +889,7 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(
             SetLastError(ERROR_INVALID_DEVINST_NAME);
         else
         {
-            static const WCHAR newDeviceFmt[] = {'R','o','o','t','\\','%','s',
+            static const WCHAR newDeviceFmt[] = {'R','O','O','T','\\','%','s',
                 '\\','%','0','4','d',0};
             DWORD devId;
 
@@ -938,7 +941,7 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(
             struct DeviceInfo *devInfo =
                 (struct DeviceInfo *)set->devices[i].Reserved;
 
-            if (!lstrcmpW(DeviceName, devInfo->instanceId))
+            if (!lstrcmpiW(DeviceName, devInfo->instanceId))
             {
                 SetLastError(ERROR_DEVINST_ALREADY_EXISTS);
                 ret = FALSE;
@@ -1050,8 +1053,16 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdA(
 
             if (!len)
                 ret = FALSE;
-            else if (RequiredSize)
-                *RequiredSize = len;
+            else
+            {
+                if (len > DeviceInstanceIdSize)
+                {
+                    SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                    ret = FALSE;
+                }
+                if (RequiredSize)
+                    *RequiredSize = len;
+            }
         }
         HeapFree(GetProcessHeap(), 0, instanceId);
     }
@@ -1068,10 +1079,41 @@ BOOL WINAPI SetupDiGetDeviceInstanceIdW(
 	DWORD DeviceInstanceIdSize,
 	PDWORD RequiredSize)
 {
-    FIXME("%p %p %p %d %p\n", DeviceInfoSet, DeviceInfoData, DeviceInstanceId,
+    struct DeviceInfoSet *set = (struct DeviceInfoSet *)DeviceInfoSet;
+    struct DeviceInfo *devInfo;
+
+    TRACE("%p %p %p %d %p\n", DeviceInfoSet, DeviceInfoData, DeviceInstanceId,
 	    DeviceInstanceIdSize, RequiredSize);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+
+    if (!DeviceInfoSet || DeviceInfoSet == INVALID_HANDLE_VALUE)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+    }
+    if (set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+    }
+    if (!DeviceInfoData || DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)
+            || !DeviceInfoData->Reserved)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    devInfo = (struct DeviceInfo *)DeviceInfoData->Reserved;
+    TRACE("instance ID: %s\n", debugstr_w(devInfo->instanceId));
+    if (DeviceInstanceIdSize < lstrlenW(devInfo->instanceId) + 1)
+    {
+        SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        if (RequiredSize)
+            *RequiredSize = lstrlenW(devInfo->instanceId) + 1;
+        return FALSE;
+    }
+    lstrcpyW(DeviceInstanceId, devInfo->instanceId);
+    if (RequiredSize)
+        *RequiredSize = lstrlenW(devInfo->instanceId) + 1;
+    return TRUE;
 }
 
 /***********************************************************************
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 28e2624..c88ad24 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -217,12 +217,10 @@ static void testGetDeviceInstanceId(void)
     }
     SetLastError(0xdeadbeef);
     ret = pSetupDiGetDeviceInstanceIdA(NULL, NULL, NULL, 0, NULL);
-    todo_wine
     ok(!ret && GetLastError() == ERROR_INVALID_HANDLE,
      "Expected ERROR_INVALID_HANDLEHANDLE, got %08x\n", GetLastError());
     SetLastError(0xdeadbeef);
     ret = pSetupDiGetDeviceInstanceIdA(NULL, &devInfo, NULL, 0, NULL);
-    todo_wine
     ok(!ret && GetLastError() == ERROR_INVALID_HANDLE,
      "Expected ERROR_INVALID_HANDLEHANDLE, got %08x\n", GetLastError());
     set = pSetupDiCreateDeviceInfoList(&guid, NULL);
@@ -235,23 +233,19 @@ static void testGetDeviceInstanceId(void)
 
         SetLastError(0xdeadbeef);
         ret = pSetupDiGetDeviceInstanceIdA(set, NULL, NULL, 0, NULL);
-        todo_wine
         ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
          "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
         SetLastError(0xdeadbeef);
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, NULL, 0, NULL);
-        todo_wine
         ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
          "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
         SetLastError(0xdeadbeef);
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, NULL, 0, &size);
-        todo_wine
         ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
          "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
         devInfo.cbSize = sizeof(devInfo);
         SetLastError(0xdeadbeef);
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, NULL, 0, &size);
-        todo_wine
         ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
          "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
         ret = pSetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid,
@@ -259,14 +253,11 @@ static void testGetDeviceInstanceId(void)
         ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError());
         SetLastError(0xdeadbeef);
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, NULL, 0, &size);
-        todo_wine
         ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
          "Expected ERROR_INSUFFICIENT_BUFFER, got %08x\n", GetLastError());
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, instanceID,
          sizeof(instanceID), NULL);
-        todo_wine
         ok(ret, "SetupDiGetDeviceInstanceIdA failed: %08x\n", GetLastError());
-        todo_wine
         ok(!lstrcmpA(instanceID, "ROOT\\LEGACY_BOGUS\\0000"),
          "Unexpected instance ID %s\n", instanceID);
         ret = pSetupDiCreateDeviceInfoA(set, "LEGACY_BOGUS", &guid,
@@ -274,9 +265,7 @@ static void testGetDeviceInstanceId(void)
         ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError());
         ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, instanceID,
          sizeof(instanceID), NULL);
-        todo_wine
         ok(ret, "SetupDiGetDeviceInstanceIdA failed: %08x\n", GetLastError());
-        todo_wine
         ok(!lstrcmpA(instanceID, "ROOT\\LEGACY_BOGUS\\0001"),
          "Unexpected instance ID %s\n", instanceID);
         pSetupDiDestroyDeviceInfoList(set);




More information about the wine-cvs mailing list