zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2770回复: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-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);

nice
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-11 18:38
谁能帮我看看!我实在是急呀!!
那位高手帮帮忙!谢谢!谢谢!~  :( :( :( :( :( :( :( :( :(
nice
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-12 08:47
你是如何从应用程序读出数据的?有没有原码?能不能贴一份?我可以帮你分析一下
wangxdong
驱动小牛
驱动小牛
  • 注册日期2002-07-08
  • 最后登录2003-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-13 08:51
内存中每页的大小也是4096,我估计是错位了吧,我也不太懂的
请多多指教!
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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后面的数据也不对呀!
nice
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-13 22:33
这是我的驱动程序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);

 


m_UserSpace = m_Mdl.MapToUserSpace();
*pBuffer = m_UserSpace;
    
要做映射吗? 不是App已经申请空间了吗
pBuffer是什么?
分数 你想要吗?
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-14 10:24
rifter:
    我是想把2驱动程序分配的内存空间,映射到应用程序空间。而不是让驱动程序访问应用分配的空间!
    我现在在内核分配20000 字节,只有前4096字节的数据不正确!
不知你有什么高见!当然我也可以反过来做,可是我觉得这样做也可以,可就是传不对!!请指教! :)
nice
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-14 10:27
m_pBuffer=new(NonPagedPool) UCHAR[BUFFER_SIZE];
因为你的m_pBuffer的其实地址不一定是4k边界对齐的。你可以在
softice里面跟一下看.
不是我不明白,只是这世界变化太快.
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-14 10:39
mask2000
请指教用softice怎么跟???
  不是页对齐有什么影响吗??请指教谢谢!
nice
mask2000
驱动牛犊
驱动牛犊
  • 注册日期2002-04-08
  • 最后登录2002-08-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);
不是我不明白,只是这世界变化太快.
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-14 12:24
谢谢!我去试试!可是没什么一定要保证4k对齐那???
nice
zhangchunxia
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2004-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-14 12:30
mask2000:
  m_pBuffer= m_pBuffer&0xfffff000;//keep 4k align这样就能保证页对齐吗?可是编译通不过!错误:
error C2296: \'&\' : illegal, left operand has type \'unsigned char *\'

nice
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于: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);

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


靠,搞错了一下。因该是这样。
m_pBuffer= m_pBuffer&0xfffff000 + 0x1000;
才对.
不是我不明白,只是这世界变化太快.
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-14 13:38
rifter:
    我是想把2驱动程序分配的内存空间,映射到应用程序空间。而不是让驱动程序访问应用分配的空间!
    我现在在内核分配20000 字节,只有前4096字节的数据不正确!
不知你有什么高见!当然我也可以反过来做,可是我觉得这样做也可以,可就是传不对!!请指教! :)


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


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


[编辑 -  8/14/02 by  rifter]
分数 你想要吗?
yanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2009-10-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-08-14 13:38
不错,这行代码有问题,编译器也给出了错误,类型不匹配,左操作数m_pBuffer是unsigned char *,而0xfffff000是整型
上一页
游客

返回顶部