Win CE中流驱动支持临界区的问题!

[复制链接]
2713|4
 楼主| zzddk 发表于 2008-1-28 14:20 | 显示全部楼层 |阅读模式
写了一个简单的流驱动,大体是这样的:<br />在DLL文件中,定义一个全局变量:<br />unsigned&nbsp;char&nbsp;chBuffer[BUFSIZE];<br /><br />在XXX_Init中对其进行初始化为全0;<br />DWORD&nbsp;COM_Init(DWORD&nbsp;dwContext)<br /><br />EnterCriticalSection(&(pDrv-&gtInitCS));&nbsp;&nbsp;&nbsp;&nbsp;<br />memset&nbsp;(chBuffer,&nbsp;0,&nbsp;BUFSIZE&nbsp;*&nbsp;sizeof(unsigned&nbsp;char));<br />LeaveCriticalSection(&(pDrv-&gtInitCS));<br /><br />在XXX_Write()中对其写入数据,例如一个固定的字符串;<br />DWORD&nbsp;COM_Write(HANDLE&nbsp;hOpenContext,&nbsp;LPCVOID&nbsp;pSourceBytes,&nbsp;DWORD&nbsp;NumberOfBytes)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtWriteCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;min(BUFSIZE,&nbsp;NumberOfBytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(chBuffer,&nbsp;(PBYTE)pSourceBytes,&nbsp;dwRet);<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtWriteCS));<br /><br />在XXX_Read中把写入的数据读出;<br /><br />DWORD&nbsp;COM_Read(HANDLE&nbsp;hOpenContext,&nbsp;LPVOID&nbsp;pBuffer,&nbsp;DWORD&nbsp;Count)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtReadCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Copy&nbsp;the&nbsp;smaller&nbsp;of&nbsp;buffer&nbsp;size&nbsp;or&nbsp;string&nbsp;size.<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwcbBuffer&nbsp;=&nbsp;strlen((char&nbsp;*)chBuffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;min(dwcbBuffer,&nbsp;Count);<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy((unsigned&nbsp;char&nbsp;*)pBuffer,&nbsp;chBuffer,&nbsp;dwRet);<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtReadCS));<br /><br />大体就是这个样子,我在初始化,读,写里面加了临界区保护数据,DLL文件可以编译通过,但是生成NK文件,对流驱动进行操作时确同问题,调试口给出的信息是:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;Abort:&nbsp;Thread=8fe8b6d8&nbsp;Proc=8e626160&nbsp;'device.exe'<br />AKY=00000005&nbsp;PC=03f92490(coredll.dll+0x00022490)&nbsp;RA=06039a38(device.exe+0x00029a<br />38)&nbsp;BVA=06039a39&nbsp;FSR=00000003<br />RaiseException:&nbsp;Thread=8fe8b6d8&nbsp;Proc=8e626160&nbsp;'device.exe'<br />AKY=00000005&nbsp;PC=03f8dff8(coredll.dll+0x0001dff8)&nbsp;RA=8c22a6d4(NK.EXE+0x0002a6d4)<br />BVA=00000001&nbsp;FSR=00000001<br /><br />但是我把监界区保护去掉,程序驱动可以正常加载和调用,只要一出现临界区保护:EnterCriticalSection();<br />LeaveCriticalSection();<br />就会出现上面的错误,会是那里的原因呢?
 楼主| zzddk 发表于 2008-1-28 14:21 | 显示全部楼层

驱动源码给出:

//&nbsp;VirtualCom.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;DLL&nbsp;application.<br />//<br /><br />#include&nbsp;&quot;stdafx.h&quot;<br />#include&nbsp;&quot;VirtualCom.h&quot;<br /><br /><br />HANDLE&nbsp;g_hInstance;<br /><br />#define&nbsp;BUFSIZE&nbsp;2048<br />unsigned&nbsp;char&nbsp;chBuffer[BUFSIZE];<br /><br />BOOL&nbsp;APIENTRY&nbsp;DllMain(&nbsp;HANDLE&nbsp;hModule,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;ul_reason_for_call,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPVOID&nbsp;lpReserved<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(ul_reason_for_call)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;DLL_PROCESS_ATTACH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_hInstance&nbsp;=&nbsp;hModule;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;DLL_PROCESS_ATTACH\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisableThreadLibraryCalls&nbsp;((HMODULE)g_hInstance);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//case&nbsp;DLL_THREAD_ATTACH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;DLL_THREAD_ATTACH\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//case&nbsp;DLL_THREAD_DETACH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;DLL_THREAD_DETACH\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;DLL_PROCESS_DETACH:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;DLL_PROCESS_DETACH\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TRUE;<br />}<br /><br /><br />//&nbsp;This&nbsp;is&nbsp;an&nbsp;example&nbsp;of&nbsp;an&nbsp;exported&nbsp;variable<br />VirtualCom_API&nbsp;int&nbsp;nVirtualCom=0;<br /><br />//&nbsp;This&nbsp;is&nbsp;an&nbsp;example&nbsp;of&nbsp;an&nbsp;exported&nbsp;function.<br />VirtualCom_API&nbsp;int&nbsp;fnVirtualCom(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;42;<br />}<br /><br />//&nbsp;This&nbsp;is&nbsp;the&nbsp;constructor&nbsp;of&nbsp;a&nbsp;class&nbsp;that&nbsp;has&nbsp;been&nbsp;exported.<br />//&nbsp;see&nbsp;VirtualCom.h&nbsp;for&nbsp;the&nbsp;class&nbsp;definition<br />CVirtualCom::CVirtualCom()<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;<br />}<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />DWORD&nbsp;COM_Init(DWORD&nbsp;dwContext)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Init\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Allocate&nbsp;a&nbsp;driver&nbsp;instance&nbsp;struct<br />&nbsp;&nbsp;&nbsp;&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)LocalAlloc(LPTR,sizeof(PDRVCONTEXT));<br />&nbsp;&nbsp;&nbsp;&nbsp;//allocate&nbsp;driver&nbsp;instance&nbsp;struct&nbsp;failed&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(pDrv&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Init:Allocate&nbsp;driver&nbsp;instance&nbsp;struct&nbsp;failed!\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//initialize&nbsp;driver&nbsp;instance&nbsp;struct<br />&nbsp;&nbsp;&nbsp;&nbsp;memset((PBYTE)pDrv,0,sizeof(PDRVCONTEXT));<br />&nbsp;&nbsp;&nbsp;&nbsp;pDrv-&gtdwSize&nbsp;=&nbsp;sizeof(PDRVCONTEXT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//initialize&nbsp;critical&nbsp;section&nbsp;variable<br />&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&(pDrv-&gtInitCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&(pDrv-&gtCloseCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&(pDrv-&gtReadCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&(pDrv-&gtWriteCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Initialize&nbsp;buffer&nbsp;to&nbsp;zero.<br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtInitCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Init:EnterCriticalSection(&(pDrv-&gtInitCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;memset&nbsp;(chBuffer,&nbsp;0,&nbsp;BUFSIZE&nbsp;*&nbsp;sizeof(unsigned&nbsp;char));<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtInitCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Init:LeaveCriticalSection(&(pDrv-&gtInitCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;return&nbsp;value&nbsp;to&nbsp;non-zero.<br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dwRet;<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />BOOL&nbsp;COM_Deinit(DWORD&nbsp;hDeviceContext)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)&nbsp;hDeviceContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Deinit\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(pDrv&&(pDrv-&gtdwSize&nbsp;==&nbsp;sizeof(PDRVCONTEXT)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalFree((PBYTE)pDrv);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Deinit:LocalFree((PBYTE)pDrv)\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//Delete&nbsp;Critical&nbsp;Section<br />&nbsp;&nbsp;&nbsp;&nbsp;//DeleteCriticalSection(&(pDrv-&gtInitCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&(pDrv-&gtCloseCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&(pDrv-&gtReadCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&(pDrv-&gtWriteCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bRet;<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />DWORD&nbsp;COM_Open(HANDLE&nbsp;hDeviceContext,&nbsp;DWORD&nbsp;AccessCode,&nbsp;DWORD&nbsp;ShareMode)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)hDeviceContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Open\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//Verify&nbsp;that&nbsp;the&nbsp;context&nbsp;handle&nbsp;is&nbsp;valid<br />&nbsp;&nbsp;&nbsp;&nbsp;//if(pDrv&nbsp;&&&nbsp;(pDrv-&gtdwSize&nbsp;!=&nbsp;sizeof(PDRVCONTEXT)))<br />&nbsp;&nbsp;&nbsp;&nbsp;//{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Open:context&nbsp;handle&nbsp;is&nbsp;invalid\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//}<br />&nbsp;&nbsp;&nbsp;&nbsp;//count&nbsp;the&nbsp;number&nbsp;of&nbsp;opens<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Open:Enter&nbsp;InterlockedIncrement\r\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//InterlockedIncrement((long&nbsp;*)&pDrv-&gtnNumOpens);<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Open:pDrv-&gtnNumOpens++\n&quot;)));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;1;&nbsp;//&nbsp;Have&nbsp;to&nbsp;make&nbsp;non-zero&nbsp;for&nbsp;this&nbsp;call&nbsp;to&nbsp;succeed.<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dwRet;<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />BOOL&nbsp;COM_Close(DWORD&nbsp;hOpenContext)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)hOpenContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Close\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//Verify&nbsp;that&nbsp;the&nbsp;context&nbsp;handle&nbsp;is&nbsp;valid&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(pDrv&nbsp;&&&nbsp;(pDrv-&gtdwSize&nbsp;!=&nbsp;sizeof(PDRVCONTEXT)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//Close&nbsp;stream&nbsp;driver&nbsp;and&nbsp;increase&nbsp;counter.<br />&nbsp;&nbsp;&nbsp;&nbsp;//if(pDrv-&gtnNumOpens)<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;pDrv-&gtnNumOpens--;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Clear&nbsp;data&nbsp;buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtCloseCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(chBuffer,0,sizeof(unsigned&nbsp;char)*BUFSIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtCloseCS));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bRet;<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />DWORD&nbsp;COM_Read(HANDLE&nbsp;hOpenContext,&nbsp;LPVOID&nbsp;pBuffer,&nbsp;DWORD&nbsp;Count)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)hOpenContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Read\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//Verify&nbsp;that&nbsp;the&nbsp;context&nbsp;handle&nbsp;is&nbsp;valid<br />&nbsp;&nbsp;&nbsp;&nbsp;//if(pDrv&nbsp;&&&nbsp;(pDrv-&gtdwSize&nbsp;!=&nbsp;sizeof(PDRVCONTEXT)))<br />&nbsp;&nbsp;&nbsp;&nbsp;//{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Read:context&nbsp;handle&nbsp;is&nbsp;invalid\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//}<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;EnterCriticalSection(&(pDrv-&gtReadCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtReadCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;Enter&nbsp;aleady&nbsp;CriticalSection(&(pDrv-&gtReadCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Copy&nbsp;the&nbsp;smaller&nbsp;of&nbsp;buffer&nbsp;size&nbsp;or&nbsp;string&nbsp;size.<br />&nbsp;&nbsp;&nbsp;&nbsp;//DWORD&nbsp;cbBuffer&nbsp;=&nbsp;wcslen(chBuffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwcbBuffer&nbsp;=&nbsp;strlen((char&nbsp;*)chBuffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;min(dwcbBuffer,&nbsp;Count);<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy((unsigned&nbsp;char&nbsp;*)pBuffer,&nbsp;chBuffer,&nbsp;dwRet);<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtReadCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;LeaveCriticalSection(&(pDrv-&gtReadCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Return&nbsp;number&nbsp;of&nbsp;bytes&nbsp;read.<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dwRet;<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />DWORD&nbsp;COM_Write(HANDLE&nbsp;hOpenContext,&nbsp;LPCVOID&nbsp;pSourceBytes,&nbsp;DWORD&nbsp;NumberOfBytes)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PDRVCONTEXT&nbsp;pDrv&nbsp;=&nbsp;(PDRVCONTEXT)hOpenContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Write\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Verify&nbsp;that&nbsp;the&nbsp;context&nbsp;handle&nbsp;is&nbsp;valid<br />&nbsp;&nbsp;&nbsp;&nbsp;//if(pDrv&nbsp;&&&nbsp;(pDrv-&gtdwSize&nbsp;!=&nbsp;sizeof(PDRVCONTEXT)))<br />&nbsp;&nbsp;&nbsp;&nbsp;//{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Write:context&nbsp;handle&nbsp;is&nbsp;invalid\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//}<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Write:EnterCriticalSection(&(pDrv-&gtWriteCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&(pDrv-&gtWriteCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;Enter&nbsp;aleady&nbsp;CriticalSection(&(pDrv-&gtWriteCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Copy&nbsp;the&nbsp;smaller&nbsp;of&nbsp;buffer&nbsp;size&nbsp;or&nbsp;number&nbsp;of&nbsp;bytes&nbsp;they&nbsp;send&nbsp;us.<br />&nbsp;&nbsp;&nbsp;&nbsp;dwRet&nbsp;=&nbsp;min(BUFSIZE,&nbsp;NumberOfBytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(chBuffer,&nbsp;(PBYTE)pSourceBytes,&nbsp;dwRet);<br />&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&(pDrv-&gtWriteCS));<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;COM_Write:LeaveCriticalSection(&(pDrv-&gtWriteCS))\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Return&nbsp;number&nbsp;of&nbsp;bytes&nbsp;written.<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dwRet;<br />}<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />BOOL&nbsp;COM_IOControl(DWORD&nbsp;hOpenContext,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwCode,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PBYTE&nbsp;pBufIn,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwLenIn,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PBYTE&nbsp;pBufOut,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwLenOut,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PDWORD&nbsp;pdwActualOut)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_IOControl\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bRet;<br />}<br /><br /><br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />void&nbsp;COM_PowerDown(DWORD&nbsp;hDeviceContext)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_PowerDown\n&quot;)));<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />void&nbsp;COM_PowerUp(DWORD&nbsp;hDeviceContext)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_PowerUp\n&quot;)));<br />}&nbsp;<br /><br />//-----------------------------------------------------------------------------<br />//-----------------------------------------------------------------------------<br />DWORD&nbsp;COM_Seek(DWORD&nbsp;hOpenContext,&nbsp;long&nbsp;Amount,&nbsp;DWORD&nbsp;Type)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRet&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RETAILMSG(1,(TEXT(&quot;VirtualCom:&nbsp;COM_Seek\n&quot;)));<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dwRet;<br />}&nbsp;<br />
 楼主| zzddk 发表于 2008-1-28 14:22 | 显示全部楼层

PDRVCONTEXT是我定义的一个结构体.

typedef&nbsp;struct&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;nNumOpens;<br />&nbsp;&nbsp;&nbsp;&nbsp;CRITICAL_SECTION&nbsp;InitCS;<br />&nbsp;&nbsp;&nbsp;&nbsp;CRITICAL_SECTION&nbsp;ReadCS;<br />&nbsp;&nbsp;&nbsp;&nbsp;CRITICAL_SECTION&nbsp;WriteCS;<br />&nbsp;&nbsp;&nbsp;&nbsp;CRITICAL_SECTION&nbsp;CloseCS;<br />}&nbsp;DRVCONTEXT,&nbsp;*PDRVCONTEXT;
high 发表于 2008-1-28 14:24 | 显示全部楼层

哥们,你可以做这些事情.

1.你可以根据map文件定位错误,不过好像你已经定位好了.<br />2.你应该有pb,你找到这个宏看看究竟干了啥.
农民讲习所 发表于 2008-1-30 22:35 | 显示全部楼层

pDrv = (PDRVCONTEXT)LocalAlloc(LPTR,sizeof( DRVCONTEXT )); ?

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部