4 #ifndef WINDRIVER_HEADER 5 #define WINDRIVER_HEADER 14 #include "../cpucounters.h" 22 extern void restrictDriverAccess(LPCTSTR path);
31 SC_HANDLE hSCManager{};
36 static tstring msrLocalPath()
39 DWORD driverPathLen = 1;
45 driverPathLen = gcdReturn;
47 driverPath.resize(driverPathLen);
48 gcdReturn = GetCurrentDirectory(driverPathLen, &driverPath[0]);
49 }
while (0 != gcdReturn && driverPathLen < gcdReturn);
51 removeNullTerminator(driverPath);
53 return driverPath + TEXT(
"\\msr.sys");
57 Driver(TEXT(
"c:\\windows\\system32\\msr.sys"))
61 Driver(
const tstring& driverPath) :
62 Driver(driverPath, TEXT(
"PCM MSR"), TEXT(
"PCM MSR Driver"))
66 Driver(
const tstring& driverPath,
const tstring& driverName,
const tstring& driverDescription) :
67 driverPath_(setConfigValue(TEXT(
"DriverPath"), driverPath)),
68 driverName_(setConfigValue(TEXT(
"DriverName"), driverName)),
69 driverDescription_(setConfigValue(TEXT(
"DriverDescription"), driverDescription))
73 const tstring& driverPath()
const 88 hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
91 hService = CreateService(hSCManager, &driverName_[0], &driverDescription_[0], SERVICE_START | DELETE | SERVICE_STOP,
92 SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, &driverPath_[0], NULL, NULL, NULL, NULL, NULL);
96 hService = OpenService(hSCManager, &driverName_[0], SERVICE_START | DELETE | SERVICE_STOP);
101 if (0 != StartService(hService, 0, NULL))
103 tstring convDriverName(&driverName_[0]);
104 tstring driverPath = TEXT(
"\\\\.\\") + convDriverName;
105 restrictDriverAccess(driverPath.c_str());
108 DWORD err = GetLastError();
109 if (err == ERROR_SERVICE_ALREADY_RUNNING)
return true;
111 std::wcerr <<
"Starting MSR service failed with error " << err <<
" ";
112 const TCHAR * errorStr = _com_error(err).ErrorMessage();
114 std::wcerr << errorStr <<
"\n";
116 ControlService(hService, SERVICE_CONTROL_STOP, &ss);
120 CloseServiceHandle(hService);
124 std::wcerr <<
"Opening service manager failed with error " << GetLastError() <<
" ";
125 const TCHAR * errorStr = _com_error(GetLastError()).ErrorMessage();
127 std::wcerr << errorStr <<
"\n";
130 CloseServiceHandle(hSCManager);
134 std::wcerr <<
"Opening service manager failed with error " << GetLastError() <<
" ";
135 const TCHAR * errorStr = _com_error(GetLastError()).ErrorMessage();
137 std::wcerr << errorStr <<
"\n";
140 #ifndef NO_WINRING // In cases where loading the WinRing0 driver is not desirable as a fallback to MSR.sys, add -DNO_WINRING to compile command to remove ability to load driver (will also remove initWinRing0Lib function) 141 std::cerr <<
"Trying to load winring0.dll/winring0.sys driver...\n";
144 std::cerr <<
"Using winring0.dll/winring0.sys driver.\n\n";
149 std::cerr <<
"Failed to load winring0.dll/winring0.sys driver.\n\n";
159 hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
162 hService = OpenService(hSCManager, &driverName_[0], SERVICE_START | DELETE | SERVICE_STOP);
165 ControlService(hService, SERVICE_CONTROL_STOP, &ss);
166 CloseServiceHandle(hService);
169 CloseServiceHandle(hSCManager);
173 std::wcerr <<
"Opening service manager failed with error " << GetLastError() <<
" ";
174 const TCHAR * errorStr = _com_error(GetLastError()).ErrorMessage();
176 std::wcerr << errorStr;
186 hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
189 hService = OpenService(hSCManager, &driverName_[0], SERVICE_START | DELETE | SERVICE_STOP);
192 ControlService(hService, SERVICE_CONTROL_STOP, &ss);
193 DeleteService(hService);
194 CloseServiceHandle(hService);
197 CloseServiceHandle(hSCManager);
201 std::wcerr <<
"Opening service manager failed with error " << GetLastError() <<
" ";
202 const TCHAR * errorStr = _com_error(GetLastError()).ErrorMessage();
204 std::wcerr << errorStr;
210 static tstring setConfigValue(LPCTSTR key,
const tstring& defaultValue)
213 DWORD regLen = 1 *
sizeof(TCHAR);
214 DWORD regRes = ERROR_FILE_NOT_FOUND;
217 if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(
"SOFTWARE\\pcm"), NULL, KEY_READ, &hKey))
220 regRead.resize(regLen /
sizeof(TCHAR));
221 regRes = RegQueryValueEx(hKey, key, NULL, NULL, (LPBYTE)®Read[0], ®Len);
222 }
while (ERROR_MORE_DATA == regRes);
227 removeNullTerminator(regRead);
229 return ERROR_SUCCESS == regRes ? regRead : defaultValue;
232 static void removeNullTerminator(tstring& s)
234 if (!s.empty() && s.back() ==
'\0')
240 const tstring driverName_;
241 const tstring driverPath_;
242 const tstring driverDescription_;
static bool initWinRing0Lib()
Loads and initializes Winring0 third party library for access to processor model specific and PCI con...
Manage custom Windows MSR (Model Specific Register) Driver The driver is required to access hardware ...
Definition: windriver.h:29
void uninstall()
Uninstall the driver.
Definition: windriver.h:184
bool start()
Installs and loads the driver.
Definition: windriver.h:86
void stop()
Stop and unload the driver.
Definition: windriver.h:157