-
Notifications
You must be signed in to change notification settings - Fork 79
/
HGInstaller64.cpp
103 lines (74 loc) · 4.45 KB
/
HGInstaller64.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "stdafx.h"
#define HG_HARDWARE_ID L"Root\\HidGuardian"
#define HG_FILTER_NAME L"HidGuardian"
typedef BOOL(WINAPI *UpdateDriverProto)(HWND, LPCTSTR, LPCTSTR, DWORD, PBOOL);
using namespace std;
GUID classGuid;
int doInstall(wchar_t *infPath) {
wchar_t hwIds[64];
wchar_t className[MAX_CLASS_NAME_LEN];
HDEVINFO devInfo = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA devInfoData;
int ret = 0;
ZeroMemory(hwIds, sizeof(hwIds));
StringCchCopy(hwIds, 64, HG_HARDWARE_ID);
if (!SetupDiGetINFClass(infPath, &classGuid, className, MAX_CLASS_NAME_LEN, 0))
return 2;
devInfo = SetupDiCreateDeviceInfoList(&classGuid, NULL);
if (devInfo == INVALID_HANDLE_VALUE)
return 3;
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (
!SetupDiCreateDeviceInfoW(
devInfo, className, &classGuid, NULL, NULL, DICD_GENERATE_ID, &devInfoData
)
) {
ret = 4;
goto end;
}
if (
!SetupDiSetDeviceRegistryPropertyW(
devInfo, &devInfoData, SPDRP_HARDWAREID, (LPBYTE)hwIds,
(DWORD)(wcslen(hwIds) + 2) * sizeof(wchar_t)
)
) {
ret = 5;
goto end;
}
if (
!SetupDiCallClassInstaller(
DIF_REGISTERDEVICE, devInfo, &devInfoData
)
) {
ret = 6;
goto end;
}
end:
if (devInfo != INVALID_HANDLE_VALUE)
SetupDiDestroyDeviceInfoList(devInfo);
return ret;
}
int updateDriver(wchar_t *infPath) {
HMODULE newDevMod = LoadLibrary(L"newdev.dll");
UpdateDriverProto updateFn;
if (!newDevMod)
return 9;
updateFn = (UpdateDriverProto)GetProcAddress(newDevMod, "UpdateDriverForPlugAndPlayDevicesW");
if (!updateFn)
return 10;
if (!updateFn(NULL, HG_HARDWARE_ID, infPath, INSTALLFLAG_FORCE, NULL))
return 11;
return 0;
}
int main(int argc, char **argv)
{
wchar_t infPath[MAX_PATH];
size_t num;
if (argc < 2)
return 1;
mbstowcs_s(&num, infPath, argv[1], MAX_PATH);
int ret = doInstall(infPath);
if (ret != 0)
return ret;
return updateDriver(infPath);
}