例子:将本地计算机的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);
}
}