maggie_zhy
驱动牛犊
驱动牛犊
  • 注册日期2008-06-23
  • 最后登录2008-09-10
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1543回复:6

请高手帮我分析下这个问题

楼主#
更多 发布于:2008-07-01 14:30
最近要做一个仿真卡的驱动,之前的接口是PCI的,现在改为USB接口了。由于接口改变后,上层IDE环境调用PCI驱动的部分也要修改,为了避免破解上层IDE,准备做一个假的PCI驱动,它里面实际上是再去调用USB驱动的。

我有几点不明白:
1. 这个假的PCI驱动,是不是常说的 “上层过滤驱动” ?
2. 过滤驱动可以被操作系统识别为一个虚拟端口吗?
    我需要做一个假的PCI驱动,它的ID号与之前的PCI接口仿真卡一致,这样才能避免破解IDE。

请高手指点一下,看了很久的资料,始终不明白。谢谢!
maggie_zhy
驱动牛犊
驱动牛犊
  • 注册日期2008-06-23
  • 最后登录2008-09-10
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-02 16:30
怎么没人理我呢,自己顶一下

还有个问题不明白,过滤驱动编译完应该是sys文件吧,它和function driver如何挂接的,是在function driver的inf文件里指定的吗,还是在过滤驱动的inf文件里呢?
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
板凳#
发布于:2008-07-09 14:11
用户被禁言,该主题自动屏蔽!
maggie_zhy
驱动牛犊
驱动牛犊
  • 注册日期2008-06-23
  • 最后登录2008-09-10
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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,怎么解决呢?

高手帮帮忙啊,这个问题困了很久了
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
地下室#
发布于:2008-07-10 17:44
用户被禁言,该主题自动屏蔽!
maggie_zhy
驱动牛犊
驱动牛犊
  • 注册日期2008-06-23
  • 最后登录2008-09-10
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-07-11 10:02
谢谢gutian98 指点,我这就去试试去!
maggie_zhy
驱动牛犊
驱动牛犊
  • 注册日期2008-06-23
  • 最后登录2008-09-10
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-07-11 17:22
今天调试了一天,将BulkUsb_Read()和BulkUsb_Write()的内容照搬进了BulkUsb_ProcessIOCTL()里面,现在机器不重启了,似乎一切正常,但是就是没有数据包发出来,用bushound抓不到DO,DI数据包。 BulkUsb_SingleUrbReadWrite()返回STATUS_PENDING,似乎不太对。

有一点长进,就是知道了DbgPrint不能随便加的,很多重启,以及“升级设备驱动程序”过程中死机,都是由它引起的。驱动调试的确是件很麻烦的事。
游客

返回顶部