| 
注册时间2022-8-23最后登录2024-3-6在线时间2 小时 
 编程入门 
 
	天马币26  
 | 
 
| 实际上是我想写一个隐藏文件的驱动,结果发现不是那么简单的事情,于是淡定下来先一步步走好吧. 
 我觉得我在学习一个东西时,喜欢把它脱得一丝不挂.所以不会有什么错误判断啊之类的.在能实现功能的前提下,尽量一切从简.
 
 
 ring0 code:
 
 #include "ntddk.h"
 PDEVICE_OBJECT g_DO;
 UNICODE_STRING usDevice_Name = RTL_CONSTANT_STRING(L//Device//MyDog),
 usDevice_LinkName =  RTL_CONSTANT_STRING(L"//DosDevices//LinkDog");
 void Unload(IN PDRIVER_OBJECT DO)
 {
 
 //生成一个设备后,即使驱动被卸载,也还是不会消失,所以再次用这个设备名字创建就会导致加载驱动失败。
 IoDeleteDevice(g_DO);
 IoDeleteSymbolicLink(&usDevice_LinkName);
 DbgPrint("this is Unload!");
 }
 NTSTATUS IRP_CREATE(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
 {
 DbgPrint("this is IRP_CREATE!");
 return STATUS_SUCCESS;
 }
 NTSTATUS DriverEntry(IN PDRIVER_OBJECT DO,IN PUNICODE_STRING RegPath)
 {
 
 //切记,定义放在最前
 NTSTATUS state;
 DO->MajorFunction[IRP_MJ_CREATE] = IRP_CREATE;
 //1.创建设备对象
 state = IoCreateDevice(
 DO,
 0,
 &usDevice_Name,
 FILE_DEVICE_UNKNOWN,
 0,
 FALSE,
 &g_DO
 );
 g_DO->Flags &= ~DO_DEVICE_INITIALIZING;
 //2.链接符号
 state =  IoCreateSymbolicLink(&usDevice_LinkName,&usDevice_Name);
 DbgPrint("this is entry!");
 DO->DriverUnload = Unload;
 return STATUS_SUCCESS;
 }
 
 然后是ring3:
 
 #include "stdio.h"
 #include "windows.h"
 
 int main()
 {
 
 CreateFile("////.//LinkDog",
 GENERIC_ALL,FILE_SHARE_READ,
 
 0,
 OPEN_ALWAYS,//不存在就创建
 FILE_ATTRIBUTE_NORMAL,0);
 }
 
 效果:驱动加载后,运行ring3程序,驱动模块会输出"this is IRP_CREATE!".
 
 啊哈哈哈,是不是很清爽,就如同鄙人刚理的酷头一样.(啊.其实我不想理这么短!!!!!!悲催的毫米单位!!!)
 
 一个驱动程序只有一个系列的分发函数,但是可以生成多个虚拟设备,以及绑定到实际设备的设备栈上去.看样子,微软的意思是一个内核模块就专心干一件事情吧,三妻四妾是不提倡的.(不是"不能")
 
 
 | 
 |