阅读:1808回复:5
vxd 与应用程序通信的问题
请教各位高手:
采集的数据存放在vxd开辟的存储区(数组)中,现要把他传输到应用程序中,应该采用什么样的方法??? 如下: vxd: int buffer[512]; case read; pDIOCParams->dioc_OutBuf=???? app: deviceIoControl(hDevice,read,0,0,???,???,0,null) |
|
最新喜欢:dongju...
|
沙发#
发布于: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++; //.... |
|
板凳#
发布于:2002-05-04 23:48
如果在应用程序中申请的缓冲区很大,驱动程序能正长工作么?
我以前就是按上面的方法写的程序,但调试是总是出现“windows protect fault....\"“?page fault...”以致无法退出softice 只能重启电脑,很烦呀,以下午蓝屏重启了 n次。。。 请高手给与指点。。。非常感谢!!!(有\\\\\\money/// ) |
|
|
地板#
发布于:2002-05-06 15:54
page fault,说明你的驱动有问题。
在ISR使用的app的内存,一定要lock,因为不能保证它没有被“分页”出去,ISR是不能访问分页内存的。 还要防止越界,尽量不要用C runtime lib的函数,等等。 |
|
地下室#
发布于:2002-05-06 23:17
高手请讲一讲如何在vxd 中锁存缓冲区???
|
|
|
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)); } |
|