ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1686回复:2

TDI中一保存irps->Parameters里面的信息就蓝屏....有代码

楼主#
更多 发布于:2008-08-05 15:22
前面的temctx是定义是  PTDI_EVENT_CONTEXT temctx ;        

if( r->EventHandler != NULL )
        {

               temctx->handler = r->EventHandler ;                                                  
temctx->FileObj  = irps->FileObject ;      
                temctx->context = r->EventContext ;  


            switch(r->EventType)    
            {
            case TDI_EVENT_CONNECT :
//            DBGPRINT("TDI_EVENT_CONNECT\n") ;
            r->EventHandler = AyConnect ;
            //系统会将temctx传递给我们的回调函数,这样我们就能得到原始的文件对象之类的东西了
            r->EventContext = temctx ;                            
            break ;

            case TDI_EVENT_RECEIVE :
//            DBGPRINT("TDI_EVENT_RECEIVE\n") ;
            r->EventHandler = AyReceive ;
            r->EventContext = temctx ;                  
            break ;





我是想把原先的回调函数替换成自己的回调函数,所以要先保存下内容,但是一加入上面红色字体的代码,IE访问网络的时候就蓝屏~

头文件的一些信息:
typedef struct
{
    PFILE_OBJECT FileObj ;
    PVOID handler ;
    PVOID context ;
}TDI_EVENT_CONTEXT,*PTDI_EVENT_CONTEXT ;
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-08-05 15:34
信息不全,如何回答你?
人不靓仔心灵美,版头不正红花仔!
ay19880703
驱动牛犊
驱动牛犊
  • 注册日期2008-05-24
  • 最后登录2010-03-25
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望120点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-08-05 16:08
NTSTATUS
AyDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP irp )
{
    PDEVICE_OBJECT OriginDevice = NULL ;
    NTSTATUS status ;
    PIO_STACK_LOCATION irps ;
    char *str = NULL ;
    int count  = 0  ;
    KSPIN_LOCK   lock ;
    KIRQL irql ;

    TDI_EVENT_CONTEXT *temctx = NULL ;
    OriginDevice = Ay_Origin_Device_TCP ;       //获取TCP.SYS的设备指针

    irps = IoGetCurrentIrpStackLocation(irp) ;    //获取当前IRP的栈空间
    
    KeInitializeSpinLock(&lock);
    KeAcquireSpinLock(&lock, &irql);

    //--------------------------------------------------------分析请求区间开始---------------------------------------------------------------------------
    if( ( irps->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL ) && ( irps->MinorFunction == TDI_SET_EVENT_HANDLER ) )
    {

        PTDI_REQUEST_KERNEL_SET_EVENT r=(PTDI_REQUEST_KERNEL_SET_EVENT)&irps->Parameters;
        //如果EventHandler为NULL则表示解除事件请求
        if( r->EventHandler != NULL )
        {

                temctx->handler = r->EventHandler ;  //保存原先的回调函数地址,这个函数貌似就是传说中的ClientEventConnect 函数
                temctx->FileObj  = irps->FileObject ;      
                temctx->context = r->EventContext ;  

            switch(r->EventType)    
            {
            case TDI_EVENT_CONNECT :
//            DBGPRINT("TDI_EVENT_CONNECT\n") ;
            r->EventHandler = AyConnect ;
            //系统会将temctx传递给我们的回调函数,这样我们就能得到原始的文件对象之类的东西了
            r->EventContext = temctx ;                            
            break ;

            case TDI_EVENT_RECEIVE :
//            DBGPRINT("TDI_EVENT_RECEIVE\n") ;
            r->EventHandler = AyReceive ;
            r->EventContext = temctx ;                  
            break ;

            case  TDI_EVENT_RECEIVE_EXPEDITED :
            DBGPRINT("TDI_EVENT_RECEIVE_EXPEDITED\n") ;
            break ;

            case  TDI_EVENT_DISCONNECT :
            DBGPRINT("TDI_EVENT_DISCONNECT\n") ;
            break ;

            default :
                DBGPRINT("Other TDI Event\n") ;
                break ;
            }

        }            
    }

    KeReleaseSpinLock(&lock, irql);
    //--------------------------------------------------------分析请求区间结束---------------------------------------------------------------------------
    
    if( OriginDevice != NULL )
    {
        //如果发现原设备,则发送IRP到原设备
        IoSkipCurrentIrpStackLocation( irp );
        status = IoCallDriver(OriginDevice,irp) ;

    }else{
        //如果没发现原设备,那么返回失败
        status = irp->IoStatus.Status = STATUS_INVALID_PARAMETER ;
        IoCompleteRequest(irp,IO_NO_INCREMENT) ;
    }

    return status ;

}

这样可以否?还需要知道什么信息?
游客

返回顶部