sssong
驱动牛犊
驱动牛犊
  • 注册日期2002-04-03
  • 最后登录2007-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1808回复:5

vxd 与应用程序通信的问题

楼主#
更多 发布于:2002-05-04 20:31
请教各位高手:
    采集的数据存放在vxd开辟的存储区(数组)中,现要把他传输到应用程序中,应该采用什么样的方法???
如下:
vxd:
int buffer[512];

case read;
   pDIOCParams->dioc_OutBuf=????    

app:

deviceIoControl(hDevice,read,0,0,???,???,0,null)

最新喜欢:

dongjundongju...
惊涛拍案,舍我其谁!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-04 22:33
你可以在app层开辟空间,将地址pass给VxD,不就可以了?
在VxD开辟大的空间不是好的事情。
app:
int Buffer[512];
DeviceIOControl(hDevice, XXX,Buffer, sizeof(int), NULL, 0, 0....);//最好把数组的大小也pass给VxD, lock的时候要用到

VxD:
case XXXX:
//get the address of Buffer, if you use it in ISR
//Lock it
pBuffer = p->dioc_InBuf;
.....
// when data is get, put it to Buffer
// such as
// pBuffer[Counter] = Input_Data;
// Counter++;
//....
sssong
驱动牛犊
驱动牛犊
  • 注册日期2002-04-03
  • 最后登录2007-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-04 23:48
如果在应用程序中申请的缓冲区很大,驱动程序能正长工作么?

我以前就是按上面的方法写的程序,但调试是总是出现“windows protect fault....\"“?page fault...”以致无法退出softice 只能重启电脑,很烦呀,以下午蓝屏重启了 n次。。。

请高手给与指点。。。非常感谢!!!(有\\\\\\money/// )

惊涛拍案,舍我其谁!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-06 15:54
page fault,说明你的驱动有问题。
在ISR使用的app的内存,一定要lock,因为不能保证它没有被“分页”出去,ISR是不能访问分页内存的。
还要防止越界,尽量不要用C runtime lib的函数,等等。
sssong
驱动牛犊
驱动牛犊
  • 注册日期2002-04-03
  • 最后登录2007-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-06 23:17
高手请讲一讲如何在vxd 中锁存缓冲区???
惊涛拍案,舍我其谁!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-05-06 23:22
看一下这个例子
/*
 * to lock the page which is accessed in ISR
 */
DWORD MyPageLock(DWORD lpMem, DWORD cbSize)
{
    DWORD LinPageNum = 0,
          LinOffset  = 0,
          nPages     = 0;

    LinOffset  = (DWORD)lpMem & 0xfff;// page offset of memory to map
    LinPageNum = (DWORD)lpMem >> 12;  // generate page number

    // Calculate # of pages to map globally
    nPages = (((DWORD)lpMem + cbSize) >> 12) - LinPageNum + 1;
    if(PageCheckLinRange(LinPageNum,nPages,0) < nPages)
    {
       return 0;
    }
    //
    // Return global mapping of passed in pointer, as this new pointer
    // is how the memory must be accessed out of context.
    //
    return (LinPageLock(LinPageNum, nPages, PAGEMAPGLOBAL) + LinOffset);
}

BOOL MyPageUnLock(DWORD lpMem, DWORD cbSize)
{
   DWORD LinPageNum = 0,
//         LinOffSet  = 0,
         nPage      = 0;
  
//   LinOffSet  = lpMem & 0x0fff;
   LinPageNum = lpMem >> 12;
   nPage      = (lpMem + cbSize) >> 12 - LinPageNum + 1;

   return (LinPageUnLock(LinPageNum,nPage,PAGEMAPGLOBAL));
}
游客

返回顶部