阅读:1542回复:6
请高手帮我分析下这个问题
最近要做一个仿真卡的驱动,之前的接口是PCI的,现在改为USB接口了。由于接口改变后,上层IDE环境调用PCI驱动的部分也要修改,为了避免破解上层IDE,准备做一个假的PCI驱动,它里面实际上是再去调用USB驱动的。
我有几点不明白: 1. 这个假的PCI驱动,是不是常说的 “上层过滤驱动” ? 2. 过滤驱动可以被操作系统识别为一个虚拟端口吗? 我需要做一个假的PCI驱动,它的ID号与之前的PCI接口仿真卡一致,这样才能避免破解IDE。 请高手指点一下,看了很久的资料,始终不明白。谢谢! |
|
沙发#
发布于:2008-07-02 16:30
怎么没人理我呢,自己顶一下
还有个问题不明白,过滤驱动编译完应该是sys文件吧,它和function driver如何挂接的,是在function driver的inf文件里指定的吗,还是在过滤驱动的inf文件里呢? |
|
板凳#
发布于:2008-07-09 14:11
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2008-07-10 11:05
上层是通过DeviceIoControl( )访问驱动的。
在USB驱动的DriverEntry()里有这样定义如下: NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { ...... DriverObject->MajorFunction[IRP_MJ_CREATE] = BulkUsb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = BulkUsb_Close; DriverObject->DriverUnload = BulkUsb_Unload; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = BulkUsb_ProcessIOCTL; DriverObject->MajorFunction[IRP_MJ_WRITE] = BulkUsb_Write; DriverObject->MajorFunction[IRP_MJ_READ] = BulkUsb_Read; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = BulkUsb_ProcessSysControlIrp; DriverObject->MajorFunction[IRP_MJ_PNP] = BulkUsb_ProcessPnPIrp; DriverObject->MajorFunction[IRP_MJ_POWER] = BulkUsb_ProcessPowerIrp; DriverObject->DriverExtension->AddDevice = BulkUsb_PnPAddDevice; ...... } NTSTATUS BulkUsb_ProcessIOCTL(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { ...... } NTSTATUS BulkUsb_Read(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { ...... } NTSTATUS BulkUsb_Write(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { ...... } 然后在驱动中BulkUsb_ProcessIOCTL()函数里就可以收到上层发来的相应命令。 以前用PCI接口,上层需要传输数据时只要告诉仿真卡addr和length就可以了,现在必须通过USB来传输了。而USB传输数据都是通过IRP_MJ_READ,IRP_MJ_WRITE进行的,不是通过IRP_MJ_DEVICE_CONTROL。我在IRP_MJ_DEVICE_CONTROL中直接调用BulkUsb_Read( ),BulkUsb_Write( )又经常重启,应该是因为Irp错误造成的。 现在,上层IDE只能通过DeviceIoControl( )访问,没办法破解为ReadFile和WriteFile。我在驱动中又没法直接调用BulkUsb_Read,BulkUsb_Write,怎么解决呢? 高手帮帮忙啊,这个问题困了很久了 |
|
地下室#
发布于:2008-07-10 17:44
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2008-07-11 10:02
谢谢gutian98 指点,我这就去试试去!
|
|
6楼#
发布于:2008-07-11 17:22
今天调试了一天,将BulkUsb_Read()和BulkUsb_Write()的内容照搬进了BulkUsb_ProcessIOCTL()里面,现在机器不重启了,似乎一切正常,但是就是没有数据包发出来,用bushound抓不到DO,DI数据包。 BulkUsb_SingleUrbReadWrite()返回STATUS_PENDING,似乎不太对。
有一点长进,就是知道了DbgPrint不能随便加的,很多重启,以及“升级设备驱动程序”过程中死机,都是由它引起的。驱动调试的确是件很麻烦的事。 |
|