阅读:1460回复:9
这样写哪儿错了?
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; } |
|
沙发#
发布于:2007-08-24 14:32
问题多多。。
|
|
|
板凳#
发布于:2007-08-24 14:34
初次写,去找PCAUSA的例子来看一下,还有TDIFW...看起来好乱...
|
|
|
地板#
发布于:2007-08-24 14:36
不过看样子,你也是从那里改过来的...
|
|
|
地下室#
发布于:2007-08-24 14:38
PIRP QueryIrp = (PIRP)Context;
................................ status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏 QueryIrp 你自己分配的??? |
|
|
5楼#
发布于:2007-08-24 14:40
status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏
似乎你不应该这样传DevObject.... |
|
|
6楼#
发布于:2007-08-24 14:43
![]() |
|
|
7楼#
发布于:2007-08-24 14:44
status = IoCallDriver(g_OldDevObj,QueryIrp);//调用会蓝屏
你换个DevObj看看...用参数那个... |
|
|
8楼#
发布于:2007-08-24 15:45
RE
兄弟,你直接讲哪儿错了不就得了,你说了半天我都不明白你说的什么意思,还有你说的改成DevObj是什么意思?给当前设备发IRP?不太明白。 |
|
9楼#
发布于:2007-08-25 12:42
谢谢ProPlayboy
我仔细跟了一下程序,发现在Complete函数(TdiCreateAddrComplete)里面的得到的参数pDevObj和irps->FileObject都是空,所以下面的调用会蓝屏,现在还搞明白这两个变量为什么是空。 |
|