- Initialise DevInst field in SP_DEVINFO_DATA. This field can be sent to CM_* functions (code still commented out in SetupDiCreateDeviceInfoListExW) - Fix an error when setting LoadOrderGroup in registry - Some FIXME -> ERR changes Modified: trunk/reactos/lib/setupapi/devinst.c Modified: trunk/reactos/lib/setupapi/install.c Modified: trunk/reactos/lib/setupapi/setupapi_private.h _____
Modified: trunk/reactos/lib/setupapi/devinst.c --- trunk/reactos/lib/setupapi/devinst.c 2005-11-16 05:40:35 UTC (rev 19260) +++ trunk/reactos/lib/setupapi/devinst.c 2005-11-16 09:41:01 UTC (rev 19261) @@ -618,7 +618,10 @@
PVOID Reserved) { struct DeviceInfoSet *list; + LPWSTR UNCServerName = NULL; DWORD rc; + //CONFIGRET cr; + HDEVINFO ret = (HDEVINFO)INVALID_HANDLE_VALUE;;
TRACE("%p %p %S %p\n", ClassGuid, hwndParent, MachineName, Reserved);
@@ -626,7 +629,7 @@ if (!list) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return (HDEVINFO)INVALID_HANDLE_VALUE; + goto cleanup; } memset(list, 0, sizeof(struct DeviceInfoSet));
@@ -644,17 +647,59 @@ if (rc != ERROR_SUCCESS) { SetLastError(rc); - HeapFree(GetProcessHeap(), 0, list); - return (HDEVINFO)INVALID_HANDLE_VALUE; + goto cleanup; } + UNCServerName = HeapAlloc(GetProcessHeap(), 0, (strlenW(MachineName) + 3) * sizeof(WCHAR)); + if (!UNCServerName) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto cleanup; + } + + strcpyW(UNCServerName + 2, MachineName); } else { + DWORD Size = MAX_PATH; list->HKLM = HKEY_LOCAL_MACHINE; + UNCServerName = HeapAlloc(GetProcessHeap(), 0, (MAX_PATH + 2) * sizeof(WCHAR)); + if (!UNCServerName) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto cleanup; + } + if (!GetComputerNameW(UNCServerName + 2, &Size)) + goto cleanup; } +#if 0 + UNCServerName[0] = UNCServerName[1] = '\'; + cr = CM_Connect_MachineW(UNCServerName, &list->hMachine); + if (cr != CR_SUCCESS) + { + switch (cr) + { + case CR_OUT_OF_MEMORY: rc = ERROR_NOT_ENOUGH_MEMORY; break; + case CR_INVALID_MACHINENAME: rc = ERROR_INVALID_COMPUTERNAME; break; + default: rc = ERROR_GEN_FAILURE; break; + } + SetLastError(rc); + goto cleanup; + } +#endif InitializeListHead(&list->DriverListHead); InitializeListHead(&list->ListHead); - return (HDEVINFO)list; + + ret = (HDEVINFO)list; + +cleanup: + if (ret == INVALID_HANDLE_VALUE) + { + if (list && list->HKLM != 0 && list->HKLM != HKEY_LOCAL_MACHINE) + RegCloseKey(list->HKLM); + HeapFree(GetProcessHeap(), 0, list); + } + HeapFree(GetProcessHeap(), 0, UNCServerName); + return ret; }
/*********************************************************************** @@ -691,12 +736,7 @@ memcpy(&DeviceInfoData->ClassGuid, &DevInfo->ClassGuid, sizeof(GUID)); - DeviceInfoData->DevInst = 0; /* FIXME */ - /* Note: this appears to be dangerous, passing a private - * pointer a heap-allocated datum to the caller. However, the - * expected lifetime of the device data is the same as the - * HDEVINFO; once that is closed, the data are no longer valid. - */ + DeviceInfoData->DevInst = (DWORD)list->hMachine; DeviceInfoData->Reserved = (ULONG_PTR)DevInfo; ret = TRUE; } @@ -1806,11 +1846,6 @@ &DevItf->InterfaceClassGuid, sizeof(GUID)); DeviceInterfaceData->Flags = 0; /* FIXME */ - /* Note: this appears to be dangerous, passing a private - * pointer a heap-allocated datum to the caller. However, the - * expected lifetime of the device data is the same as the - * HDEVINFO; once that is closed, the data are no longer valid. - */ DeviceInterfaceData->Reserved = (ULONG_PTR)DevItf; Found = TRUE; } @@ -1888,6 +1923,7 @@ } if (list->HKLM != HKEY_LOCAL_MACHINE) RegCloseKey(list->HKLM); + CM_Disconnect_Machine(list->hMachine); HeapFree(GetProcessHeap(), 0, list); return TRUE; } @@ -1997,6 +2033,7 @@ PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData) { + struct DeviceInfoSet *list; BOOL ret = FALSE;
TRACE("(%p, %p, %p, %ld, %p, %p): stub\n", DeviceInfoSet, @@ -2007,7 +2044,7 @@ SetLastError(ERROR_INVALID_PARAMETER); else if (DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE) SetLastError(ERROR_INVALID_HANDLE); - else if (((struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC) + else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC) SetLastError(ERROR_INVALID_HANDLE); else if (DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA)) SetLastError(ERROR_INVALID_USER_BUFFER); @@ -2041,12 +2078,7 @@ memcpy(&DeviceInfoData->ClassGuid, &deviceInterface->DeviceInfo->ClassGuid, sizeof(GUID)); - DeviceInfoData->DevInst = 0; /* FIXME */ - /* Note: this appears to be dangerous, passing a private - * pointer a heap-allocated datum to the caller. However, the - * expected lifetime of the device data is the same as the - * HDEVINFO; once that is closed, the data are no longer valid. - */ + DeviceInfoData->DevInst = (DWORD)list->hMachine; DeviceInfoData->Reserved = (ULONG_PTR)deviceInterface->DeviceInfo; } ret = TRUE; @@ -2323,7 +2355,7 @@
default: { - FIXME("Property 0x%lx not implemented\n", Property); + ERR("Property 0x%lx not implemented\n", Property); SetLastError(ERROR_NOT_SUPPORTED); } } @@ -2472,7 +2504,7 @@
default: { - FIXME("Property 0x%lx not implemented\n", Property); + ERR("Property 0x%lx not implemented\n", Property); SetLastError(ERROR_NOT_SUPPORTED); } } @@ -3010,8 +3042,8 @@ DefaultHandler = SetupDiSelectBestCompatDrv; break; default: - FIXME("Install function %ld not implemented\n", InstallFunction); - SetLastError(ERROR_INVALID_PARAMETER); + ERR("Install function %lu not supported\n", InstallFunction); + SetLastError(ERROR_NOT_SUPPORTED); }
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W); @@ -3809,7 +3841,6 @@ { struct DeviceInfoElement *deviceInfo;
- /* FIXME: ClassGuid can be NULL */ if (CreateDeviceInfoElement(DeviceName, ClassGuid, &deviceInfo)) { InsertTailList(&list->ListHead, &deviceInfo->ListEntry); @@ -3825,7 +3856,7 @@ else { memcpy(&DeviceInfoData->ClassGuid, ClassGuid, sizeof(GUID)); - DeviceInfoData->DevInst = 0; /* FIXME */ + DeviceInfoData->DevInst = (DWORD)list->hMachine; DeviceInfoData->Reserved = (ULONG_PTR)deviceInfo; ret = TRUE; } @@ -4728,8 +4759,10 @@ return FALSE; }
- /* FIXME: GUID_NULL is not allowed */ - if (!CreateDeviceInfoElement(DeviceInstanceId, &GUID_NULL /* FIXME */, &deviceInfo)) + /* FIXME: try to get ClassGUID from registry, instead of + * sending GUID_NULL to CreateDeviceInfoElement + */ + if (!CreateDeviceInfoElement(DeviceInstanceId, &GUID_NULL, &deviceInfo)) { RegCloseKey(hKey); return FALSE; @@ -4743,7 +4776,7 @@ if (ret && deviceInfo && DeviceInfoData) { memcpy(&DeviceInfoData->ClassGuid, &deviceInfo->ClassGuid, sizeof(GUID)); - DeviceInfoData->DevInst = 0; /* FIXME */ + DeviceInfoData->DevInst = (DWORD)list->hMachine; DeviceInfoData->Reserved = (ULONG_PTR)deviceInfo; } } _____
Modified: trunk/reactos/lib/setupapi/install.c --- trunk/reactos/lib/setupapi/install.c 2005-11-16 05:40:35 UTC (rev 19260) +++ trunk/reactos/lib/setupapi/install.c 2005-11-16 09:41:01 UTC (rev 19261) @@ -1252,13 +1252,11 @@
{ GroupOrder[0] = 0; } + GroupOrder[0]++; if (flags & SPSVCINST_TAGTOFRONT) GroupOrder[1] = tagId; else - { - GroupOrder[0]++; GroupOrder[bufferSize / sizeof(DWORD)] = tagId; - }
rc = RegSetValueExW( hGroupOrderListKey, _____
Modified: trunk/reactos/lib/setupapi/setupapi_private.h --- trunk/reactos/lib/setupapi/setupapi_private.h 2005-11-16 05:40:35 UTC (rev 19260) +++ trunk/reactos/lib/setupapi/setupapi_private.h 2005-11-16 09:41:01 UTC (rev 19261) @@ -133,6 +133,7 @@
DWORD magic; /* SETUP_DEV_INFO_SET_MAGIC */ GUID ClassGuid; /* If != GUID_NULL, only devices of this class can be in the device info set */ HKEY HKLM; /* Local or distant HKEY_LOCAL_MACHINE registry key */ + HMACHINE hMachine; /* Used in CM_* functions */
/* Reserved Field points to a struct DriverInfoElement */ SP_DEVINSTALL_PARAMS_W InstallParams;