例子:将本地计算机的Monitor ID写入到注册表中
(1)获取MonitorID
BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID * InterfaceClassGuid) { WriteEventLogEntry(L"EnumClassDevice ", EVENTLOG_ERROR_TYPE); HDEVINFO DeviceInfoSet; HDEVINFO NewDeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; ZeroMemory(&DeviceInfoData, sizeof(DeviceInfoData)); DeviceInfoData.cbSize = sizeof(DeviceInfoData); DeviceInfoData.DevInst = 0; DeviceInfoData.ClassGuid = *InterfaceClassGuid; DeviceInfoData.Reserved = 0; DWORD i; // 创建空设备信息列表
DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL); BOOLEAN ret = FALSE; if (DeviceInfoSet == INVALID_HANDLE_VALUE) { writeErrorLog(L"CreateDeviceInfoList failed: ", GetLastError()); return ret; } // 根据接口类型获得新的设备信息列表
NewDeviceInfoSet = SetupDiGetClassDevsEx( InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE, DeviceInfoSet,// 之前创建的设备信息列表
NULL, NULL ); if (NewDeviceInfoSet == INVALID_HANDLE_VALUE) { writeErrorLog(L"SetupDiGetClassDevsEx failed: ", GetLastError()); return ret; } for (i = 0;; i++) { BOOL bResult = SetupDiEnumDeviceInfo(NewDeviceInfoSet, i, &DeviceInfoData); if (!bResult) { if (GetLastError() != NO_ERROR &&GetLastError() != ERROR_NO_MORE_ITEMS) { writeErrorLog(L"SetupDiEnumDeviceInfo ERROR ", GetLastError()); return ret; } break; } else { char DeviceID[MAX_DEV_LEN]; bool resHardwareID = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, 0, (PBYTE)DeviceID, MAX_DEV_LEN, NULL); if (!resHardwareID) { ZeroMemory(&DeviceID, sizeof(DeviceID)); } else{ //写入注册表,并break;
setRegKey(DeviceID, name_monitor); } } } SetupDiDestroyDeviceInfoList(DeviceInfoSet); return TRUE; }
(2)将MonitorID写入到注册表
LPCTSTR SubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
void setRegKey(char* value, LPCWSTR name){
//将Ansi字符串转换成Unicode字符串
LPWSTR pwszOut = NULL;// Typedef WCHAR* LPWSTR
if (value != NULL)
{
// Double NULL Termination
int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, value, -1, NULL, 0);//获取字符的长度
pwszOut = new TCHAR[nOutputStrLen];
memset(pwszOut, 0, nOutputStrLen);
MultiByteToWideChar(CP_ACP, 0, value, -1, pwszOut, nOutputStrLen);
}
HKEY key = NULL;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS){//打开注册表项
writeDebugEventLog(L"[Service] RegOpenKeyEx ok ", EVENTLOG_INFORMATION_TYPE);
if (RegSetValueEx(key, name, 0, REG_SZ, (unsigned const char*)pwszOut, sizeof(TCHAR)*(lstrlenW(pwszOut) + 1)) == ERROR_SUCCESS){
writeDebugEventLog(L"[Service] setRegKey ok ", EVENTLOG_INFORMATION_TYPE);
}
else{
writeErrorLog(L"[Service] RegSetValueEx ", GetLastError());
}
}
else {
writeErrorLog(L"[Service] RegOpenKeyEx ", GetLastError());
}
if (key != NULL) RegCloseKey(key);
if (pwszOut != NULL) delete[] pwszOut;
}
(3)从注册表中读取MonitorID
void readRegKey(LPCWSTR name,LPWSTR id){
HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &key) == ERROR_SUCCESS){
DWORD nType, nLen;
WCHAR buff[MAX_DEV_LEN];
RegQueryValueEx(key, name, 0, &nType, (LPBYTE)buff, &nLen);
writeDebugEventLog(L"[MonitorHelp] readRegKey RegQueryValueEx ok ", EVENTLOG_INFORMATION_TYPE);
RegCloseKey(key);
lstrcpyW(id,buff);
}
else{
printf("readRegKey RegOpenKeyEx fail");
writeDebugEventLog(L"[MonitorHelp] readRegKey RegQueryValueEx fail ", EVENTLOG_INFORMATION_TYPE);
}
}