一个超简单的ring3与ring0通信的例子

本文介绍了一个简单的Windows驱动程序实现过程,包括驱动初始化、设备创建、卸载等关键步骤,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 实际上是我想写一个隐藏文件的驱动,结果发现不是那么简单的事情,于是淡定下来先一步步走好吧.

 我觉得我在学习一个东西时,喜欢把它脱得一丝不挂.所以不会有什么错误判断啊之类的.在能实现功能的前提下,尽量一切从简.

 我觉得这和我的性格有关,shit,扯远了.

 

-----------------------------------------------分割线-------------------------------------------------------

 

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!".

 

啊哈哈哈,是不是很清爽,就如同鄙人刚理的酷头一样.(啊.其实我不想理这么短!!!!!!悲催的毫米单位!!!)

 

一个驱动程序只有一个系列的分发函数,但是可以生成多个虚拟设备,以及绑定到实际设备的设备栈上去.看样子,微软的意思是一个内核模块就专心干一件事情吧,三妻四妾是不提倡的.(不是"不能")

 

 

---------------------------------------------分割线--------------------------------------------------------------------

 

疑惑:关于设备名和设备链接符号名的取法,肯定是有约束的,研究中....

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值