我试图通过附加" \ Device \ PointerClass0"来实现鼠标过滤器驱动程序。使用IoAttachDevice将设备连接到堆栈成功。
IRP_MJ_READ的调度例程设置完成例程,然后将IRP传递给较低的驱动程序。
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp,CompletionRoutine,DeviceObject,TRUE,TRUE,TRUE);
return IoCallDriver(TopMostDriver,Irp);
然后当调用完成例程时,它会反转Y ax:
NTSTATUS CompletionRoutine(PDEVICE_OBJECT DeviceObject,PIRP Irp,PVOID Context){
PMOUSE_INPUT_DATA MouseData;
if(Irp->IoStatus.Status == STATUS_SUCCESS){
MouseData = (PMOUSE_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer;
MouseData->LastY *= -1;
}
if(Irp->PendingReturned){
IoMarkIrpPending(Irp);
}
return STATUS_SUCCESS;
}
其他主要功能的默认调度例程只是将IRP传递给较低的驱动程序。
问题是加载我的驱动程序时,默认的调度例程只在连接驱动程序后被调用一次,之后没有被调用,IRP_MJ_READ的调度例程也没有。我使用DeviceTree检查了我的设备如果没有附加,调度程序如果不是,就不会被调用。
编辑:我实际上在osronline上发现了这个声明:the mouse input stacks are pnp and there is no way for you to put yourself
into the stack after it has started running (you could install yourself as a filter and then restart the stack)
如何实际重启驱动程序堆栈?
答案 0 :(得分:0)
实际上,您可以在不重新启动设备的情况下自己注射,但这样做非常不愉快。您可以在设备的堆栈中找到一个驱动程序,然后将其所有(或部分) MajorFunction IRP处理程序复制到您拥有的数组中,然后替换所有(或者一些那些与你自己的处理者,确保"透明"将IRP传递给您中间人的处理人员。"但是,这意味着您无法使用自己的 IO_STACK_LOCATION 。这个策略非常讨厌,所以我不推荐它,除非你必须这样做。 (阅读"永远不要这样做。")
最好是按照通常安装过滤器驱动程序的方式安装过滤器驱动程序,然后重新启动设备。您可以使用用户模式PnP设备管理功能来完成此操作,从您编写的某种安装程序实用程序,或者只是记录用户的安装过程并让他们这样做。