#ifndef _VBDEBUGLOG_H_
#define _VBDEBUGLOG_H_
#ifdef VBDEBUGLOG_EXPORTS
#define DECLSPEC_DLLPORT __declspec(dllexport)
#else
#define DECLSPEC_DLLPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"{
#endif
DECLSPEC_DLLPORT
BOOL WINAPI DebugLogBin(
LPCTSTR lpszLogMode,
LPCTSTR lpszProcName,
LPCTSTR lpszDumpLabel,
LPCTSTR lpszLogPath,
LPVOID lpDumpData,
DWORD dwBytesOfData
);
#ifdef __cplusplus
}
#endif
#endif
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include "VBDebugLog.h"
#define DUMP_HEADER "---- ---- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF\r\n"
#define CHAR_ASCII_CTLCODE '.'
#define RETRY_FILEOPEN 5
DECLSPEC_DLLPORT
BOOL WINAPI DebugLogBin(
LPCTSTR lpszLogMode,
LPCTSTR lpszProcName,
LPCTSTR lpszDumpLabel,
LPCTSTR lpszLogPath,
LPVOID lpDumpData,
DWORD dwBytesOfData
)
{
BOOL bResult = TRUE;
HANDLE hFile = NULL;
DWORD dwRetryCount = 0;
DWORD dwBytesToWrite = 0;
DWORD dwBytesWritten = 0;
TCHAR szWriteBuffer[1024];
SYSTEMTIME LocalTime;
LPBYTE pBuffer = NULL;
DWORD dwBytesCount = 0;
TCHAR szLine[12];
TCHAR szHex[64];
TCHAR szAscii[64];
TCHAR *pHex = NULL, *pAscii = NULL;
if ( !( lpszLogMode && lpszLogPath && lpDumpData ) )
return FALSE;
dwRetryCount = RETRY_FILEOPEN;
while ( INVALID_HANDLE_VALUE == ( hFile = CreateFile( lpszLogPath,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL ) ) )
{
if ( !dwRetryCount-- ) {
return FALSE;
}
Sleep( 100 );
}
SetFilePointer( hFile, 0, NULL, FILE_END );
memset( (void *)&LocalTime, 0x00, sizeof( LocalTime ) );
GetLocalTime( &LocalTime );
dwBytesToWrite = _stprintf( szWriteBuffer,
"%c [%4d/%02d/%02d %02d:%02d:%02d] [%4d] [%-40.40s] %s (%d bytes)\r\n",
*lpszLogMode,
LocalTime.wYear, LocalTime.wMonth, LocalTime.wDay,
LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
GetCurrentProcessId(),
lpszProcName? lpszProcName: "",
lpszDumpLabel? lpszDumpLabel: "NO NAME",
dwBytesOfData );
if ( !( bResult = WriteFile( hFile, szWriteBuffer, dwBytesToWrite, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
}
else if ( !( bResult = WriteFile( hFile, DUMP_HEADER, sizeof( DUMP_HEADER ) - 1, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
}
else {
pBuffer = (LPBYTE)lpDumpData;
while ( dwBytesCount < dwBytesOfData )
{
_stprintf( szLine, _T( "%04X %04X" ), HIWORD( dwBytesCount ), LOWORD( dwBytesCount ) );
memset( (void *)szHex, '\0', sizeof( szHex ) );
memset( (void *)szAscii, '\0', sizeof( szAscii ) );
pHex = szHex;
pAscii = szAscii;
do
{
_stprintf( pHex, _T( "%02X " ), *pBuffer );
pHex += 3;
if ( 0x20 > *pBuffer ) {
*pAscii = CHAR_ASCII_CTLCODE;
}
else {
*pAscii = *pBuffer;
}
pAscii++;
pBuffer++;
dwBytesCount++;
} while ( ( dwBytesCount % 0x0000010 ) && ( dwBytesCount < dwBytesOfData ) );
dwBytesToWrite = _stprintf( szWriteBuffer, _T( "%s %-48.48s %-16.16s\r\n" ), szLine, szHex, szAscii );
if ( !( bResult = WriteFile( hFile, szWriteBuffer, dwBytesToWrite, &dwBytesWritten, (LPOVERLAPPED)NULL ) ) ) {
break;
}
}
if ( bResult ) {
bResult = WriteFile( hFile, "\r\n", 2, &dwBytesWritten, (LPOVERLAPPED)NULL );
}
}
CloseHandle( hFile );
return bResult;
}
LIBRARY VBDebugLog
EXPORTS
DebugLogBin
コメント