阅读:3015回复:28
ds开发,共享内存时!前4096字节的数据总是传输不正确!????
我用ds开发驱动,在内核和应用之间共享内存,在内核分配内存,并写入数据,再从应用程序读出,其他都正常,就是在应用程序读取数据时,总是前4096字节的数据不正确,而后面的都正确!不知为什么??
我用的时KMemory::MapToUserSpace() 希望高手们不吝赐教!!!谢谢! |
|
|
沙发#
发布于:2002-08-15 19:53
rifter:
m_pBuffer 是在device 对象里的 成员变量, 声明如下: PUCHAR m_pBuffer; |
|
|
板凳#
发布于:2002-08-15 12:38
rifter: 想知道呢pBuffer事怎么定义的,在什么地方定义的 |
|
|
地板#
发布于:2002-08-15 10:46
rifter:
另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧? 都是指针没有引用,你有什么高见吗? 谢谢!各位的回答 |
|
|
地下室#
发布于:2002-08-15 10:42
那内存岂不要丢失,况且要多申请多少?岂不浪费!
|
|
|
5楼#
发布于:2002-08-14 14:37
[quote][quote][quote][quote]因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. [/quote] 这样 m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000); 编译该可以了吧; 但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗 [/quote] 怎么会????????看清楚哟.多加了0x1000 [/quote] 那尾巴上呢? 是不是申请的时候要多申请0x1000呀 [/quote] 真聪明...hehehehehehehe |
|
|
6楼#
发布于:2002-08-14 14:22
[quote][quote][quote]因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. [/quote] 这样 m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000); 编译该可以了吧; 但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗 [/quote] 怎么会????????看清楚哟.多加了0x1000 [/quote] 那尾巴上呢? 是不是申请的时候要多申请0x1000呀 |
|
|
7楼#
发布于:2002-08-14 14:05
[quote][quote]因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. [/quote] 这样 m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000); 编译该可以了吧; 但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗 [/quote] 怎么会????????看清楚哟.多加了0x1000 |
|
|
8楼#
发布于:2002-08-14 13:55
对呀。奇怪的。
|
|
9楼#
发布于:2002-08-14 13:50
[quote]因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. [/quote] 这样 m_pBuffer= (ULONG *)((LONG)m_pBuffer&0xfffff000 + 0x1000); 编译该可以了吧; 但是 如果你申请的空间不是4k对齐,这样对齐了,也有问题啊,你不是用了你没有申请的一部分空间吗 |
|
|
10楼#
发布于:2002-08-14 13:38
不错,这行代码有问题,编译器也给出了错误,类型不匹配,左操作数m_pBuffer是unsigned char *,而0xfffff000是整型
|
|
11楼#
发布于:2002-08-14 13:38
rifter: 因为我时用的应用程序的空间,驱动应该就不要再申请空间了,所以想不通你说的应用访问驱动里的空间,但是你又在APP中申请了空间。 一个问题是:这样不是浪费了APP中的空间,如果该空间很大,不是白白浪费了吗? 是不是和驱动里申请的空间一样大呢? 不会就是你说的前4096字节啊? 另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧? [编辑 - 8/14/02 by rifter] |
|
|
12楼#
发布于:2002-08-14 13:34
因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. |
|
|
13楼#
发布于:2002-08-14 13:24
因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。 |
|
14楼#
发布于:2002-08-14 12:53
arthurtu: :)你有什么高见?不妨说一下!
|
|
|
15楼#
发布于:2002-08-14 12:53
我觉得m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
这句话可能有问题,在DDK中一般是用 PUCHAR m_pBuffer=ExAllocatePool(NonPagedPool,20000)来实现的。 另外:你只需把映射后的指针传给App就可以了 |
|
16楼#
发布于:2002-08-14 12:35
你可以这样, 这是什么?! |
|
17楼#
发布于:2002-08-14 12:30
mask2000:
m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align这样就能保证页对齐吗?可是编译通不过!错误: error C2296: \'&\' : illegal, left operand has type \'unsigned char *\' |
|
|
18楼#
发布于:2002-08-14 12:24
谢谢!我去试试!可是没什么一定要保证4k对齐那???
|
|
|
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); |
|
|
上一页
下一页