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