www.pudn.com > GpsVirtualDriver.zip > GpsVirtualDriver.cpp


// GpsVirtualDriver.cpp : Defines the entry point for the DLL application. 
// 
 
#include "stdafx.h" 
 
//#define LOG_CALLS 
 
char * atoh = "0123456789ABCDEF"; 
 
//             "   0    1    2    3    4    5    6    7    8    9 : ; < = > ? @    A    B    C    D    E    F" 
BYTE htoa1[] = {0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0,0,0,0,0,0,0,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0}; 
BYTE htoa2[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0,0,0,0,0,0,0,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; 
 
void Convert( LPVOID pBuffer, DWORD Count ) 
{ 
	char* pCh = (char*)pBuffer; 
	char ch, crc1, crc2; DWORD nCRC; BYTE state = 10; 
	for (DWORD i=0;i> 4]; 
					pCh[i-2]=atoh[ nCRC & 0x0F ]; 
					pCh[i-1]=13; 
					pCh[i-0]=10; 
 
					state = 10; 
				} 
				break; 
			} 
		} 
	} 
} 
 
 
#ifdef LOG_CALLS 
void Log(LPCTSTR szStr, bool bLF = true) 
{ 
	HANDLE hFile = CreateFile ( _T("\\log.txt"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); 
 
	SetFilePointer( hFile, 0, 0, FILE_END ); 
 
	DWORD dwLen; 
	BOOL bOK = WriteFile( hFile, szStr, _tcslen(szStr)*sizeof(TCHAR), &dwLen, NULL ); 
 
	WriteFile( hFile, _T("\n"), _tcslen(_T("\n")), &dwLen, NULL ); 
 
	CloseHandle( hFile ); 
 
	OutputDebugString( szStr ); 
/* 
	FILE *f = fopen("\\DemoDriverLog.txt", "a"); 
	fprintf(f, "%u", GetTickCount()); 
	fprintf(f, "%s", szStr); 
	if (bLF) 
		fprintf(f, "\n"); 
	fflush(f); 
	fclose(f); 
*/ 
} 
#endif 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Init(LPCTSTR pContext, LPCVOID lpvBusContext); 
GPSVIRTUALDRIVERDLL_API BOOL COM_Deinit( DWORD hDeviceContext ); 
GPSVIRTUALDRIVERDLL_API DWORD COM_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode ); 
GPSVIRTUALDRIVERDLL_API BOOL COM_Close( DWORD hOpenContext ); 
GPSVIRTUALDRIVERDLL_API BOOL COM_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ); 
GPSVIRTUALDRIVERDLL_API void COM_PowerUp( DWORD hDeviceContext ); 
GPSVIRTUALDRIVERDLL_API void COM_PowerDown( DWORD hDeviceContext ); 
GPSVIRTUALDRIVERDLL_API DWORD COM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count ); 
GPSVIRTUALDRIVERDLL_API DWORD COM_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count ); 
GPSVIRTUALDRIVERDLL_API DWORD COM_Seek( DWORD hOpenContext, long Amount, WORD Type ); 
 
#define DEVICE_CONTEXT	0x1450 
#define OPEN_CONTEXT 0x1451 
 
HANDLE hComm = INVALID_HANDLE_VALUE; 
DWORD dwManagePort = 1; 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
					  DWORD  ul_reason_for_call,  
					  LPVOID lpReserved 
					  ) 
{ 
	switch ( ul_reason_for_call ) 
	{ 
	case DLL_PROCESS_ATTACH: 
		break; 
	case DLL_PROCESS_DETACH: 
		break; 
	case DLL_THREAD_ATTACH: 
		break; 
	case DLL_THREAD_DETACH: 
		break; 
	} 
	return TRUE; 
} 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Init( LPCTSTR pContext, LPCVOID lpvBusContext) 
{ 
#ifdef LOG_CALLS 
	Log(_T("Init\n")); 
#endif 
	DWORD dwPort = 0; 
	HKEY hKey; 
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, pContext, 0, 0, &hKey) == ERROR_SUCCESS) 
	{ 
		TCHAR szDriverKey[255]; 
		DWORD dwSize = 255; 
		DWORD dwType; 
		if (RegQueryValueEx(hKey, L"Key", 0, &dwType, (BYTE *)szDriverKey, &dwSize) == ERROR_SUCCESS) 
		{ 
			RegCloseKey(hKey); 
			if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szDriverKey, 0, 0, &hKey) == ERROR_SUCCESS) 
			{ 
				dwSize=4; 
				if (RegQueryValueEx(hKey, L"ManagePort", 0, &dwType, (BYTE *)&dwPort, &dwSize) != ERROR_SUCCESS) 
					dwPort = 0; 
				RegCloseKey(hKey); 
			} 
		} 
	} 
	if (dwPort != 0) 
		dwManagePort = dwPort; 
 
	return DEVICE_CONTEXT; 
} 
 
GPSVIRTUALDRIVERDLL_API BOOL COM_Deinit( DWORD hDeviceContext ) 
{ 
	if (hDeviceContext != DEVICE_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False Deinst\n")); 
#endif 
		return FALSE; 
	} 
 
#ifdef LOG_CALLS 
	Log(_T("DeInit\n")); 
#endif 
	return TRUE; 
} 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode ) 
{ 
	if (hDeviceContext != DEVICE_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False Open\n")); 
#endif 
		return 0; 
	} 
	TCHAR szPort[255]; 
	swprintf(szPort, L"COM%u:", dwManagePort); 
 
    hComm = CreateFile( 
		szPort,  
		AccessCode, 
		ShareMode, 
		NULL, 
		OPEN_EXISTING, 
		0, 
		NULL); 
 
#ifdef LOG_CALLS 
	TCHAR buf[255]; 
	_stprintf(buf, _T("Open port %s for access %u and share %u %s\n"), szPort, AccessCode, ShareMode, hComm ? _T("OK") : _T("Failed")); 
	Log(buf); 
#endif 
 
	if (hComm == INVALID_HANDLE_VALUE) 
		return 0; 
	else 
		return OPEN_CONTEXT; 
} 
 
GPSVIRTUALDRIVERDLL_API BOOL COM_Close( DWORD hOpenContext ) 
{ 
	if (hOpenContext != OPEN_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False Close\n")); 
#endif 
		return 0; 
	} 
 
#ifdef LOG_CALLS 
	Log(_T("Close\n")); 
#endif 
	BOOL bRet = CloseHandle(hComm); 
	hComm = INVALID_HANDLE_VALUE; 
	return bRet; 
} 
 
GPSVIRTUALDRIVERDLL_API BOOL COM_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ) 
{ 
	if (hOpenContext != OPEN_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False IOControl\n")); 
#endif 
		return 0; 
	} 
 
#ifdef LOG_CALLS 
	TCHAR buf[255]; 
	_stprintf(buf, _T("Control code=%u, inlen=%u\n"), dwCode, dwLenIn); 
	Log(buf); 
#endif 
 
	BOOL bRet=DeviceIoControl( 
		hComm,  
		dwCode,  
		pBufIn,  
		dwLenIn,  
		pBufOut,  
		dwLenOut, 
		pdwActualOut,  
		NULL); 
 
#ifdef LOG_CALLS 
	_stprintf(buf, _T("IOControl return bRet=%d, outlen=%u\n"), bRet, *pdwActualOut); 
	Log(buf); 
#endif 
 
	return bRet; 
} 
 
GPSVIRTUALDRIVERDLL_API void COM_PowerUp( DWORD hDeviceContext ) 
{ 
} 
 
GPSVIRTUALDRIVERDLL_API void COM_PowerDown( DWORD hDeviceContext ) 
{ 
} 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count ) 
{ 
	if (hOpenContext != OPEN_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False Read\n")); 
#endif 
		return 0; 
	} 
 
	DWORD dwBytes = 0; 
	ReadFile(hComm, pBuffer, Count, &dwBytes, NULL); 
 
	Convert( pBuffer, dwBytes ); 
 
#ifdef LOG_CALLS 
	TCHAR buf[100]; 
	_stprintf( buf, _T("Read max=%u, read count: %u\n"), Count, dwBytes ); 
	Log(buf); 
#endif 
 
	return dwBytes; 
} 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count ) 
{ 
	if (hOpenContext != OPEN_CONTEXT) 
	{ 
#ifdef LOG_CALLS 
		Log(_T("False Write\n")); 
#endif 
		return 0; 
	} 
 
#ifdef LOG_CALLS 
	TCHAR buf[255]; 
	_stprintf(buf, _T("Write bytes=%u\n"), Count); 
	Log(buf); 
#endif 
	DWORD dwBytes = 0; 
	WriteFile(hComm, pBuffer, Count, &dwBytes, NULL); 
	return dwBytes; 
} 
 
GPSVIRTUALDRIVERDLL_API DWORD COM_Seek( DWORD hOpenContext, long Amount, WORD Type ) 
{ 
#ifdef LOG_CALLS 
	TCHAR buf[255]; 
	_stprintf(buf, _T("Seek Amount=%u, Type=%u\n"), Amount, Type); 
	Log(buf); 
#endif 
 
	return 0; 
}