当前位置: 首页 > news >正文

邢台移动网站建设服务做牛排的网站

邢台移动网站建设服务,做牛排的网站,花瓣网平面设计素材,门户网站建站多少钱文章目录 概述注意源码参考资料 概述 irp请求会从io管理器中传递到设备栈中依次向下发送,当到达底层真实设备处理完成后,会依次返回,这时如果在设备栈中有我们自己注册的设备,就可以起到一个过滤的功能。键盘过滤驱动就是如此&am…

文章目录

  • 概述
  • 注意
  • 源码
  • 参考资料

概述

irp请求会从io管理器中传递到设备栈中依次向下发送,当到达底层真实设备处理完成后,会依次返回,这时如果在设备栈中有我们自己注册的设备,就可以起到一个过滤的功能。键盘过滤驱动就是如此,通过附加到原本存在的设备KeyboardClass0中,这时当发生按键时irp也会返回到我们的设备中,进而实现起响应。

注意

在整个键盘响应过程中,有一个名为csrss.exe的程序,其会不断的向KeyboardClass0发送读取类型的irp请求,如果我们直接通过断开设备附加再卸载我们的驱动时,就会蓝屏。原因是csrss.exe最终发送的读irp请求已经通过我们最先注册的过滤驱动向下传递了,这时我们卸载了我们自己的驱动,底层返回的irp找不到回调,这时就会蓝屏,所以代码中应该对irp的数量做一个统计,保证其正确处理。

源码

#include<ntifs.h>typedef struct
{PDEVICE_OBJECT LowerKbdDevice;
}DEVICE_EXTENTION,*PDEVICE_EXTENTION;PDEVICE_OBJECT myKbdDevice = NULL;typedef struct _KEYBOARD_INPUT_DATA {USHORT UnitId;USHORT MakeCode;USHORT Flags;USHORT Reserved;ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, * PKEYBOARD_INPUT_DATA;
//IRP等待处理的数量
ULONG pendingkey = 0;VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{LARGE_INTEGER interval = { 0 };PDEVICE_OBJECT DeviceObject = DriverObject->DeviceObject;IoDetachDevice(((PDEVICE_EXTENTION)DeviceObject->DeviceExtension)->LowerKbdDevice);interval.QuadPart = -10 * 1000 * 1000;//判断是否还有未处理的IRPwhile (pendingkey){KeDelayExecutionThread(KernelMode, FALSE, &interval);}IoDeleteDevice(myKbdDevice);KdPrint(("驱动卸载结束!\n"));
}NTSTATUS ReadComplete(PDEVICE_OBJECT DeviceObject, PIRP irp, PVOID Context)
{PKEYBOARD_INPUT_DATA KeyBuffer = irp->AssociatedIrp.SystemBuffer;char* key[4] = { "KeyDown","KeyUp","E0","E1" };int structnum = irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);if (irp->IoStatus.Status == STATUS_SUCCESS){for (int i = 0; i < structnum; i++){KdPrint(("MakeCode = %x,Flags = %s\n", KeyBuffer->MakeCode, key[KeyBuffer->Flags]));}}//处理完成需要将标志位设置,以声明以完成此irp的返回处理if (irp->PendingReturned){IoMarkIrpPending(irp);}pendingkey--;return irp->IoStatus.Status;
}NTSTATUS DispatchPass(PDEVICE_OBJECT pDeviceObject,PIRP irp)
{IoCopyCurrentIrpStackLocationToNext(irp);return IoCallDriver(((PDEVICE_EXTENTION)pDeviceObject->DeviceExtension)->LowerKbdDevice, irp);
}NTSTATUS DispatchRead(PDEVICE_OBJECT pDeviceObject, PIRP irp)
{IoCopyCurrentIrpStackLocationToNext(irp);IoSetCompletionRoutine(irp,ReadComplete,NULL,TRUE,TRUE,TRUE,TRUE);pendingkey++;return IoCallDriver(((PDEVICE_EXTENTION)pDeviceObject->DeviceExtension)->LowerKbdDevice, irp);
}NTSTATUS MyAttachDevice(PDRIVER_OBJECT pDriverObject)
{UNICODE_STRING kbdName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");NTSTATUS status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENTION), NULL, 0, FILE_DEVICE_KEYBOARD, NULL, &myKbdDevice);if (!NT_SUCCESS(status)){return status;}myKbdDevice->Flags |= DO_BUFFERED_IO;myKbdDevice->Flags &= ~DO_DEVICE_INITIALIZING;RtlZeroMemory(myKbdDevice->DeviceExtension,sizeof(DEVICE_EXTENTION));status = IoAttachDevice(myKbdDevice, &kbdName, &((PDEVICE_EXTENTION)myKbdDevice->DeviceExtension)->LowerKbdDevice);if (!NT_SUCCESS(status)){IoDeleteDevice(myKbdDevice);return status;}return STATUS_SUCCESS;
}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{int i = 0;NTSTATUS Status = STATUS_SUCCESS;for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){pDriverObject->MajorFunction[i] = DispatchPass;}pDriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;Status = MyAttachDevice(pDriverObject);if (!NT_SUCCESS(Status)){KdPrint(("AttachDevice ERROR!\n"));}else{KdPrint(("AttachDevice SUCCESS!\n"));}pDriverObject->DriverUnload = DriverUnload;return Status;
}

参考资料

Windows Driver Development Tutorial

http://www.yayakq.cn/news/518655/

相关文章:

  • 风科网免费网站wordpress模板小程序
  • 企业文化简介网站怎么做大型小程序软件开发
  • 管理外贸网站模板淄博网络运营公司
  • 有什么手机做网站的如皋网站设计
  • 企业网站开发 文献综述wordpress4.9.4中文版
  • 南通百度网站快速优化网站建设资讯平台
  • 主题资源网站建设 反思杭州网站的建设
  • 内蒙古网站开发公司如何帮助网站吸引流量
  • 网站排名优化方案文明网站建设工作进度表
  • 成都小程序开发费用公司seo
  • 网站可以自己维护吗贵州遵义网
  • 常州设计网站百合网 网站 开发
  • 全国网站建设有实力百度如何搜索到自己的网站
  • 网站图片做多大如何做好一个网站
  • 网站登录验证码显示不出来网站备案贵州电话
  • 中英文网站用一个域名还是两个域名利于优化内容导购网站模板
  • 网站学做糕点的课程阿里巴巴网站开发信在哪
  • 做网站用什么字体最明显网站禁止ip访问
  • 百度网站建设工具专门做ppt背景的网站有哪些
  • 杭州高端网站制作国内seo工具
  • 咨询聊城做网站网站如何连接微信支付宝吗
  • 网站域名怎样选择wordpress小米商城模板
  • 网站收录少的原因南宁网站怎么制作公司
  • 大型电商网站开发规划wordpress 用户分组
  • 在线做网站免费黄搞免费域名怎么注册
  • 家居企业网站建设资讯大网站制作公司
  • 包头市做网站泉州平台网站建设
  • 人像摄影作品网站传统网站网站
  • 东莞专业网站营销阿里云服务器学生
  • 网站和微信公众号建设wordpress媒体动作