阅读:1666回复:7
NdisAllocateBufferPool的问题,请高手们帮帮我!
在驱动初始化里面:
NdisAllocateBufferPool(&Status,&PoolHandle,16); ASSERT(Status==NDIS_STATUS_SUCCESS); 没有触发断言,但是PoolHandle为0,虽然DDK里面说0是有效值,但是调用 NdisAllocateBuffer(&Status,&Buffer,PoolHandle,PacketBuffer,PacketLength); 怎么也不成功,然后系统会蓝屏,这是什么问题呀,各位高手们? |
|
沙发#
发布于:2007-09-18 12:17
为什么要在驱动初始化里调用呢?
注意DriverEntry的 IRQL = PASSIVE_LEVEL。 |
|
|
板凳#
发布于:2007-09-18 16:06
NdisAllocateBufferPool(&Status,&PoolHandle,16);是在驱动初始化里面调用的,
NdisAllocateBuffer(&Status,&Buffer,PoolHandle,PacketBuffer,PacketLength); 是在延迟过程调用里面调用的。这两个函数的执行级别不都是IRQL <= DISPATCH_LEVEL吗?即使都在初始化里面调用也应该没问题的吧?这个程序我是用DS写的,是否DS框架封装了什么?能帮我解答一下吗,非常感谢,^_^ |
|
地板#
发布于:2007-09-19 09:14
这两个函数要求的执行级别是IRQL <= DISPATCH_LEVEL,而初始化是 IRQL = PASSIVE_LEVEL。
|
|
|
地下室#
发布于:2007-09-19 13:34
呵呵,我是个驱动初学者,对这块不是很熟悉。一个函数的执行级别IRQL <= DISPATCH_LEVEL,是否就说明在执行级别小于或等于DISPATCH_LEVEL的例程中都能调用,如果是这样的话,PASSIVE_LEVEL是小于DISPATCH_LEVEL的啊。小心虚心向各位前辈请教....
|
|
5楼#
发布于:2007-09-19 23:53
你传进去的参数PacketBuffer正确吗?PacketBuffer需要事先分配好的
如果在DISPATCH_LEVEL,那么PacketBuffer是否应该是NonPaged,记不清了。。。 |
|
6楼#
发布于:2007-09-20 09:33
句柄为0肯定不对,你的怎么只有3个参数呢?
你看Packet的例子: NdisAllocatePacketPool( &status, &open->PacketPool, TRANSMIT_PACKETS, sizeof(PACKET_RESERVED)); |
|
|
7楼#
发布于:2007-09-20 15:00
谢谢各位,感激不尽!NdisAllocateBufferPool就只有三个参数啊。
这个问题已经解决,改为在PASSIVE_LEVEL分配就对了,呵呵。在DSIPATCH_LEVEL用NdisAllocateMemoryWithTag都不成功,不明白什么原因! 还想请教两个问题: 1、MiniportReturnPacket作用除了回收资源,还有其他用吗?如果不需要回收资源,是否就不要用了? 2、上层IP地址的时候,底层驱动会有哪些动作呢? |
|