这是在wince6.0下编写的流驱动中读函数代码
DWORD PWM_Read(DWORD Handle, LPVOID pBuffer, DWORD Count)
{
DWORD *pReadBuffer;
DWORD i=0;
// 映射地址空间
pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());
for(i=0;i<5;i++)
{
*(pReadBuffer) = frePD[i];// frePD[i]为全局变量,DWORD frePD[5];
pReadBuffer++;
}
if ((pBuffer == NULL) || (Count <= 0))
{ /* 读函数入口参数错误 */
RETAILMSG(1, (TEXT("::: PWM_Read() parameter is error.\r\n")));
return 0;
}
return 5 ;
}
在应用程序中接受数据的代码为:
BYTE *BufOut;
ReadFile(hPWM,&BufOut,5,0,NULL);
现在出现的问题是只要应用程序一调用ReadFile();DNW就会打印一些信息:
Exception 'Data Abort' (4): Thread-Id=09260016(pth=88d3c968), Proc-Id=00400002(pprc=83079308) 'NK.EXE', VM-active=08e10016(pprc=88c93dd0) 'pwmTest3.exe'
PC=c0283c80(devmgr.dll+0x00003c80) RA=c0283c80(devmgr.dll+0x00003c80) SP=d7b2fdd4, BVA=00000000
不过数据是传输正确的。请问问什么会出现上面的异常信息呢
------解决方案--------------------
注意检查函数的参数类型,把参数打印出来看看
------解决方案--------------------
看调试信息,是你的应用层出错。估计是调用底层驱动接口传递的参数不正确,最大可能就是数组指针这一类的,当这些没有进行分配空间就调用ReadFile的时候,底层对这个进行写操作就会出错。
------解决方案--------------------
BYTE *BufOut = new BYTE[5];
ReadFile(hPWM, &BufOut, 5, 0, NULL);
// use Bufout
delete [] BufOut;
------解决方案--------------------
Or
BYTE BufOut[5] = {0};
ReadFile(hPWM, &BufOut[0], 5, 0, NULL);
------解决方案--------------------
3、4楼的回答是正确的,ReadFile函数是需要你传入存储空间的,你的BYTE *BufOut;只是定义了一个指针,没有分配空间,所以会出现“Data Abort”数据溢出的错误。
------解决方案--------------------
指针初始化没有分配空间。。。
------解决方案--------------------
看调试信息,还是你应用层出错。下面给你贴个例子:
驱动层:
- C/C++ code
DWORD CSD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count){ OutputDebugString( L"###Scan Code Driver Read\r\n" ); // ADD YOUR HANDLER if(ReadLock || pBuffer == NULL) return 0; ReadLock = TRUE; // 在这里添加打开扫描条码返回数据的处理 DWORD i = 0; int8 rt; char *outptr; (char *)outptr = (char *)pBuffer; char cBuf[MaxBarReadBuf]; memset(cBuf, 0, sizeof(cBuf) ); rt = GetBarCode(cBuf);//GetScanCode(cBuf);// RETAILMSG(1, ( TEXT("** CodeScanDrv.cpp ** rt=%d\r\n"), rt) ); if(rt > 0){ for(i=0; i<=rt; i++){ // 防止数据溢出 if(i >= MaxBarReadBuf) break; *(outptr) = cBuf[i]; //RETAILMSG(1, ( TEXT("*** i=%d, (*outptr)=%d\r\n"), i, *(outptr)) ); outptr++; } } ReadLock = FALSE; OutputDebugString( L"###Scan Code Driver Read Success\r\n" ); return rt;}
------解决方案--------------------
也贴一段驱动代码,楼主可以参考
驱动层:
- C/C++ code
/*******************************************************************************************函数名称: KEY_Read描 述: 读取按键标识输入参数: DWORD Handle : 驱动程序引用事例句柄 LPVOID pBuffer : 接收缓冲区 DWORD dwNumBytes: 要读的字节数输出参数: 无返 回: 实际读到字节数*******************************************************************************************/DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){ DWORD ret; uchar* pReadBuffer; if ((pBuffer == NULL) || (dwNumBytes <= 0)) { return 0; } pReadBuffer = (uchar*)MapPtrToProcess(pBuffer, GetCallerProcess()); //pReadBuffer是应用程序的pBuffer在设备管理器上的地址映射! *pReadBuffer = 0; /* 挂起当前线程,直到 KEY1 按键按下或驱动关闭 */ ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, INFINITE); if (ret == WAIT_OBJECT_0) { ResetEvent(gReadKeyEvent[0]); *pReadBuffer = 1; /* 按键按下 */ v_pIOPregs->rGPBDAT &= ~(3<<6); RETAILMSG (1,(TEXT("%x \r\n"),*pReadBuffer)); RETAILMSG(1, (TEXT("::: KEY_Read Successfully! \r\n"))); return 1; } else if(ret == (WAIT_OBJECT_0 + 1)) { ResetEvent(gReadKeyEvent[1]); *pReadBuffer = 0; /* 驱动关闭 */ return 1; } return 0;