/** * Executes a sepcified .INF section to install/uninstall drivers and/or services. * * @return Exit code (EXIT_OK, EXIT_FAIL) * @param pszSection Section to execute; usually it's "DefaultInstall". * @param iMode Execution mode to use (see MSDN). * @param pszInf Full qualified path of the .INF file to use. */ int ExecuteInfFile(const _TCHAR *pszSection, int iMode, const _TCHAR *pszInf) { _tprintf(_T("Executing INF-File: %ws (Section: %ws) ...\n"), pszInf, pszSection); /* Executed by the installer that already has proper privileges. */ _TCHAR szCommandLine[_MAX_PATH + 1] = { 0 }; swprintf(szCommandLine, sizeof(szCommandLine), TEXT( "%ws %d %ws" ), pszSection, iMode, pszInf); #ifdef DEBUG _tprintf (_T( "Commandline: %ws\n"), szCommandLine); #endif InstallHinfSection(NULL, NULL, szCommandLine, SW_SHOW); /* No return value given! */ return EXIT_OK; }
HRESULT OPEN(PCTSTR ptzDir, PCTSTR ptzFile, BOOL bSubDir = FALSE) { HRESULT hResult = ERROR_FILE_NOT_FOUND; // Lookup WIN32_FIND_DATA fd; TCHAR tzPath[MAX_PATH]; UStrPrint(tzPath, TEXT("%s\\%s"), ptzDir, ptzFile); HANDLE hFind = FindFirstFile(tzPath, &fd); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { UStrPrint(tzPath, TEXT("%s\\%s"), ptzDir, fd.cFileName); // Take action PTSTR ptzExt = UStrRChr(fd.cFileName, '.'); if (ptzExt) { if ((UStrCmpI(ptzExt, TEXT(".csc")) == 0) || (UStrCmpI(ptzExt, TEXT(".reg")) == 0)) { hResult = LOAD(tzPath); } else if ((UStrCmpI(ptzExt, TEXT(".dll")) == 0) || (UStrCmpI(ptzExt, TEXT(".ocx")) == 0) || (UStrCmpI(ptzExt, TEXT(".ax")) == 0)) { hResult = CDLL(tzPath); } else if (UStrCmpI(ptzExt, TEXT(".inf")) == 0) { TCHAR tzCmd[MAX_PATH]; UStrPrint(tzCmd, TEXT("DefaultInstall 132 %s"), tzPath); InstallHinfSection(NULL, NULL, tzCmd, 0); hResult = S_OK; } else { // Pass to shell to execute it hResult = !ShellOpen(tzPath, NULL, (fd.cFileName[0] == '!') ? SW_HIDE : SW_NORMAL); } } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); } if (bSubDir) { UStrPrint(tzPath, TEXT("%s\\*"), ptzDir); hFind = FindFirstFile(tzPath, &fd); if (hFind != INVALID_HANDLE_VALUE) { do { if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (fd.cFileName[0] != '.')) { UStrPrint(tzPath, TEXT("%s\\%s"), ptzDir, fd.cFileName); if (hResult == ERROR_FILE_NOT_FOUND) { hResult = OPEN(tzPath, ptzFile, bSubDir); } else { OPEN(tzPath, ptzFile, bSubDir); } } } while (FindNextFile(hFind, &fd)); FindClose(hFind); } } return hResult; }