一、在驱动入口函数里注册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程序进行交互
1、设置MFC界面
2、打开驱动代码
设备句柄 = CreateFileW( L"\\??\\bucuo", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
3、关闭驱动代码
CloseHandle(设备句柄);
四、运行效果