Author: cgutman Date: Sun Aug 11 19:57:47 2013 New Revision: 59699
URL: http://svn.reactos.org/svn/reactos?rev=59699&view=rev Log: [UMPNPMGR] - Handle the CM_CREATE_DEVNODE_GENERATE_ID flag [SETUPAPI] - Use the correct ID (the newly generated instance ID) when creating the device info if the DICD_GENERATE_ID flag was passed in
Modified: trunk/reactos/base/services/umpnpmgr/umpnpmgr.c trunk/reactos/dll/win32/setupapi/cfgmgr.c trunk/reactos/dll/win32/setupapi/devinst.c
Modified: trunk/reactos/base/services/umpnpmgr/umpnpmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/umpnpmgr/umpn... ============================================================================== --- trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] (original) +++ trunk/reactos/base/services/umpnpmgr/umpnpmgr.c [iso-8859-1] Sun Aug 11 19:57:47 2013 @@ -1613,16 +1613,42 @@
if (ulFlags & CM_CREATE_DEVNODE_GENERATE_ID) { - /* FIXME */ - DPRINT1("CM_CREATE_DEVNODE_GENERATE_ID support not implemented yet!\n", ret); - ret = CR_CALL_NOT_IMPLEMENTED; - goto done; - } - - /* Create the device instance */ - ret = CreateDeviceInstance(pszDeviceID); - -done:; + WCHAR szGeneratedInstance[MAX_DEVICE_ID_LEN]; + DWORD dwInstanceNumber; + + /* Generated ID is: Root<Device ID><Instance number> */ + dwInstanceNumber = 0; + do + { + swprintf(szGeneratedInstance, L"Root\%ls\%04d", + pszDeviceID, dwInstanceNumber); + + /* Try to create a device instance with this ID */ + ret = CreateDeviceInstance(szGeneratedInstance); + + dwInstanceNumber++; + } + while (ret == CR_ALREADY_SUCH_DEVINST); + + if (ret == CR_SUCCESS) + { + /* pszDeviceID is an out parameter too for generated IDs */ + if (wcslen(szGeneratedInstance) > ulLength) + { + ret = CR_BUFFER_SMALL; + } + else + { + wcscpy(pszDeviceID, szGeneratedInstance); + } + } + } + else + { + /* Create the device instance */ + ret = CreateDeviceInstance(pszDeviceID); + } + DPRINT("PNP_CreateDevInst() done (returns %lx)\n", ret);
return ret;
Modified: trunk/reactos/dll/win32/setupapi/cfgmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/cfgmgr.c... ============================================================================== --- trunk/reactos/dll/win32/setupapi/cfgmgr.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/setupapi/cfgmgr.c [iso-8859-1] Sun Aug 11 19:57:47 2013 @@ -681,7 +681,9 @@
if (ret == CR_SUCCESS) { - *pdnDevInst = pSetupStringTableAddString(StringTable, pDeviceID, 1); + /* If CM_CREATE_DEVINST_GENERATE_ID was passed in, PNP_CreateDevInst + * will return the generated device ID in szLocalDeviceID */ + *pdnDevInst = pSetupStringTableAddString(StringTable, szLocalDeviceID, 1); if (*pdnDevInst == 0) ret = CR_NO_SUCH_DEVNODE; }
Modified: trunk/reactos/dll/win32/setupapi/devinst.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/devinst.... ============================================================================== --- trunk/reactos/dll/win32/setupapi/devinst.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/setupapi/devinst.c [iso-8859-1] Sun Aug 11 19:57:47 2013 @@ -1727,6 +1727,7 @@ CONFIGRET cr; DEVINST RootDevInst; DEVINST DevInst; + WCHAR GenInstanceId[MAX_DEVICE_ID_LEN];
TRACE("%p %s %s %s %p %x %p\n", DeviceInfoSet, debugstr_w(DeviceName), debugstr_guid(ClassGuid), debugstr_w(DeviceDescription), @@ -1787,6 +1788,24 @@ { SetLastError(GetErrorCodeFromCrCode(cr)); return FALSE; + } + + if (CreationFlags & DICD_GENERATE_ID) + { + /* Grab the actual instance ID that was created */ + cr = CM_Get_Device_ID_Ex(DevInst, + GenInstanceId, + MAX_DEVICE_ID_LEN, + 0, + set->hMachine); + if (cr != CR_SUCCESS) + { + SetLastError(GetErrorCodeFromCrCode(cr)); + return FALSE; + } + + DeviceName = GenInstanceId; + TRACE("Using generated instance ID: %s\n", debugstr_w(DeviceName)); }
if (CreateDeviceInfo(set, DeviceName, ClassGuid, &deviceInfo))