阅读:1686回复:2
TDI中一保存irps->Parameters里面的信息就蓝屏....有代码
前面的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 ; |
|
沙发#
发布于:2008-08-05 15:34
信息不全,如何回答你?
|
|
|
板凳#
发布于: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 ; } 这样可以否?还需要知道什么信息? |
|