一个超简单的ring3与ring0通信的例子
实际上是我想写一个隐藏文件的驱动,结果发现不是那么简单的事情,于是淡定下来先一步步走好吧.我觉得我在学习一个东西时,喜欢把它脱得一丝不挂.所以不会有什么错误判断啊之类的.在能实现功能的前提下,尽量一切从简.
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_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!".
啊哈哈哈,是不是很清爽,就如同鄙人刚理的酷头一样.(啊.其实我不想理这么短!!!!!!悲催的毫米单位!!!)
一个驱动程序只有一个系列的分发函数,但是可以生成多个虚拟设备,以及绑定到实际设备的设备栈上去.看样子,微软的意思是一个内核模块就专心干一件事情吧,三妻四妾是不提倡的.(不是"不能")
页:
[1]