阅读:2016回复:7
写一个我用了一星期时间才发现的问题
BitmapBuffer我申请的是非分页内存
PSTREAM_PROPERTY_DESCRIPTOR pSPD = pSrb->CommandData.PropertyInfo; PKSPROPERTY_CHENW_WRITEDATA_S pChenwWriteDataS =(PKSPROPERTY_CHENW_WRITEDATA_S) pSPD->PropertyInfo; KeAcquireSpinLock(&BmpBufferLock, &irql); RtlMemoryCopy(&BitmapBuffer[0], &pChenwWriteDataS->BMPDatas[0], 320 * 3 * 240); KeReleaseSpinLock(&BmpBufferLock, irql); 以上代码是改写自TESTCAP程序中的AdapterSetProperty代码段. 发现在WIN2000和一些XP写会出现 IRQL_NOT_LESS_OR_EQUAL 错误 而在某些XP和WIN2003下就是好的.非常郁闷.调试一星期. 后来就乱猜原因了,偶然写了下面的代码就好了. KeAcquireSpinLock(&BmpBufferLock, &irql); for(i = 0; i < 320 * 3 * 240; i++) BitmapBuffer = pChenwWriteDataS->BMPDatas; KeReleaseSpinLock(&BmpBufferLock, irql); 我怀疑RtlMemoryCopy引发了页错误,可能在不同的操作系统其实现不一样导致我不同系统上表现出有的好有的不好. 希望能有高手在理论上解释此想象,很想了解清楚. |
|
最新喜欢:a_1984 |
沙发#
发布于:2007-02-27 01:38
KeAcquireSpinLock(&BmpBufferLock, &irql);
for(i = 0; i < 320 * 3 * 240; i++) BitmapBuffer = pChenwWriteDataS->BMPDatas; KeReleaseSpinLock(&BmpBufferLock, irql); |
|
板凳#
发布于:2007-02-27 01:38
pChenwWriteDataS->BMPDatas 显示不出来?
|
|
地板#
发布于:2007-02-27 01:39
后面是有数组中括号的,怎么这里发贴不能显示?
|
|
地下室#
发布于:2007-02-27 10:25
你可以使用代码标签
|
|
|
5楼#
发布于:2007-02-27 14:01
我是个菜鸟,想说说我的看法,不知道对不对:
楼主调用KeAcquireSpinLock(&BmpBufferLock, &irql); 这个函数获取自旋锁会把线程的中断级别提升到 DISPATCH_LEVEL 而 &pChenwWriteDataS->BMPDatas[0]这个不知道是否是常驻内存的 ,因为DDK对 RtlCopyMemory 的解释是:Callers of RtlCopyMemory can be running at any IRQL if both memory blocks are resident. Otherwise, the caller must be running at IRQL < DISPATCH_LEVEL. 我想可能因此出错。 另外,我想问个问题 为什么要在考贝内存时用自旋锁锁定 ? 是否因为有什么冲突? |
|
6楼#
发布于:2007-06-27 21:37
4字节对齐的问题!
4字节对齐的问题! |
|
|
7楼#
发布于:2007-06-27 21:55
最好不要在SpinLock对里面调用系统函数,大忌。
|
|