From: Hervé Poussineau Date: Mon, 19 Dec 2005 10:15:06 +0000 (+0000) Subject: Implement SetupDiInstallClassExA X-Git-Tag: backups/expat-rbuild@40467~857 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=8cf0eb4663eea3c5d858c73cad473cd17ff0edf7 Implement SetupDiInstallClassExA Implement parts of SetupDiInstallClassExW svn path=/trunk/; revision=20267 --- diff --git a/reactos/lib/setupapi/devinst.c b/reactos/lib/setupapi/devinst.c index cd11434e651..ff48c61ad4a 100644 --- a/reactos/lib/setupapi/devinst.c +++ b/reactos/lib/setupapi/devinst.c @@ -2913,31 +2913,67 @@ BOOL WINAPI SetupDiSetDeviceRegistryPropertyW( return ret; } + /*********************************************************************** * SetupDiInstallClassA (SETUPAPI.@) */ BOOL WINAPI SetupDiInstallClassA( - HWND hwndParent, - PCSTR InfFileName, - DWORD Flags, - HSPFILEQ FileQueue) + IN HWND hwndParent OPTIONAL, + IN PCSTR InfFileName, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL) +{ + return SetupDiInstallClassExA(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL); +} + + +/*********************************************************************** + * SetupDiInstallClassW (SETUPAPI.@) + */ +BOOL WINAPI SetupDiInstallClassW( + IN HWND hwndParent OPTIONAL, + IN PCWSTR InfFileName, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL) +{ + return SetupDiInstallClassExW(hwndParent, InfFileName, Flags, FileQueue, NULL, NULL, NULL); +} + + +/*********************************************************************** + * SetupDiInstallClassExA (SETUPAPI.@) + */ +BOOL WINAPI SetupDiInstallClassExA( + IN HWND hwndParent OPTIONAL, + IN PCSTR InfFileName OPTIONAL, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL, + IN const GUID* InterfaceClassGuid OPTIONAL, + IN PVOID Reserved1, + IN PVOID Reserved2) { - UNICODE_STRING FileNameW; + PWSTR InfFileNameW = NULL; BOOL Result; - if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName)) + if (InfFileName) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; + InfFileNameW = MultiByteToUnicode(InfFileName, CP_ACP); + if (InfFileNameW == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } } - Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue); + Result = SetupDiInstallClassExW(hwndParent, InfFileNameW, Flags, + FileQueue, InterfaceClassGuid, Reserved1, Reserved2); - RtlFreeUnicodeString(&FileNameW); + MyFree(InfFileNameW); return Result; } + static HKEY CreateClassKey(HINF hInf) { WCHAR FullBuffer[MAX_PATH]; @@ -3002,103 +3038,131 @@ static HKEY CreateClassKey(HINF hInf) return hClassKey; } + /*********************************************************************** - * SetupDiInstallClassW (SETUPAPI.@) + * SetupDiInstallClassExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiInstallClassW( - HWND hwndParent, - PCWSTR InfFileName, - DWORD Flags, - HSPFILEQ FileQueue) +BOOL WINAPI SetupDiInstallClassExW( + IN HWND hwndParent OPTIONAL, + IN PCWSTR InfFileName OPTIONAL, + IN DWORD Flags, + IN HSPFILEQ FileQueue OPTIONAL, + IN const GUID* InterfaceClassGuid OPTIONAL, + IN PVOID Reserved1, + IN PVOID Reserved2) { - WCHAR SectionName[MAX_PATH]; - DWORD SectionNameLength = 0; - HINF hInf; - BOOL bFileQueueCreated = FALSE; - HKEY hClassKey; - - TRACE("%p %s 0x%lx %p\n", hwndParent, debugstr_w(InfFileName), - Flags, FileQueue); + BOOL ret = FALSE; - FIXME("not fully implemented\n"); + TRACE("%p %s 0x%lx %p %s %p %p\n", hwndParent, debugstr_w(InfFileName), Flags, + FileQueue, debugstr_guid(InterfaceClassGuid), Reserved1, Reserved2); - if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - /* Open the .inf file */ - hInf = SetupOpenInfFileW(InfFileName, - NULL, - INF_STYLE_WIN4, - NULL); - if (hInf == INVALID_HANDLE_VALUE) + if (!InfFileName && !InterfaceClassGuid) + SetLastError(ERROR_INVALID_PARAMETER); + else if (InfFileName && InterfaceClassGuid) + SetLastError(ERROR_INVALID_PARAMETER); + else if (Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)) { - - return FALSE; + TRACE("Unknown flags: 0x%08lx\n", Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)); + SetLastError(ERROR_INVALID_FLAGS); } - - /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */ - hClassKey = CreateClassKey(hInf); - if (hClassKey == INVALID_HANDLE_VALUE) + else if ((Flags & DI_NOVCP) && FileQueue == NULL) + SetLastError(ERROR_INVALID_PARAMETER); + else if (Reserved1 != NULL) + SetLastError(ERROR_INVALID_PARAMETER); + else if (Reserved2 != NULL) + SetLastError(ERROR_INVALID_PARAMETER); + else { - SetupCloseInfFile(hInf); - return FALSE; - } + WCHAR SectionName[MAX_PATH]; + HINF hInf = INVALID_HANDLE_VALUE; + HKEY hClassKey = INVALID_HANDLE_VALUE; + PVOID callback_context = NULL; + if (InterfaceClassGuid) + { + /* Retrieve the actual section name */ + ret = SetupDiGetActualSectionToInstallW(hInf, + InterfaceInstall32, + SectionName, + MAX_PATH, + NULL, + NULL); + if (!ret) + goto cleanup; + FIXME("Installing an interface is not implemented\n"); + } + else + { + if (Flags & DI_NOVCP) + FIXME("FileQueue argument ignored\n"); + if (Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)) + FIXME("Flags 0x%lx ignored\n", Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)); - /* Try to append a layout file */ -#if 0 - SetupOpenAppendInfFileW(NULL, hInf, NULL); -#endif + /* Open the .inf file */ + hInf = SetupOpenInfFileW( + InfFileName, + NULL, + INF_STYLE_WIN4, + NULL); + if (hInf == INVALID_HANDLE_VALUE) + goto cleanup; - /* Retrieve the actual section name */ - SetupDiGetActualSectionToInstallW(hInf, - ClassInstall32, - SectionName, - MAX_PATH, - &SectionNameLength, - NULL); + /* Create or open the class registry key 'HKLM\CurrentControlSet\Class\{GUID}' */ + hClassKey = CreateClassKey(hInf); + if (hClassKey == INVALID_HANDLE_VALUE) + goto cleanup; -#if 0 - if (!(Flags & DI_NOVCP)) - { - FileQueue = SetupOpenFileQueue(); - if (FileQueue == INVALID_HANDLE_VALUE) - { - SetupCloseInfFile(hInf); - RegCloseKey(hClassKey); - return FALSE; - } + /* Try to append a layout file */ + ret = SetupOpenAppendInfFileW(NULL, hInf, NULL); + if (!ret) + goto cleanup; - bFileQueueCreated = TRUE; + /* Retrieve the actual section name */ + ret = SetupDiGetActualSectionToInstallW( + hInf, + ClassInstall32, + SectionName, + MAX_PATH, + NULL, + NULL); + if (!ret) + goto cleanup; - } -#endif + callback_context = SetupInitDefaultQueueCallback(hwndParent); + if (!callback_context) + goto cleanup; - SetupInstallFromInfSectionW(NULL, - hInf, - SectionName, - SPINST_REGISTRY, - hClassKey, - NULL, - 0, - NULL, - NULL, - INVALID_HANDLE_VALUE, - NULL); + ret = SetupInstallFromInfSectionW( + hwndParent, + hInf, + SectionName, + SPINST_REGISTRY | SPINST_FILES | SPINST_BITREG | SPINST_INIFILES | SPINST_INI2REG, + hClassKey, + NULL, /* SourceRootPath */ + 0, /* CopyFlags */ + SetupDefaultQueueCallbackW, + callback_context, + NULL, + NULL); + if (!ret) + goto cleanup; - /* FIXME: Process InterfaceInstall32 section */ + /* FIXME: Install .Services section */ - if (bFileQueueCreated) - SetupCloseFileQueue(FileQueue); + ret = TRUE; + } - SetupCloseInfFile(hInf); +cleanup: + if (hInf != INVALID_HANDLE_VALUE) + SetupCloseInfFile(hInf); + if (hClassKey != INVALID_HANDLE_VALUE) + RegCloseKey(hClassKey); + SetupTermDefaultQueueCallback(callback_context); + } - RegCloseKey(hClassKey); - return TRUE; + TRACE("Returning %d\n", ret); + return ret; } @@ -4639,7 +4703,6 @@ HKEY WINAPI SetupDiOpenDevRegKey( if (KeyType == DIREG_DEV) { /* We're done. Just return the hKey handle */ - CHECKPOINT1; ret = hKey; goto cleanup; } @@ -7213,7 +7276,7 @@ nextservice: rc = RegSetValueEx(hKey, REGSTR_VAL_DEVDESC, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR)); if (rc == ERROR_SUCCESS) rc = RegSetValueEx(hKey, REGSTR_VAL_MFG, 0, REG_SZ, (const BYTE *)SelectedDriver->Info.MfgName, (wcslen(SelectedDriver->Info.MfgName) + 1) * sizeof(WCHAR)); - if (rc == ERROR_SUCCESS && *AssociatedService) + if (rc == ERROR_SUCCESS && AssociatedService && *AssociatedService) rc = RegSetValueEx(hKey, REGSTR_VAL_SERVICE, 0, REG_SZ, (const BYTE *)AssociatedService, (wcslen(AssociatedService) + 1) * sizeof(WCHAR)); if (rc != ERROR_SUCCESS) { diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec index 023646da2df..12f8583311b 100644 --- a/reactos/lib/setupapi/setupapi.spec +++ b/reactos/lib/setupapi/setupapi.spec @@ -348,8 +348,8 @@ @ stdcall SetupDiGetSelectedDriverW(ptr ptr ptr) @ stub SetupDiGetWizardPage @ stdcall SetupDiInstallClassA(long str long ptr) -@ stub SetupDiInstallClassExA -@ stub SetupDiInstallClassExW +@ stdcall SetupDiInstallClassExA(long str long ptr ptr ptr ptr) +@ stdcall SetupDiInstallClassExW(long wstr long ptr ptr ptr ptr) @ stdcall SetupDiInstallClassW(long wstr long ptr) @ stdcall SetupDiInstallDevice(ptr ptr) @ stdcall SetupDiInstallDeviceInterfaces(ptr ptr)