阅读:2770回复:28
ds开发,共享内存时!前4096字节的数据总是传输不正确!????
我用ds开发驱动,在内核和应用之间共享内存,在内核分配内存,并写入数据,再从应用程序读出,其他都正常,就是在应用程序读取数据时,总是前4096字节的数据不正确,而后面的都正确!不知为什么??
我用的时KMemory::MapToUserSpace() 希望高手们不吝赐教!!!谢谢! |
|
|
沙发#
发布于:2002-08-11 16:28
这是我的驱动程序read部分源代码:希望高手指教
m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE]; m_Mdl = KMemory(m_pBuffer,BUFFER_SIZE); t<<\"before lock pages\\n\"; if (!NT_SUCCESS(m_Mdl.LockPages(IoReadAccess,UserMode))) status = STATUS_UNSUCCESSFUL; m_Mdl.SetPageArray(); PVOID pBuf = m_Mdl.VirtualAddress(); memset(pBuf,6,BUFFER_SIZE); m_UserSpace = m_Mdl.MapToUserSpace(); t<<\"before fuzhi\\n\"; *pBuffer = m_UserSpace; dwBytesRead= sizeof(PVOID); |
|
|
板凳#
发布于:2002-08-11 18:38
谁能帮我看看!我实在是急呀!!
那位高手帮帮忙!谢谢!谢谢!~ :( :( :( :( :( :( :( :( :( |
|
|
地板#
发布于:2002-08-12 08:47
你是如何从应用程序读出数据的?有没有原码?能不能贴一份?我可以帮你分析一下
|
|
地下室#
发布于:2002-08-13 08:51
内存中每页的大小也是4096,我估计是错位了吧,我也不太懂的
|
|
|
5楼#
发布于:2002-08-13 20:46
edriver:我的应用程序是这样的
void doRead(int n) { PVOID *buf; ULONG nRead; ULONG i=0; buf = (PVOID*) malloc(n); if (buf == NULL) { printf(\"Failed to allocate buffer for read\"); Exit(1); } // Read data from driver printf(\"Reading from device - \"); ReadFile(hDevice, buf, n, &nRead, NULL); printf(\"%d bytes read from device (%d requested).\\n\", nRead, n); PUCHAR pData= (PUCHAR)(*buf); FILE* file = fopen(\"c:\\\\test.txt\",\"w\"); // Print what was read for (i=0;i<20040;i++) { fprintf(file,\"number[%d] = %d\\n\",i,(UCHAR)(*pData++)); } fclose(file); free(buf); } 非常感谢你的热心帮助!!谢谢! wangxdong也许你是对的,可是开辟20000内存,20000后面的数据也不对呀! |
|
|
6楼#
发布于:2002-08-13 22:33
这是我的驱动程序read部分源代码:希望高手指教 m_UserSpace = m_Mdl.MapToUserSpace(); *pBuffer = m_UserSpace; 要做映射吗? 不是App已经申请空间了吗 pBuffer是什么? |
|
|
7楼#
发布于:2002-08-14 10:24
rifter:
我是想把2驱动程序分配的内存空间,映射到应用程序空间。而不是让驱动程序访问应用分配的空间! 我现在在内核分配20000 字节,只有前4096字节的数据不正确! 不知你有什么高见!当然我也可以反过来做,可是我觉得这样做也可以,可就是传不对!!请指教! :) |
|
|
8楼#
发布于:2002-08-14 10:27
m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
因为你的m_pBuffer的其实地址不一定是4k边界对齐的。你可以在 softice里面跟一下看. |
|
|
9楼#
发布于:2002-08-14 10:39
mask2000
请指教用softice怎么跟??? 不是页对齐有什么影响吗??请指教谢谢! |
|
|
10楼#
发布于: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); |
|
|
11楼#
发布于:2002-08-14 12:24
谢谢!我去试试!可是没什么一定要保证4k对齐那???
|
|
|
12楼#
发布于:2002-08-14 12:30
mask2000:
m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align这样就能保证页对齐吗?可是编译通不过!错误: error C2296: \'&\' : illegal, left operand has type \'unsigned char *\' |
|
|
13楼#
发布于:2002-08-14 12:35
你可以这样, 这是什么?! |
|
14楼#
发布于:2002-08-14 12:53
我觉得m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
这句话可能有问题,在DDK中一般是用 PUCHAR m_pBuffer=ExAllocatePool(NonPagedPool,20000)来实现的。 另外:你只需把映射后的指针传给App就可以了 |
|
15楼#
发布于:2002-08-14 12:53
arthurtu: :)你有什么高见?不妨说一下!
|
|
|
16楼#
发布于:2002-08-14 13:24
因为不用driverwork,就不敢乱说了。
但是m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align是很奇怪的。 |
|
17楼#
发布于:2002-08-14 13:34
因为不用driverwork,就不敢乱说了。 靠,搞错了一下。因该是这样。 m_pBuffer= m_pBuffer&0xfffff000 + 0x1000; 才对. |
|
|
18楼#
发布于:2002-08-14 13:38
rifter: 因为我时用的应用程序的空间,驱动应该就不要再申请空间了,所以想不通你说的应用访问驱动里的空间,但是你又在APP中申请了空间。 一个问题是:这样不是浪费了APP中的空间,如果该空间很大,不是白白浪费了吗? 是不是和驱动里申请的空间一样大呢? 不会就是你说的前4096字节啊? 另外:pBuffer是什么呢,这样就改写了ReadFile()中pBuf指针吗? 在该处是指针还是引用,不会是引用吧? [编辑 - 8/14/02 by rifter] |
|
|
19楼#
发布于:2002-08-14 13:38
不错,这行代码有问题,编译器也给出了错误,类型不匹配,左操作数m_pBuffer是unsigned char *,而0xfffff000是整型
|
|
上一页
下一页