Loodles
驱动牛犊
驱动牛犊
  • 注册日期2013-04-16
  • 最后登录2013-05-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1630回复:2

IoCallDriver问题

楼主#
更多 发布于:2013-05-18 17:02
菜鸟一只,刚接触驱动编程,很多东西搞不明白,大牛勿笑。
调用IocallDriver,返回状态STATUS_INVALID_DEVICE_STATE,请问应该如何解决,谢谢。
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2013-05-19 09:30
你说的太简单了太泛了。查文档去吧还是。没有诚心问问题
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
Loodles
驱动牛犊
驱动牛犊
  • 注册日期2013-04-16
  • 最后登录2013-05-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2013-05-19 14:19
        不好意思,水平实在太菜了,问题都不知道该怎样问合适。。。。。。
        我想在例子packet中的NDIS协议层和应用程序之间增加一层TDI client,将来可能还会在之间加东西。现在应用程序已经可以将IRP发至TDI client了,但是TDI client调用IoCallDriver向NDIS层发送IRP的时候,返回状态STATUS_INVALID_DEVICE_STATE。Windbg显示没有将IRP发送到下层,该层主功能号IRP_MJ_INTERNAL_DEVICE_CONTROL次功能号TDI_SEND对应的函数没有被调用。
         说得不清楚,希望大神体谅。同时希望能推荐一些TDI方面的书籍和资料,不甚感激。

NTSTATUS
tdiclient_Send(PFILE_OBJECT pfoConnection, PVOID pData, UINT uiSendLength, UINT *pDataSent)
{
    NTSTATUS NtStatus = STATUS_INSUFFICIENT_RESOURCES;
    PIRP pIrp;
    IO_STATUS_BLOCK IoStatusBlock = {0};
    PDEVICE_OBJECT pTdiDevice;
    PMDL pSendMdl;
    TDI_COMPLETION_CONTEXT TdiCompletionContext;

    KeInitializeEvent(&TdiCompletionContext.kCompleteEvent, NotificationEvent, FALSE);

    pTdiDevice = IoGetRelatedDeviceObject(pfoConnection);

    *pDataSent = 0;

    pSendMdl = IoAllocateMdl((PCHAR )pData, uiSendLength, FALSE, FALSE, NULL);

    if(pSendMdl)
    {

        __try
       {

            MmProbeAndLockPages(pSendMdl, KernelMode, IoModifyAccess);

        }
         __except (EXCEPTION_EXECUTE_HANDLER)
       {
                IoFreeMdl(pSendMdl);
                pSendMdl = NULL;
        };

        if(pSendMdl)
        {
    
            
            pIrp = TdiBuildInternalDeviceControlIrp(TDI_SEND, pTdiDevice, pfoConnection, &TdiCompletionContext.kCompleteEvent, &IoStatusBlock);
        
            if(pIrp)
            {
                
        
        
                TdiBuildSend(pIrp, pTdiDevice, pfoConnection, TdiFuncs_CompleteIrp, &TdiCompletionContext.kCompleteEvent, pSendMdl, 0, uiSendLength);
        
                NtStatus = IoCallDriver(pTdiDevice, pIrp);

        
                if(NtStatus == STATUS_PENDING)
                {
                    KeWaitForSingleObject(&TdiCompletionContext.kCompleteEvent, Executive, KernelMode, FALSE, NULL);
        
                }

                NtStatus   = IoStatusBlock.Status;
                *pDataSent = (UINT)IoStatusBlock.Information;
    
                if(pSendMdl)
                {
                    MmUnlockPages(pSendMdl);
                    IoFreeMdl(pSendMdl);
                }
            }
        }
    }
    return NtStatus;
}


游客

返回顶部