2023驱动保护学习 -- 应用层与驱动层交互操作

时间:2021-11-16 00:58:12

一、在驱动入口函数里注册IRP处理函数

//注册派遣函数,可以用相同的IRP函数处理,也可以单独处理
驱动对象->MajorFunction[IRP_MJ_CREATE] = IRP处理函数;//相当于应用层CreatFile()操作
驱动对象->MajorFunction[IRP_MJ_CLOSE] = IRP处理函数;//相当于应用层CloseHandle()操作
驱动对象->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IRP处理函数;//相当于应用层DeciveIoControl()操作

二、创建IRP处理函数

1、获取栈指针,也就应用层传过来的参数

PIO_STACK_LOCATION irpStackL;
irpStackL = IoGetCurrentIrpStackLocation(IRP指针);

2、通过switch语句判断进行是什么IRP操作

switch (irpStackL->MajorFunction)
{
case IRP_MJ_CREATE:
{
KdPrint(("nxyn:CreateFile操作!!!\n"));
break;
}
case IRP_MJ_CLOSE:
{
KdPrint(("nxyn:CloseHandle操作!!!\n"));
break;
}
}

3、IRP请求的相应处理

IRP指针->IoStatus.Information = 4;//设置操作的字节数
IRP指针->IoStatus.Status = STATUS_SUCCESS;//返回状态
IoCompleteRequest(IRP指针, IO_NO_INCREMENT);//完成一个IRP请求
KdPrint(("nxyn:IRP函数处理完毕"));
return STATUS_SUCCESS;

三、新建一个MFC程序进行交互

2023驱动保护学习 -- 应用层与驱动层交互操作

1、设置MFC界面

2023驱动保护学习 -- 应用层与驱动层交互操作

2、打开驱动代码

设备句柄 = CreateFileW(
L"\\??\\bucuo",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

3、关闭驱动代码

CloseHandle(设备句柄);

四、运行效果

2023驱动保护学习 -- 应用层与驱动层交互操作