windows 注册表编程
例子:将本地计算机的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 = ;
DeviceInfoData.ClassGuid = *InterfaceClassGuid;
DeviceInfoData.Reserved = ; 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 = ;; 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, , (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);
}
}
windows 注册表编程的更多相关文章
- 10#Windows注册表的那些事儿
引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...
- 关于windows注册表
Windows 注册表 应该是一个 数据库.里面包含操作系统以及在其上的软件配置信息和旗下的硬件配置信息,有点就是整体和全面,控制面包和gpedit.msc 组策略应该是抽象过后的注册表配置信息, W ...
- 【API】注册表编程基础-RegCreateKeyEx、RegSetValueEx
1.环境: 操作系统:Windows 10 x64 编译器:VS2015 2.关键函数 LONG WINAPI RegCreateKeyEx( _In_ HKEY hKey, _In_ LPCTSTR ...
- C++ 注册表编程
原文 C++ 注册表编程 1.基础知识 注册表的组织方式跟文件目录比较相似,主要分为根键.子键和键值项三部分,与文件目录对应的话就是根目录.子目录和文件.分别介绍一下这三部分: (1)根键.分为5个, ...
- 一些实用的Windows注册表
一些实用的Windows注册表 1.去掉快捷方式文件名后面自动添加的"-快捷方式" 在给某个文件创建快捷方式时(选中文件-->右键-->发送到-->桌面快捷方式) ...
- 使用Java修改Windows注册表
使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...
- Java 修改Windows注册表,以实现开机自启动应用程序。
使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...
- Windows注册表的基本知识及应用
转帖:Windows注册表的基本知识及应用 2009-12-23 11:30:56 分类: Windows注册表的基本知识及应用 一.注册表的重要性 在DOS年代,对计算机的内存管理及系统配置主要通 ...
- 1.3 Windows注册表
如何打开Windows注册表呢? 方法一:Win+R打开命令行,再输入regetdit,回车. 方法二:打开计算机,进入系统所在盘,进入Windows\System32文件夹,找到regedt32,双 ...
随机推荐
- [OpenCV] Image Processing - Spatial Filtering
"利用给定像素周围的像素的值决定此像素的最终的输出值“ 教学效果: 策略: 1. 拉普拉斯,突出小细节: . 梯度,突出边缘: . 平滑过的梯度图像用于掩蔽: . 灰度变换,增加灰度动态范围 ...
- Hadoop下面WordCount运行详解
单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/ ...
- Mysql学习笔记(十四)备份与恢复
学习内容: 1.数据库的重要数据备份... 2.什么时候需要使用到数据库备份.. 3.如何恢复备份的数据.. 1.备份: 说到备份,相比大家都不应该陌生,比如说我们平时在为我们的电脑重新做系统的时候, ...
- python内置模块(1)
Python的模块在其它语言中通常称为库或类库,也就是lib.它是编程语言的第三级封装,第四级则是包,也就是模块的打包组合,而前两级分别是函数和类.封装的好处,自然不用多言,高内聚,松耦合,减少代码重 ...
- 继续谈论XSS
这篇文章基于上篇谈论XSS ,想说下自己工作过程中遇到的xss的问题. 易出现XSS的场景 1 jsonp 说说jsonp 中也有说过,jsonp其实是很容易出现安全问题的.由于jsonp的callb ...
- 软件测试之黑盒测试:打着手电寻找bug
功能测试,简单的理解就是黑盒测试,就是检测黑盒子,找到里面存在的缺陷. 功能测试新人学习计划: 1. 对于产品的学习---站在客户的角度学习产品.看待问题 测试人员不是简单地按照开发人员的设计文档去撰 ...
- Requested registry access is not allowed(不允许所请求的注册表访问权)
尝试创建自定义事件日志时,将会收到“Requested registry access is not allowed(不允许所请求的注册表访问权)”错误消息 EventLog.CreateEventS ...
- ScriptManager和UpdatePanel控件实现局部刷新
ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因 ...
- WPF,给颜色SolidColorBrush添加动画
/// <summary> /// 设置颜色动画 /// </summary> /// <returns></returns> private Soli ...
- Js中各类型数据到bool的转换
在返回Json字符串给前台时遇到的问题,返回的bool数据总是为TRUE 特意查了一下,发现了Js中各类数据转换到bool型是的结果. 希望能给遇到同样问题的人一点帮助. 数据类型 转换为bool ...