static bool vboxDrvCfgInfEnumerationCallback(LPCWSTR lpszFileName, PVOID pCtxt) { PINFENUM_CONTEXT pContext = (PINFENUM_CONTEXT)pCtxt; DWORD dwErr; NonStandardLogRelCrap((__FUNCTION__": lpszFileName (%S)\n", lpszFileName)); NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszClassName = (%S)\n", pContext->InfInfo.lpszClassName)); HINF hInf = SetupOpenInfFileW(lpszFileName, pContext->InfInfo.lpszClassName, INF_STYLE_WIN4, NULL /*__in PUINT ErrorLine */); if (hInf == INVALID_HANDLE_VALUE) { dwErr = GetLastError(); // NonStandardAssert(dwErr == ERROR_CLASS_MISMATCH); if (dwErr != ERROR_CLASS_MISMATCH) { NonStandardLogCrap((__FUNCTION__ ": SetupOpenInfFileW err dwErr=%ld\n", dwErr)); } else { NonStandardLogCrap((__FUNCTION__ ": dwErr == ERROR_CLASS_MISMATCH\n")); } return true; } LPWSTR lpszPnPId; HRESULT hr = vboxDrvCfgInfQueryFirstPnPId(hInf, &lpszPnPId); NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgInfQueryFirstPnPId returned lpszPnPId = (%S)\n", lpszPnPId)); NonStandardLogRelCrap((__FUNCTION__ ": pContext->InfInfo.lpszPnPId = (%S)\n", pContext->InfInfo.lpszPnPId)); if (hr == S_OK) { if (!wcsicmp(pContext->InfInfo.lpszPnPId, lpszPnPId)) { if (!SetupUninstallOEMInfW(lpszFileName, pContext->Flags, /*DWORD Flags could be SUOI_FORCEDELETE */ NULL /*__in PVOID Reserved == NULL */ )) { dwErr = GetLastError(); NonStandardLogRelCrap((__FUNCTION__ ": SetupUninstallOEMInf failed for file (%S), dwErr=%ld\n", lpszFileName, dwErr)); NonStandardAssert(0); hr = HRESULT_FROM_WIN32( dwErr ); } } free(lpszPnPId); } else { NonStandardLogCrap((__FUNCTION__ ": vboxDrvCfgInfQueryFirstPnPId failed, hr=0x%x\n", hr)); } SetupCloseInfFile(hInf); return true; }
static HRESULT vboxDrvCfgInfQueryFirstPnPId(HINF hInf, LPWSTR *lppszPnPId) { LPWSTR lpszModels; LPWSTR lpszPnPId; HRESULT hr = vboxDrvCfgInfQueryModelsSectionName(hInf, &lpszModels, NULL); if (hr != S_OK) { NonStandardLogCrap((__FUNCTION__ ": vboxDrvCfgRegQueryKeyValue for Manufacturer failed, hr=0x%x\n", hr)); return hr; } INFCONTEXT InfCtx; hr = vboxDrvCfgInfQueryContext(hInf, lpszModels, NULL, &InfCtx); if (hr != S_OK) { NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgInfQueryContext for models (%S) failed, hr=0x%x\n", lpszModels, hr)); } else { hr = vboxDrvCfgInfQueryKeyValue(&InfCtx, 2, &lpszPnPId, NULL); if (hr != S_OK) { NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgRegQueryKeyValue for models (%S) failed, hr=0x%x\n", lpszModels, hr)); } } /* free models string right away */ free(lpszModels); if (hr != S_OK) { return hr; } *lppszPnPId = lpszPnPId; return S_OK; }
HRESULT VBoxDrvCfgDrvUpdate(LPCWSTR pcszwHwId, LPCWSTR pcsxwInf, BOOL *pbRebootRequired) { if (pbRebootRequired) *pbRebootRequired = FALSE; BOOL bRebootRequired = FALSE; WCHAR InfFullPath[MAX_PATH]; DWORD dwChars = GetFullPathNameW(pcsxwInf, sizeof (InfFullPath) / sizeof (InfFullPath[0]), InfFullPath, NULL /* LPTSTR *lpFilePart */ ); if (!dwChars || dwChars >= MAX_PATH) { NonStandardLogCrap(("GetFullPathNameW failed, dwErr=%ld, dwChars=%ld\n", GetLastError(), dwChars)); return E_INVALIDARG; } if (!UpdateDriverForPlugAndPlayDevicesW(NULL, /* HWND hwndParent */ pcszwHwId, InfFullPath, INSTALLFLAG_FORCE, &bRebootRequired)) { DWORD dwErr = GetLastError(); NonStandardLogCrap(("UpdateDriverForPlugAndPlayDevicesW failed, dwErr=%ld\n", dwErr)); return HRESULT_FROM_WIN32(dwErr); } if (bRebootRequired) NonStandardLogCrap(("!!Driver Update: REBOOT REQUIRED!!\n", GetLastError(), dwChars)); if (pbRebootRequired) *pbRebootRequired = bRebootRequired; return S_OK; }
static HRESULT vboxDrvCfgInfQueryModelsSectionName(HINF hInf, LPWSTR *lppszValue, PDWORD pcValue) { INFCONTEXT InfCtx; LPWSTR lpszModels, lpszPlatform = NULL, lpszPlatformCur; LPWSTR lpszResult = NULL; DWORD cModels, cPlatform = 0, cPlatformCur, cResult = 0; bool bNt = false, bArch = false /*, bOs = false */; HRESULT hr = vboxDrvCfgInfQueryContext(hInf, L"Manufacturer", NULL, &InfCtx); if (hr != S_OK) { NonStandardLogCrap((__FUNCTION__ ": vboxDrvCfgInfQueryContext for Manufacturer failed, hr=0x%x\n", hr)); return hr; } hr = vboxDrvCfgInfQueryKeyValue(&InfCtx, 1, &lpszModels, &cModels); if (hr != S_OK) { NonStandardLogRelCrap((__FUNCTION__ ": vboxDrvCfgRegQueryKeyValue 1 for Manufacturer failed, hr=0x%x\n", hr)); return hr; } for (DWORD i = 2; (hr = vboxDrvCfgInfQueryKeyValue(&InfCtx, i, &lpszPlatformCur, &cPlatformCur)) == S_OK; ++i) { if (wcsicmp(lpszPlatformCur, L"NT"VBOXDRVCFG_ARCHSTR)) { if (bNt) { free(lpszPlatformCur); lpszPlatformCur = NULL; continue; } if (wcsicmp(lpszPlatformCur, L"NT")) { free(lpszPlatformCur); lpszPlatformCur = NULL; continue; } bNt = true; } else { bArch = true; } cPlatform = cPlatformCur; if(lpszPlatform) free(lpszPlatform); lpszPlatform = lpszPlatformCur; lpszPlatformCur = NULL; } hr = S_OK; if (lpszPlatform) { lpszResult = (LPWSTR)malloc((cModels + cPlatform) * sizeof (lpszResult[0])); if (lpszResult) { memcpy(lpszResult, lpszModels, (cModels - 1) * sizeof (lpszResult[0])); *(lpszResult + cModels - 1) = L'.'; memcpy(lpszResult + cModels, lpszPlatform, cPlatform * sizeof (lpszResult[0])); cResult = cModels + cPlatform; } else { hr = E_FAIL; } } else { lpszResult = lpszModels; cResult = cModels; lpszModels = NULL; } if (lpszModels) free(lpszModels); if (lpszPlatform) free(lpszPlatform); if (hr == S_OK) { *lppszValue = lpszResult; if (pcValue) *pcValue = cResult; } return hr; }