wang_bml
驱动牛犊
驱动牛犊
  • 注册日期2004-05-27
  • 最后登录2011-12-21
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:1460回复:9

这样写哪儿错了?

楼主#
更多 发布于:2007-08-24 12:35
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT pDriObj,IN PUNICODE_STRING pRegPath)
{
  ...
//Attach Device
status = IoAttachDevice(g_DevObj,&DevName,&g_OldDevObj);
...
}

NTSTATUS TdiCreateAddrComplete(IN PDEVICE_OBJECT pDevObj,IN PIRP Irp,IN PVOID Context){
      PIO_STACK_LOCATION Irps = IoGetCurrentIrpStackLocation(Irp);
      PIRP QueryIrp = (PIRP)Context;
      TDI_ADDRESS_INFO *pTai = (TDI_ADDRESS_INFO *)ExAllocatePool(NonPagedPool,   \
                                                                sizeof    (TDI_ADDRESS_INFO_MAX));
      NTSTATUS status;
    
      if(pTai != NULL){
          PMDL pMdl = IoAllocateMdl(pTai,sizeof(TDI_ADDRESS_INFO_MAX),FALSE,FALSE,NULL);
          if (pMdl != NULL) {
                MmBuildMdlForNonPagedPool(pMdl);
               if (QueryIrp != NULL) {    
                        TdiBuildQueryInformation(QueryIrp,g_OldDevObj,Irps->FileObject,NULL,NULL,
                                                                               TDI_QUERY_ADDRESS_INFO,pMdl);
                       status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏
               }
         }
     }

    return status;
}

NTSTATUS TdiCreate(IN PDEVICE_OBJECT pDevObj,IN PIRP Irp){
  PIO_STACK_LOCATION Irps = IoGetCurrentIrpStackLocation(Irp);
  FILE_FULL_EA_INFORMATION *pEA =
                                    (FILE_FULL_EA_INFORMATION *)Irp->AssociatedIrp.SystemBuffer;
  PIRP QueryIrp;
  NTSTATUS status;
    
  if(pEA->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH \
 && memcmp(pEA->EaName,TdiTransportAddress,TDI_TRANSPORT_ADDRESS_LENGTH) == 0){
            QueryIrp = TdiBuildInternalDeviceControlIrp(TDI_QUERY_ADDRESS_INFO,g_OldDevObj,\
                                                Irps->FileObject,NULL,NULL);
             IoSkipCurrentIrpStackLocation(Irp);        
             IoSetCompletionRoutine(Irp,TdiCreateAddrComplete,QueryIrp,TRUE,TRUE,TRUE);
             status = IoCallDriver(g_OldDevObj,,Irp);
}
 else{
          if(g_OldDevObj != NULL){
                IoSkipCurrentIrpStackLocation(Irp);
                status = IoCallDriver(g_OldDevObj,Irp);
          }
        else{
                status = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                IoCompleteRequest (Irp, IO_NO_INCREMENT);
        }
  }
    
return status;
}
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-08-24 14:32
问题多多。。
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-24 14:34
初次写,去找PCAUSA的例子来看一下,还有TDIFW...看起来好乱...
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-08-24 14:36
不过看样子,你也是从那里改过来的...
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-08-24 14:38
      PIRP QueryIrp = (PIRP)Context;
      ................................
        status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏

QueryIrp 你自己分配的???
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-08-24 14:40
status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏

似乎你不应该这样传DevObject....
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-08-24 14:43
,我纯粹路过的...说的话不负责的...哈哈...看我一个问题分N次回答,就知道是什么性质了...哈哈...慢慢改吧...
人不靓仔心灵美,版头不正红花仔!
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-08-24 14:44
status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏

你换个DevObj看看...用参数那个...
人不靓仔心灵美,版头不正红花仔!
wang_bml
驱动牛犊
驱动牛犊
  • 注册日期2004-05-27
  • 最后登录2011-12-21
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-24 15:45
RE
兄弟,你直接讲哪儿错了不就得了,你说了半天我都不明白你说的什么意思,还有你说的改成DevObj是什么意思?给当前设备发IRP?不太明白。
wang_bml
驱动牛犊
驱动牛犊
  • 注册日期2004-05-27
  • 最后登录2011-12-21
  • 粉丝0
  • 关注0
  • 积分131分
  • 威望24点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-25 12:42
谢谢ProPlayboy
我仔细跟了一下程序,发现在Complete函数(TdiCreateAddrComplete)里面的得到的参数pDevObj和irps->FileObject都是空,所以下面的调用会蓝屏,现在还搞明白这两个变量为什么是空。
游客

返回顶部