У меня есть драйвер UMDF, который в настоящее время перераспределяется через 2 автономных установщика, один для x64 и один для x86.
Это функция установки драйвера, скопированная из devcon:
bool InstallDriver(const TCHAR* InfPath, const wchar_t* TargetID)
{
#define MAX_CLASS_NAME_LEN 32
GUID ClassGUID = {};
TCHAR ClassName[MAX_CLASS_NAME_LEN] = {};
TCHAR hwIdList[LINE_LEN + 4] = {};
//
// List of hardware ID's must be double zero-terminated
//
ZeroMemory(hwIdList, sizeof(hwIdList));
if (FAILED(StringCchCopy(hwIdList, LINE_LEN, TargetID)))
{
return false;
}
//
// Use the INF File to extract the Class GUID.
//
if (!SetupDiGetINFClass(InfPath, &ClassGUID, ClassName, sizeof(ClassName) / sizeof(ClassName[0]), 0))
{
return false;
}
//
// Create the container for the to-be-created Device Information Element.
//
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID, 0);
if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
return false;
}
//
// Now create the element.
// Use the Class GUID and Name from the INF file.
//
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiCreateDeviceInfo(DeviceInfoSet,
ClassName,
&ClassGUID,
NULL,
0,
DICD_GENERATE_ID,
&DeviceInfoData))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return false;
}
//
// Add the HardwareID to the Device's HardwareID property.
//
if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
&DeviceInfoData,
SPDRP_HARDWAREID,
(LPBYTE)hwIdList,
(lstrlen(hwIdList) + 1 + 1) * sizeof(TCHAR)))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return false;
}
//
// Transform the registry element into an actual devnode
// in the PnP HW tree.
//
if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
DeviceInfoSet,
&DeviceInfoData))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return false;
}
//
// update the driver for the device we just created
//
if (!UpdateDriverForPlugAndPlayDevices(0, TargetID, InfPath, INSTALLFLAG_FORCE, 0))
{
int y = GetLastError();
if (y == ERROR_IN_WOW64 || y == ERROR_NO_SUCH_DEVINST || y == ERROR_NO_SUCH_DEVINST || y == ERROR_FILE_NOT_FOUND)
{
}
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return false;
}
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return true;
}
Это работает нормально, но я хочу иметь один распространяемый x86, который будет содержать драйверы x86 и x64 и определять, работает ли он в WOW64, и устанавливать драйвер x64.
На этот раз функция InstallDriver
не работает при этом вызове:
if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
DeviceInfoSet,
&DeviceInfoData))
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return false;
}
Последняя ошибка 3758096949.
Не удалось найти дополнительную информацию об этой ошибке, плюс я не увидел подсказок в SetupDiSetDeviceRegistryProperty установить реестр в x64, как в флаге RegCreateKeyEx KEY_WOW64_64KEY.
Есть ли способ избежать 2 исполняемых файлов?