|
这只是一个驱动学习的笔记,
#include "ntddk.h"
void UnDevice(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("卸载成功3"));
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING theRegistryPath)
{
NTSTATUS status;//NTSTATUS是一个32位无符号长整形,驱动程序中用该宏来检测返回的状态
HANDLE hHandle=NULL;
UNICODE_STRING uVal,uData,uPatch;//定义3个UNICODE_STRING的成员,UNICODE_STRING 是使用本地各种安全认证的LSA,指向一个UNICODE)_STRING 的缓冲区
//该结构有3个成员buffer lenbght MAXmumLenght成员方法
OBJECT_ATTRIBUTES oa;//OBJECT_ATTRIBUTES结构指定可以通过创建对象和返回对象的例程应用程序用于对象或者对象句柄的属性。该结构成员在初始化函数InitializeObjectAttributes
//被使用该函数的第一个参数需要一个指向该结构的成员指针(成员地址)
RtlInitUnicodeString(&uPatch,L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\run");
//初始化一个UNICODE_STREING 的字符串缓冲区
RtlInitUnicodeString(&uVal,L"MyRunTest");
RtlInitUnicodeString(&uData,L"MyExe.exe");
//初始化一个对象结构属性该函数是一个宏,初始化不够明的OBJECT_ATTRIBUTES结构,该结构的对象句柄的属性指定给打开的句柄例程
InitializeObjectAttributes(
&oa,//指向我们需要初始化的OBJECT_ATTRIBUTES对象成员
&uPatch,//只想一个UNICODE_ATTRIBUTES的缓冲区,我们将注册表的路径初始化该结构
OBJ_CASE_INSENSITIVE,//初始化的属性
NULL,//初始化的目录 这里设置为NULL
NULL//我们设置为NULL
);
status=ZwOpenKey(//打开注册表函数 打开成功返回的是STATUS_SUCCESS
&hHandle,//指向接收句柄的指针(缓冲区)打开成功后返回的句柄
KEY_ALL_ACCESS,//访问的权限,这里设置所有权限
&oa);// 指定对象名称和其他的属性的OBJECT_ATTRIBUTES机构,使用初始化对象来 书初始化该二结构,如果调用方为在系统线程上下文中运行
//则必须在调用初始化对象属性时设置OBJECT_KERNEL-handle属性
if (NT_SUCCESS(status))
{
status=ZwSetValueKey(//设置或者替换注册表的值
hHandle,//注册表的句柄。该句柄可以通过ZWCREATEKEY和ZWOPENKEY函数获得一级创建的句柄
&uVal,//指向我们需要写入的数据 改数据在RtlInitUnicodeString(&uVal,L"MyRunTest");被初始化
0,//此参数是系统保留参数
REG_SZ,//设置的数据类型
uData.Buffer,//指向我们需要写入的值得缓冲区uData是UNICODE_STRING结构成员,该成员有3个成员方法buffer lenght maxmumLenght
uData.Length);//写入的长度
if (NT_SUCCESS(status))
{
ZwClose(hHandle);//关闭文件句柄
KdPrint(("设置成功"));
}else{
ZwClose(hHandle);//关闭文件句柄
KdPrint(("设置错误"));
}
}
//---------------------------------------------------------------
pDriverObject->DriverUnload=UnDevice;//卸载例程
return STATUS_SUCCESS;//返回状态,该状态是32位的无符号长整形,驱动程序中用该宏来确定返回的结果NT_SUCCESS来确定返回的结果
}
|
上一篇: VC2013 界面困惑求解下一篇: c语言实现排序算法
|