驱动编程学习----注册表操作

本文介绍了如何使用Windows驱动编程进行注册表的读写操作,包括REG_SZ、REG_BINARY和REG_DWORD类型的值。通过示例代码展示了如何打开注册表键、设置值以及查询和打印注册表项的内容。


参考教程:楚狂人的《windows驱动编程基础教程》

程序实现功能:注册表的读、写(包括REG_SZ、REG_BINARY、REG_DWORD)

HANDLE my_key=NULL;
UNICODE_STRING my_key_path=RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
OBJECT_ATTRIBUTES my_obj_attr={0};
UNICODE_STRING my_key_name=RTL_CONSTANT_STRING(L"LicenseInfo");
KEY_VALUE_PARTIAL_INFORMATION key_infor;
PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor;
ULONG ac_length;
int datai,i;

UNICODE_STRING name=RTL_CONSTANT_STRING(L"Test");
UNICODE_STRING sz_name=RTL_CONSTANT_STRING(L"SZTest");
UNICODE_STRING binary_name=RTL_CONSTANT_STRING(L"BINARYTest");
UNICODE_STRING dword_name=RTL_CONSTANT_STRING(L"DWORDTest");
PWCHAR sz_value={L"My Test value"};   //REG_SZ
unsigned int binary_value[4];            //REG_BINARY           
for (i=0;i<4;i++)                 //低位开始写
binary_value[i]=256*i+i+1;
unsigned long dword_value=0x12345678;            //REG_DWORD          

//注册表的写
InitializeObjectAttributes(&my_obj_attr,&my_key_path,OBJ_CASE_INSENSITIVE,NULL,NULL);
status=ZwOpenKey(&my_key,KEY_READ,&my_obj_attr);
if(!NT_SUCCESS(status))
DbgPrint("open regedit fail~\n");
else
DbgPrint("open regedit successful~\n");
status=ZwSetValueKey(my_key,&sz_name,0,REG_SZ,sz_value,(wcslen(sz_value)+1)*sizeof(WCHAR));
status=ZwSetValueKey(my_key,&binary_name,0,REG_BINARY,binary_value,4*sizeof(int));
status=ZwSetValueKey(my_key,&dword_name,0,REG_DWORD,&dword_value,4);  //这里最后一个参数如果不是4,会导致写DWORD类型失败。
if(!NT_SUCCESS(status))
DbgPrint("write fail^^\n");
else
DbgPrint("write success ~~\n");

//注册表的读
status=ZwQueryValueKey(my_key,&my_key_name,KeyValuePartialInformation,&key_infor,sizeof(KEY_VALUE_PARTIAL_INFORMATION),&ac_length);
if(!NT_SUCCESS(status)&&status!=STATUS_BUFFER_OVERFLOW&&status!=STATUS_BUFFER_TOO_SMALL)
DbgPrint("read value fail~\n");
else
DbgPrint("read value successful~\n");
ac_key_infor=(PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePoolWithTag(NonPagedPool,ac_length,'MEM');//内存标志不能超过四个字符
if(ac_key_infor==NULL)
DbgPrint("Allocate mem fail~\n");
else
DbgPrint("Allocate mem successful\n");
status=ZwQueryValueKey(my_key,&my_key_name,KeyValuePartialInformation,ac_key_infor,ac_length,&ac_length);
if(status!=STATUS_SUCCESS)
DbgPrint("Read fail");
else
{
if(ac_key_infor->Type==REG_BINARY)
for(datai=0;datai<ac_key_infor->DataLength;datai++)
DbgPrint("%x",ac_key_infor->Data[datai]);
else if(ac_key_infor->Type==REG_DWORD)
for(datai=0;datai<ac_key_infor->DataLength;datai++)   //从低位到高位存
DbgPrint("%x",ac_key_infor->Data[datai]);
else
DbgPrint("%ws",ac_key_infor->Data);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值