From: Paul Gofman pgofman@codeweavers.com
--- dlls/cfgmgr32/tests/cfgmgr32.c | 29 +++++++++++- dlls/setupapi/devinst.c | 81 ++++++++++++++++++++++++++++++++++ dlls/setupapi/stubs.c | 40 ----------------- include/cfgmgr32.h | 2 + 4 files changed, 111 insertions(+), 41 deletions(-)
diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index f811410a6fd..1e949093689 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -128,7 +128,8 @@ static void test_CM_Get_Device_ID_List(void) SP_DEVINFO_DATA device = { sizeof(device) }; unsigned int i, count, expected_count; WCHAR wguid_str[64], id[128], *wbuf, *wp; - char guid_str[64], *buf, *p; + char guid_str[64], id_a[128], *buf, *p; + DEVINST devinst; CONFIGRET ret; HDEVINFO set; ULONG len; @@ -209,6 +210,19 @@ static void test_CM_Get_Device_ID_List(void) } SetupDiDestroyDeviceInfoList(set); expected_count = i; + ok(expected_count, "got 0.\n"); + + wcscpy(id, L"q"); + devinst = 0xdeadbeef; + ret = CM_Locate_DevNodeW(&devinst, id, 0); + todo_wine_if(ret == CR_NO_SUCH_DEVNODE) ok(ret == CR_INVALID_DEVICE_ID, "got %#lx.\n", ret); + ok(!devinst, "got %#lx.\n", devinst); + + wcscpy(id, instances[0].id); + id[0] = 'Q'; + ret = CM_Locate_DevNodeW(&devinst, id, 0); + ok(ret == CR_NO_SUCH_DEVNODE, "got %#lx.\n", ret); + for (i = 0; i < expected_count; ++i) { DEVPROPTYPE type; @@ -223,6 +237,19 @@ static void test_CM_Get_Device_ID_List(void) ok(!ret || ret == CR_NO_SUCH_VALUE, "got %#lx.\n", ret); if (!ret) ok(type == DEVPROP_TYPE_UINT64, "got %#lx.\n", type); + + devinst = 0xdeadbeef; + ret = CM_Locate_DevNodeW(&devinst, instances[i].id, 0); + ok(!ret, "got %#lx, id %s.\n", ret, debugstr_w(instances[i].id)); + ok(devinst == instances[i].inst, "got %#lx, expected %#lx.\n", devinst, instances[i].inst); + p = id_a; + wp = instances[i].id; + while((*p++ = *wp++)) + ; + devinst = 0xdeadbeef; + ret = CM_Locate_DevNodeA(&devinst, id_a, 0); + ok(!ret, "got %#lx, id %s.\n", ret, debugstr_a(id_a)); + ok(devinst == instances[i].inst, "got %#lx, expected %#lx.\n", devinst, instances[i].inst); }
memset(wbuf, 0xcc, len * sizeof(*wbuf)); diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 4947d664583..596c6fcd90d 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -4289,6 +4289,87 @@ CONFIGRET WINAPI CM_Get_Device_ID_Size(ULONG *len, DEVINST devnode, ULONG flags) return CR_SUCCESS; }
+/*********************************************************************** + * CM_Locate_DevNodeA (SETUPAPI.@) + */ +CONFIGRET WINAPI CM_Locate_DevNodeA(DEVINST *devinst, DEVINSTID_A device_id, ULONG flags) +{ + TRACE("%p %s %#lx.\n", devinst, debugstr_a(device_id), flags); + + return CM_Locate_DevNode_ExA(devinst, device_id, flags, NULL); +} + +/*********************************************************************** + * CM_Locate_DevNodeW (SETUPAPI.@) + */ +CONFIGRET WINAPI CM_Locate_DevNodeW(DEVINST *devinst, DEVINSTID_W device_id, ULONG flags) +{ + TRACE("%p %s %#lx.\n", devinst, debugstr_w(device_id), flags); + + return CM_Locate_DevNode_ExW(devinst, device_id, flags, NULL); +} + +/*********************************************************************** + * CM_Locate_DevNode_ExA (SETUPAPI.@) + */ +CONFIGRET WINAPI CM_Locate_DevNode_ExA(DEVINST *devinst, DEVINSTID_A device_id, ULONG flags, HMACHINE machine) +{ + CONFIGRET ret; + DEVINSTID_W device_idw; + unsigned int slen; + + TRACE("%p %s %#lx %p.\n", devinst, debugstr_a(device_id), flags, machine); + + if (!device_id) + { + FIXME("NULL device_id unsupported.\n"); + return CR_CALL_NOT_IMPLEMENTED; + } + + slen = strlen(device_id) + 1; + if (!(device_idw = malloc(slen * sizeof(*device_idw)))) + return CR_OUT_OF_MEMORY; + + MultiByteToWideChar(CP_ACP, 0, device_id, slen, device_idw, slen); + ret = CM_Locate_DevNode_ExW(devinst, device_idw, flags, NULL); + free(device_idw); + return ret; +} + +/*********************************************************************** + * CM_Locate_DevNode_ExW (SETUPAPI.@) + */ +CONFIGRET WINAPI CM_Locate_DevNode_ExW(DEVINST *devinst, DEVINSTID_W device_id, ULONG flags, HMACHINE machine) +{ + DEVINST ret; + + TRACE("%p %s %#lx %p.\n", devinst, debugstr_w(device_id), flags, machine); + + if (!devinst) + return CR_INVALID_POINTER; + + *devinst = 0; + + if (machine) + FIXME("machine %p not supported.\n", machine); + if (flags) + FIXME("flags %#lx are not supported.\n", flags); + + if (!device_id) + { + FIXME("NULL device_id unsupported.\n"); + return CR_CALL_NOT_IMPLEMENTED; + } + + if ((ret = get_devinst_for_device_id(device_id)) < devinst_table_size && devinst_table[ret]) + { + *devinst = ret; + return CR_SUCCESS; + } + + return CR_NO_SUCH_DEVNODE; +} + static CONFIGRET get_device_id_list(const WCHAR *filter, WCHAR *buffer, ULONG *len, ULONG flags) { const ULONG supported_flags = CM_GETIDLIST_FILTER_NONE | CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT; diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c index 419168d0f1e..0766b1364bf 100644 --- a/dlls/setupapi/stubs.c +++ b/dlls/setupapi/stubs.c @@ -267,46 +267,6 @@ BOOL WINAPI SetupDiGetClassImageIndex(PSP_CLASSIMAGELIST_DATA ClassImageListData return FALSE; }
-/*********************************************************************** - * CM_Locate_DevNodeA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Locate_DevNodeA(PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, ULONG ulFlags) -{ - FIXME("%p %s 0x%08lx: stub\n", pdnDevInst, debugstr_a(pDeviceID), ulFlags); - - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Locate_DevNodeW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Locate_DevNodeW(PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags) -{ - FIXME("%p %s 0x%08lx: stub\n", pdnDevInst, debugstr_w(pDeviceID), ulFlags); - - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Locate_DevNode_ExA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Locate_DevNode_ExA(PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, ULONG ulFlags, HMACHINE hMachine) -{ - FIXME("%p %s 0x%08lx %p: stub\n", pdnDevInst, debugstr_a(pDeviceID), ulFlags, hMachine); - - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Locate_DevNode_ExW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Locate_DevNode_ExW(PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, ULONG ulFlags, HMACHINE hMachine) -{ - FIXME("%p %s 0x%08lx %p: stub\n", pdnDevInst, debugstr_w(pDeviceID), ulFlags, hMachine); - - return CR_FAILURE; -} - /*********************************************************************** * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@) */ diff --git a/include/cfgmgr32.h b/include/cfgmgr32.h index 90e25aac4f5..7f1036f3510 100644 --- a/include/cfgmgr32.h +++ b/include/cfgmgr32.h @@ -322,7 +322,9 @@ CMAPI CONFIGRET WINAPI CM_Get_Sibling(PDEVINST,DEVINST,ULONG); CMAPI CONFIGRET WINAPI CM_Get_Sibling_Ex(PDEVINST pdnDevInst, DEVINST DevInst, ULONG ulFlags, HMACHINE hMachine); CMAPI WORD WINAPI CM_Get_Version(void); CMAPI CONFIGRET WINAPI CM_Locate_DevNodeA(PDEVINST,DEVINSTID_A,ULONG); +CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExA(PDEVINST,DEVINSTID_A,ULONG,HMACHINE); CMAPI CONFIGRET WINAPI CM_Locate_DevNodeW(PDEVINST,DEVINSTID_W,ULONG); +CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExW(PDEVINST,DEVINSTID_W,ULONG,HMACHINE); #define CM_Locate_DevNode WINELIB_NAME_AW(CM_Locate_DevNode) CMAPI DWORD WINAPI CM_MapCrToWin32Err(CONFIGRET,DWORD); CMAPI CONFIGRET WINAPI CM_Open_DevNode_Key(DEVINST dnDevInst, REGSAM access, ULONG ulHardwareProfile,