/* performs a setupapi-level install of the INF file */ static HRESULT spapi_install(const ADVInfo *info) { BOOL ret; HRESULT res; PVOID context; context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, NULL); if (!context) return ADV_HRESULT(GetLastError()); ret = SetupInstallFromInfSectionW(NULL, info->hinf, info->install_sec, SPINST_FILES, NULL, info->working_dir, SP_COPY_NEWER, SetupDefaultQueueCallbackW, context, NULL, NULL); if (!ret) { res = ADV_HRESULT(GetLastError()); SetupTermDefaultQueueCallback(context); return res; } SetupTermDefaultQueueCallback(context); ret = SetupInstallFromInfSectionW(NULL, info->hinf, info->install_sec, SPINST_INIFILES | SPINST_REGISTRY | SPINST_REGSVR, HKEY_LOCAL_MACHINE, NULL, 0, NULL, NULL, NULL, NULL); if (!ret) return ADV_HRESULT(GetLastError()); return S_OK; }
/* Install a section of a .inf file * Returns TRUE if success, FALSE if failure. Error code can * be retrieved with GetLastError() */ static BOOL InstallInfSection( IN HWND hWnd, IN LPCWSTR InfFile, IN LPCWSTR InfSection OPTIONAL, IN LPCWSTR InfService OPTIONAL) { WCHAR Buffer[MAX_PATH]; HINF hInf = INVALID_HANDLE_VALUE; UINT BufferSize; PVOID Context = NULL; BOOL ret = FALSE; /* Get Windows directory */ BufferSize = MAX_PATH - 5 - wcslen(InfFile); if (GetWindowsDirectoryW(Buffer, BufferSize) > BufferSize) { /* Function failed */ SetLastError(ERROR_GEN_FAILURE); goto cleanup; } /* We have enough space to add some information in the buffer */ if (Buffer[wcslen(Buffer) - 1] != '\\') wcscat(Buffer, L"\\"); wcscat(Buffer, L"Inf\\"); wcscat(Buffer, InfFile); /* Install specified section */ hInf = SetupOpenInfFileW(Buffer, NULL, INF_STYLE_WIN4, NULL); if (hInf == INVALID_HANDLE_VALUE) goto cleanup; Context = SetupInitDefaultQueueCallback(hWnd); if (Context == NULL) goto cleanup; ret = TRUE; if (ret && InfSection) { ret = SetupInstallFromInfSectionW( hWnd, hInf, InfSection, SPINST_ALL, NULL, NULL, SP_COPY_NEWER, SetupDefaultQueueCallbackW, Context, NULL, NULL); } if (ret && InfService) { ret = SetupInstallServicesFromInfSectionW( hInf, InfService, 0); } cleanup: if (Context) SetupTermDefaultQueueCallback(Context); if (hInf != INVALID_HANDLE_VALUE) SetupCloseInfFile(hInf); return ret; }
static VOID SaveFontSubstitutionSettings( HWND hwnd, PGLOBALDATA pGlobalData) { WCHAR szDefCP[5 + 1], szSection[MAX_PATH], szDPI[3 + 1]; HINF hFontInf; UINT Count; GetLocaleInfoW(MAKELCID(pGlobalData->SystemLCID, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, szDefCP, sizeof(szDefCP) / sizeof(WCHAR)); GetCurrentDPI(szDPI); wsprintf(szSection, L"Font.CP%s.%s", szDefCP, szDPI); hFontInf = SetupOpenInfFileW(L"font.inf", NULL, INF_STYLE_WIN4, NULL); if (hFontInf == INVALID_HANDLE_VALUE) return; if (!SetupOpenAppendInfFile(NULL, hFontInf, NULL)) { SetupCloseInfFile(hFontInf); return; } Count = (UINT) SetupGetLineCount(hFontInf, szSection); if (Count <= 0) return; if (!SetupInstallFromInfSectionW(hwnd, hFontInf, szSection, SPINST_REGISTRY & ~SPINST_FILES, NULL, NULL, 0, NULL, NULL, NULL, NULL)) MessageBoxW(hwnd, L"Unable to install a new language for programs don't support unicode!", NULL, MB_ICONERROR | MB_OK); SetupCloseInfFile(hFontInf); }
DWORD MMSYS_InstallDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pspDevInfoData) { UINT Length; LPWSTR pBuffer; WCHAR szBuffer[MAX_PATH]; HINF hInf; PVOID Context; BOOL Result; SC_HANDLE hSCManager, hService; WCHAR WaveName[20]; HKEY hKey; DWORD BufferSize; ULONG Index; if (!IsEqualIID(&pspDevInfoData->ClassGuid, &GUID_DEVCLASS_SOUND) && !IsEqualIID(&pspDevInfoData->ClassGuid, &GUID_DEVCLASS_MEDIA)) return ERROR_DI_DO_DEFAULT; Length = GetWindowsDirectoryW(szBuffer, MAX_PATH); if (!Length || Length >= MAX_PATH - 14) { return ERROR_GEN_FAILURE; } pBuffer = PathAddBackslashW(szBuffer); if (!pBuffer) { return ERROR_GEN_FAILURE; } wcscpy(pBuffer, L"inf\\audio.inf"); hInf = SetupOpenInfFileW(szBuffer, NULL, INF_STYLE_WIN4, NULL); if (hInf == INVALID_HANDLE_VALUE) { return ERROR_GEN_FAILURE; } Context = SetupInitDefaultQueueCallback(NULL); if (Context == NULL) { SetupCloseInfFile(hInf); return ERROR_GEN_FAILURE; } Result = SetupInstallFromInfSectionW(NULL, hInf, L"AUDIO_Inst.NT", SPINST_ALL, NULL, NULL, SP_COPY_NEWER, SetupDefaultQueueCallbackW, Context, NULL, NULL); if (Result) { Result = SetupInstallServicesFromInfSectionW(hInf, L"Audio_Inst.NT.Services", 0); } SetupTermDefaultQueueCallback(Context); SetupCloseInfFile(hInf); hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (!hSCManager) { return ERROR_DI_DO_DEFAULT; } hService = OpenService(hSCManager, L"RosAudioSrv", SERVICE_ALL_ACCESS); if (hService) { /* Make RosAudioSrv start automatically */ ChangeServiceConfig(hService, SERVICE_NO_CHANGE, SERVICE_AUTO_START, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); StartService(hService, 0, NULL); CloseServiceHandle(hService); } CloseServiceHandle(hSCManager); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, GENERIC_READ | GENERIC_WRITE, &hKey) == ERROR_SUCCESS) { szBuffer[Length] = '\0'; pBuffer = PathAddBackslashW(szBuffer); wcscpy(pBuffer, L"system32\\wdmaud.drv"); for(Index = 1; Index <= 4; Index++) { swprintf(WaveName, L"wave%u", Index); if (RegQueryValueExW(hKey, WaveName, 0, NULL, NULL, &BufferSize) != ERROR_MORE_DATA) { /* Store new audio driver entry */ RegSetValueExW(hKey, WaveName, 0, REG_SZ, (LPBYTE)szBuffer, (wcslen(szBuffer)+1) * sizeof(WCHAR)); break; } else { WCHAR Buffer[MAX_PATH]; BufferSize = sizeof(Buffer); if (RegQueryValueExW(hKey, WaveName, 0, NULL, (LPBYTE)Buffer, &BufferSize) == ERROR_SUCCESS) { /* Make sure the buffer is zero terminated */ Buffer[MAX_PATH-1] = L'\0'; if (!wcsicmp(Buffer, szBuffer)) { /* An entry already exists */ break; } } } } RegCloseKey(hKey); } InstallSystemSoundScheme(); return ERROR_DI_DO_DEFAULT; }
DWORD WINAPI InstallLiveCD(IN HINSTANCE hInstance) { STARTUPINFOW StartupInfo; PROCESS_INFORMATION ProcessInformation; BOOL bRes; if (!CommonInstall()) goto error; /* Register components */ _SEH2_TRY { if (!SetupInstallFromInfSectionW(NULL, hSysSetupInf, L"RegistrationPhase2", SPINST_ALL, 0, NULL, 0, NULL, NULL, NULL, NULL)) { DPRINT1("SetupInstallFromInfSectionW failed!\n"); } RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries"); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { DPRINT1("Catching exception\n"); } _SEH2_END; SetupCloseInfFile(hSysSetupInf); /* Run the shell */ ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(StartupInfo); bRes = CreateProcessW( L"userinit.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInformation); if (!bRes) goto error; CloseHandle(ProcessInformation.hThread); CloseHandle(ProcessInformation.hProcess); return 0; error: MessageBoxW( NULL, L"Failed to load LiveCD! You can shutdown your computer, or press ENTER to reboot.", L"ReactOS LiveCD", MB_OK); return 0; }
static BOOL InstallSysSetupInfComponents(VOID) { INFCONTEXT InfContext; WCHAR szNameBuffer[256]; WCHAR szSectionBuffer[256]; HINF hComponentInf = INVALID_HANDLE_VALUE; if (!SetupFindFirstLineW(hSysSetupInf, L"Infs.Always", NULL, &InfContext)) { DPRINT("No Inf.Always section found\n"); } else { do { if (!SetupGetStringFieldW(&InfContext, 1, // Get the component name szNameBuffer, sizeof(szNameBuffer)/sizeof(szNameBuffer[0]), NULL)) { FatalError("Error while trying to get component name \n"); return FALSE; } if (!SetupGetStringFieldW(&InfContext, 2, // Get the component install section szSectionBuffer, sizeof(szSectionBuffer)/sizeof(szSectionBuffer[0]), NULL)) { FatalError("Error while trying to get component install section \n"); return FALSE; } DPRINT("Trying to execute install section '%S' from '%S' \n", szSectionBuffer, szNameBuffer); hComponentInf = SetupOpenInfFileW(szNameBuffer, NULL, INF_STYLE_WIN4, NULL); if (hComponentInf == INVALID_HANDLE_VALUE) { FatalError("SetupOpenInfFileW() failed to open '%S' (Error: %lu)\n", szNameBuffer, GetLastError()); return FALSE; } if (!SetupInstallFromInfSectionW(NULL, hComponentInf, szSectionBuffer, SPINST_ALL, NULL, NULL, SP_COPY_NEWER, SetupDefaultQueueCallbackW, NULL, NULL, NULL)) { FatalError("Error while trying to install : %S (Error: %lu)\n", szNameBuffer, GetLastError()); SetupCloseInfFile(hComponentInf); return FALSE; } SetupCloseInfFile(hComponentInf); } while (SetupFindNextLine(&InfContext, &InfContext)); } return TRUE; }
VOID InstallDeviceData(IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) { HKEY hKey = NULL; HINF hInf = INVALID_HANDLE_VALUE; SP_DRVINFO_DATA DriverInfoData; PSP_DRVINFO_DETAIL_DATA DriverInfoDetailData; WCHAR InfSectionWithExt[256]; BYTE buffer[2048]; DWORD dwRequired; TRACE("InstallDeviceData()\n"); hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL); if (hKey == NULL) goto done; DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA); if (!SetupDiGetSelectedDriverW(DeviceInfoSet, DeviceInfoData, &DriverInfoData)) { goto done; } DriverInfoDetailData = (PSP_DRVINFO_DETAIL_DATA)buffer; DriverInfoDetailData->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA); if (!SetupDiGetDriverInfoDetailW(DeviceInfoSet, DeviceInfoData, &DriverInfoData, DriverInfoDetailData, 2048, &dwRequired)) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) goto done; } TRACE("Inf file name: %S\n", DriverInfoDetailData->InfFileName); hInf = SetupOpenInfFileW(DriverInfoDetailData->InfFileName, NULL, INF_STYLE_WIN4, NULL); if (hInf == INVALID_HANDLE_VALUE) goto done; TRACE("Section name: %S\n", DriverInfoDetailData->SectionName); SetupDiGetActualSectionToInstallW(hInf, DriverInfoDetailData->SectionName, InfSectionWithExt, 256, NULL, NULL); TRACE("InfSectionWithExt: %S\n", InfSectionWithExt); SetupInstallFromInfSectionW(NULL, hInf, InfSectionWithExt, SPINST_REGISTRY, hKey, NULL, 0, NULL, NULL, NULL, NULL); TRACE("Done\n"); done:; if (hKey != NULL) RegCloseKey(hKey); if (hInf != INVALID_HANDLE_VALUE) SetupCloseInfFile(hInf); }