阅读:1630回复:2
IoCallDriver问题
菜鸟一只,刚接触驱动编程,很多东西搞不明白,大牛勿笑。
调用IocallDriver,返回状态STATUS_INVALID_DEVICE_STATE,请问应该如何解决,谢谢。 |
|
沙发#
发布于:2013-05-19 09:30
你说的太简单了太泛了。查文档去吧还是。没有诚心问问题
|
|
|
板凳#
发布于: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; } |
|