zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3015回复:28

ds开发,共享内存时!前4096字节的数据总是传输不正确!????

楼主#
更多 发布于:2002-08-06 11:26
   我用ds开发驱动,在内核和应用之间共享内存,在内核分配内存,并写入数据,再从应用程序读出,其他都正常,就是在应用程序读取数据时,总是前4096字节的数据不正确,而后面的都正确!不知为什么??
我用的时KMemory::MapToUserSpace()


    希望高手们不吝赐教!!!谢谢!
nice
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-15 19:53
rifter:
   m_pBuffer 是在device 对象里的 成员变量,
声明如下:
       PUCHAR  m_pBuffer;
nice
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-15 12:38
rifter:
    另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧?

    都是指针没有引用,你有什么高见吗?
谢谢!各位的回答


想知道呢pBuffer事怎么定义的,在什么地方定义的
分数 你想要吗?
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-15 10:46
rifter:
    另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧?

    都是指针没有引用,你有什么高见吗?
谢谢!各位的回答
nice
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-15 10:42
那内存岂不要丢失,况且要多申请多少?岂不浪费!
nice
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-14 14:37
[quote][quote][quote][quote]因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对. [/quote]

这样
m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000);
编译该可以了吧;
但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗
 [/quote]

怎么会????????看清楚哟.多加了0x1000 [/quote]

那尾巴上呢? 是不是申请的时候要多申请0x1000呀 [/quote]


真聪明...hehehehehehehe
不是我不明白,只是这世界变化太快.
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-14 14:22
[quote][quote][quote]因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对. [/quote]

这样
m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000);
编译该可以了吧;
但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗
 [/quote]

怎么会????????看清楚哟.多加了0x1000 [/quote]

那尾巴上呢? 是不是申请的时候要多申请0x1000呀
分数 你想要吗?
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-14 14:05
[quote][quote]因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对. [/quote]

这样
m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000);
编译该可以了吧;
但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗
 [/quote]

怎么会????????看清楚哟.多加了0x1000
不是我不明白,只是这世界变化太快.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-08-14 13:55
对呀。奇怪的。
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-14 13:50
[quote]因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对. [/quote]

这样
m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000);
编译该可以了吧;
但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗


分数 你想要吗?
yanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2009-10-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-14 13:38
不错,这行代码有问题,编译器也给出了错误,类型不匹配,左操作数m_pBuffer是unsigned char *,而0xfffff000是整型
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-14 13:38
rifter:
    我是想把2驱动程序分配的内存空间,映射到应用程序空间。而不是让驱动程序访问应用分配的空间!
    我现在在内核分配20000 字节,只有前4096字节的数据不正确!
不知你有什么高见!当然我也可以反过来做,可是我觉得这样做也可以,可就是传不对!!请指教! :)


因为我时用的应用程序的空间,驱动应该就不要再申请空间了,所以想不通你说的应用访问驱动里的空间,但是你又在APP中申请了空间。
一个问题是:这样不是浪费了APP中的空间,如果该空间很大,不是白白浪费了吗? 是不是和驱动里申请的空间一样大呢? 不会就是你说的前4096字节啊?


另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧?


[编辑 -  8/14/02 by  rifter]
分数 你想要吗?
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-14 13:34
因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对.
不是我不明白,只是这世界变化太快.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-08-14 13:24
因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-08-14 12:53
arthurtu: :)你有什么高见?不妨说一下!
nice
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-14 12:53
我觉得m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
这句话可能有问题,在DDK中一般是用
PUCHAR m_pBuffer=ExAllocatePool(NonPagedPool,20000)来实现的。
另外:你只需把映射后的指针传给App就可以了
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-08-14 12:35
你可以这样,
m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align
m_Mdl = KMemory(m_pBuffer,BUFFER_SIZE);

这是什么?!
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-08-14 12:30
mask2000:
  m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align这样就能保证页对齐吗?可是编译通不过!错误:
error C2296: \'&\' : illegal, left operand has type \'unsigned char *\'

nice
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-14 12:24
谢谢!我去试试!可是没什么一定要保证4k对齐那???
nice
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-08-14 11:02
你可以这样,
m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align
m_Mdl = KMemory(m_pBuffer,BUFFER_SIZE);
不是我不明白,只是这世界变化太快.
上一页
游客

返回顶部