chenweidelphi
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2007-02-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2016回复:7

写一个我用了一星期时间才发现的问题

楼主#
更多 发布于:2007-02-27 01:37
  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_1984a_1984
chenweidelphi
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2007-02-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-27 01:38
KeAcquireSpinLock(&BmpBufferLock, &irql);
for(i = 0; i < 320 * 3 * 240; i++) BitmapBuffer = pChenwWriteDataS->BMPDatas;
KeReleaseSpinLock(&BmpBufferLock, irql);
chenweidelphi
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2007-02-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-02-27 01:38
pChenwWriteDataS->BMPDatas 显示不出来?
chenweidelphi
驱动牛犊
驱动牛犊
  • 注册日期2003-01-24
  • 最后登录2007-02-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-02-27 01:39
后面是有数组中括号的,怎么这里发贴不能显示?
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2007-02-27 10:25
你可以使用代码标签
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
a_1984
驱动牛犊
驱动牛犊
  • 注册日期2006-11-18
  • 最后登录2007-03-28
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
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.

我想可能因此出错。
另外,我想问个问题 为什么要在考贝内存时用自旋锁锁定 ? 是否因为有什么冲突?
peiyuan
驱动牛犊
驱动牛犊
  • 注册日期2001-11-08
  • 最后登录2011-10-05
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-27 21:37
4字节对齐的问题!
4字节对齐的问题!
傲气雄鹰
treedi
驱动牛犊
驱动牛犊
  • 注册日期2001-07-13
  • 最后登录2018-05-28
  • 粉丝0
  • 关注0
  • 积分181分
  • 威望28点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-27 21:55
最好不要在SpinLock对里面调用系统函数,大忌。
游客

返回顶部