Jacqueline季 发表于 2024-3-6 09:09:12

一个超简单的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]
查看完整版本: 一个超简单的ring3与ring0通信的例子