angya
驱动牛犊
驱动牛犊
  • 注册日期2008-07-02
  • 最后登录2009-03-25
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2386回复:3

TDI中tdi receive的问题?

楼主#
更多 发布于:2009-03-03 20:40
我想写一个tdi两端通信的程序,客户端用的普通socket,服务端则是tdi 建立基本的连接后,用函数sendtocontroler()发送和receivefromcontroller()接受。sendtocontroler()没有问题,就是receivefromcontroler()出错。
NTSTATUS receivefromcontroler( )
{
    PDEVICE_OBJECT  devObj;
    KEVENT          receiveevent;
    PIRP            irp;
    PMDL            mdl;
    IO_STATUS_BLOCK iosb;
    NTSTATUS        status;

    devObj = IoGetRelatedDeviceObject(connectionFileObject);

    KeInitializeEvent(&receiveevent, NotificationEvent, FALSE);

    irp = TdiBuildInternalDeviceControlIrp(TDI_RECEIVE, devObj, connectionFileObject, &receiveevent, &iosb);

    if (irp == NULL)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    if (len)
    {
        mdl = IoAllocateMdl((void*) buf, len, FALSE, FALSE, NULL);

        if (mdl == NULL)
        {
            IoFreeIrp(irp);
            return STATUS_INSUFFICIENT_RESOURCES;
        }

        __try
        {
            MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
            status = STATUS_SUCCESS;
        }
        __except (EXCEPTION_EXECUTE_HANDLER)
        {
            IoFreeMdl(mdl);
            IoFreeIrp(irp);
            status = STATUS_INVALID_USER_BUFFER;
        }

        if (!NT_SUCCESS(status))
        {
            return status;
        }
    }

    TdiBuildReceive(irp, devObj, connectionFileObject, NULL, NULL, len ,mdl , flags, len);

 IoSetCompletionRoutine(irp,TDICompletionRoutine,&receiveevent,TRUE.TRUE,TRUE);

    status = IoCallDriver(devObj, irp);

    if (status == STATUS_PENDING)
    {
        KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
        status = iosb.Status;
    }

    return NT_SUCCESS(status) ;

memcpy(getcommand,mdl ,strlen(mdl ));
}
外面定义 char getcommand[256];
接受一个命令没有问题,我在主函数中创建了一个线程,在其中用while(true)
{receivefromcontroler();},当不启动客户端只启动服务端时就会蓝屏,当和客户端建立连接然后
客户端推出时,也会蓝屏,但是不用while循环就不会这样,不知道为什么,困扰了好久,请求各位大侠帮忙
angya
驱动牛犊
驱动牛犊
  • 注册日期2008-07-02
  • 最后登录2009-03-25
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-03-04 16:27
不解的一点就是为什么一循环就蓝屏
breeze916
驱动牛犊
驱动牛犊
  • 注册日期2009-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望271点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-03-06 14:36
memcpy(getcommand,mdl ,strlen(mdl ));

是否strlen(mdl )会大于256?
学好驱动
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-03-06 21:36
哈哈,memcpy(getcommand,mdl ,strlen(mdl ));更本就是垃圾代码,怎么会被执行到呢?

但是"KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);"这行代码中的event是那里冒出来来的?
你哪个本地变量是KEVENT          receiveevent;
是写贴出来的错了?
不连接connectionFileObject是NULL,你去接收当然有问题.
同样在关闭连接后,对象已经删除你还在接收,怎么不错
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部