INTEGRATION: CWS crashrep12 (1.6.4); FILE MERGED
2003/11/28 14:59:21 hro 1.6.4.1: #114150# MD5 checksum creation in crashreporter
This commit is contained in:
parent
4c3f7a331c
commit
58c1792d8a
1 changed files with 193 additions and 7 deletions
|
@ -24,12 +24,14 @@
|
|||
#endif
|
||||
|
||||
#include <systools/win32/uwinapi.h>
|
||||
#include <rtl/digest.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#include <string>
|
||||
#include <hash_map>
|
||||
#include <winsock.h>
|
||||
#include <malloc.h>
|
||||
#include <process.h>
|
||||
|
@ -37,11 +39,7 @@
|
|||
#if _MSC_VER < 1300
|
||||
#define COMEX "9"
|
||||
#else
|
||||
#if _MSC_VER < 1310
|
||||
#define COMEX "8"
|
||||
#else
|
||||
#define COMEX "10"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PRODUCT
|
||||
|
@ -62,8 +60,10 @@
|
|||
using namespace ::std;
|
||||
|
||||
|
||||
wstring g_strProductKey;
|
||||
string g_strDefaultLanguage;
|
||||
FILE *g_fpStackFile = NULL;
|
||||
FILE *g_fpChecksumFile = NULL;
|
||||
DWORD g_dwExceptionCode = 0;
|
||||
|
||||
CHAR g_szReportServerA[MAX_HOSTNAME] = "";
|
||||
|
@ -489,7 +489,7 @@ BOOL WriteReportFile( CrashReportParams *pParams )
|
|||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
"<!DOCTYPE errormail:errormail PUBLIC \"-//OpenOffice.org//DTD ErrorMail 1.0//EN\" \"errormail.dtd\">\n"
|
||||
"<errormail:errormail xmlns:errormail=\"http://openoffice.org/2002/errormail\" usertype=\"%s\">\n"
|
||||
"<reportmail:mail xmlns:reportmail=\"http://openoffice.org/2002/reportmail\" version=\"1.0\" feedback=\"%s\" email=\"%s\">\n",
|
||||
"<reportmail:mail xmlns:reportmail=\"http://openoffice.org/2002/reportmail\" version=\"1.1\" feedback=\"%s\" email=\"%s\">\n",
|
||||
pszUserType ? pszUserType : "",
|
||||
pParams->fAllowContact ? "true" : "false",
|
||||
pParams->fAllowContact ? xml_encode(szEmail).c_str() : ""
|
||||
|
@ -536,6 +536,9 @@ BOOL WriteReportFile( CrashReportParams *pParams )
|
|||
fseek( g_fpStackFile, 0, SEEK_SET );
|
||||
fcopy( g_fpStackFile, fp );
|
||||
|
||||
fseek( g_fpChecksumFile, 0, SEEK_SET );
|
||||
fcopy( g_fpChecksumFile, fp );
|
||||
|
||||
fprintf( fp, "</errormail:errormail>\n" );
|
||||
|
||||
fclose( fp );
|
||||
|
@ -1282,9 +1285,142 @@ BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//* Generate MD5 checksum
|
||||
//*****************************************************************************
|
||||
|
||||
#define MAGIC_DESCRIPTION_FILLER 'x'
|
||||
#define MAGIC_DESCRIPTION_COUNT 80
|
||||
|
||||
static void repatch_soffice_exe( void *pBuffer, size_t nBufSize )
|
||||
{
|
||||
wchar_t DescriptionBuffer[MAGIC_DESCRIPTION_COUNT];
|
||||
|
||||
memset( DescriptionBuffer, 0, sizeof(DescriptionBuffer) );
|
||||
wcsncpy( DescriptionBuffer, g_strProductKey.c_str(), elementsof(DescriptionBuffer) - 1 );
|
||||
|
||||
bool bPatched = false;
|
||||
|
||||
do
|
||||
{
|
||||
void *pFound = memchr( pBuffer, ((char *)DescriptionBuffer)[0], nBufSize );
|
||||
|
||||
if ( pFound )
|
||||
{
|
||||
size_t distance = (char *)pFound - (char *)pBuffer;
|
||||
|
||||
if ( nBufSize >= distance )
|
||||
{
|
||||
nBufSize -= distance;
|
||||
|
||||
if ( nBufSize >= sizeof(DescriptionBuffer) &&
|
||||
0 == memcmp( pFound, DescriptionBuffer, sizeof(DescriptionBuffer) ) )
|
||||
{
|
||||
for ( int i = 0; i < 80; i++ )
|
||||
{
|
||||
((wchar_t *)pFound)[i] = MAGIC_DESCRIPTION_FILLER;
|
||||
}
|
||||
bPatched = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pBuffer = (void *)(((char *)pFound) + 1);
|
||||
nBufSize--;
|
||||
}
|
||||
}
|
||||
else
|
||||
nBufSize = 0;
|
||||
}
|
||||
else
|
||||
nBufSize = 0;
|
||||
} while ( !bPatched && nBufSize );
|
||||
}
|
||||
|
||||
static sal_uInt32 calc_md5_checksum( const char *filename, sal_uInt8 *pChecksum, sal_uInt32 nChecksumLen )
|
||||
{
|
||||
sal_uInt32 nBytesProcessed = 0;
|
||||
|
||||
FILE *fp = fopen( filename, "rb" );
|
||||
|
||||
if ( fp )
|
||||
{
|
||||
long nFileSize;
|
||||
|
||||
if ( 0 == fseek( fp, 0, SEEK_END ) && -1 != (nFileSize = ftell(fp)) )
|
||||
{
|
||||
rewind( fp );
|
||||
|
||||
sal_uInt8 *pBuffer = new sal_uInt8[nFileSize];
|
||||
size_t nBytesRead = fread( pBuffer, 1, nFileSize, fp );
|
||||
|
||||
if ( nBytesRead == nFileSize )
|
||||
{
|
||||
if ( 0 == stricmp( GetFileName(filename).c_str(), "soffice.exe" ) )
|
||||
repatch_soffice_exe( pBuffer, nBytesRead );
|
||||
|
||||
rtlDigestError error = rtl_digest_MD5 (
|
||||
pBuffer, nBytesRead,
|
||||
pChecksum, nChecksumLen );
|
||||
|
||||
if ( rtl_Digest_E_None == error )
|
||||
nBytesProcessed = nBytesRead;
|
||||
}
|
||||
|
||||
delete[] pBuffer;
|
||||
}
|
||||
|
||||
fclose( fp );
|
||||
|
||||
}
|
||||
|
||||
return nBytesProcessed;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static sal_uInt32 calc_md5_checksum( const char *filename, sal_uInt8 *pChecksum, sal_uInt32 nChecksumLen )
|
||||
{
|
||||
sal_uInt32 nBytesProcessed = 0;
|
||||
|
||||
FILE *fp = fopen( filename, "rb" );
|
||||
|
||||
if ( fp )
|
||||
{
|
||||
rtlDigest digest = rtl_digest_createMD5();
|
||||
|
||||
if ( digest )
|
||||
{
|
||||
size_t nBytesRead;
|
||||
sal_uInt8 buffer[4096];
|
||||
rtlDigestError error = rtl_Digest_E_None;
|
||||
|
||||
while ( rtl_Digest_E_None == error &&
|
||||
0 != (nBytesRead = fread( buffer, 1, sizeof(buffer), fp )) )
|
||||
{
|
||||
error = rtl_digest_updateMD5( digest, buffer, nBytesRead );
|
||||
nBytesProcessed += nBytesRead;
|
||||
}
|
||||
|
||||
if ( rtl_Digest_E_None == error )
|
||||
{
|
||||
error = rtl_digest_getMD5( digest, pChecksum, nChecksumLen );
|
||||
}
|
||||
|
||||
if ( rtl_Digest_E_None != error )
|
||||
nBytesProcessed = 0;
|
||||
|
||||
rtl_digest_destroyMD5( digest );
|
||||
}
|
||||
|
||||
fclose( fp );
|
||||
}
|
||||
|
||||
return nBytesProcessed;
|
||||
}
|
||||
|
||||
#endif
|
||||
//***************************************************************************
|
||||
|
||||
static bool WriteStackFile( FILE *fout, DWORD dwProcessId, PEXCEPTION_POINTERS pExceptionPointers )
|
||||
static bool WriteStackFile( FILE *fout, hash_map< string, string >& rLibraries, DWORD dwProcessId, PEXCEPTION_POINTERS pExceptionPointers )
|
||||
{
|
||||
bool fSuccess = false;
|
||||
|
||||
|
@ -1353,6 +1489,8 @@ static bool WriteStackFile( FILE *fout, DWORD dwProcessId, PEXCEPTION_POINTERS p
|
|||
|
||||
if ( SymGetModuleInfo( hProcess, frame.AddrPC.Offset, &moduleInfo ) )
|
||||
{
|
||||
rLibraries[ GetFileName( moduleInfo.LoadedImageName ).c_str() ] = moduleInfo.LoadedImageName;
|
||||
|
||||
DWORD dwRelOffset = 0;
|
||||
BYTE symbolBuffer[sizeof(IMAGEHLP_SYMBOL) + 256 ];
|
||||
PIMAGEHLP_SYMBOL pSymbol = (PIMAGEHLP_SYMBOL)symbolBuffer;
|
||||
|
@ -1405,6 +1543,43 @@ static bool WriteStackFile( FILE *fout, DWORD dwProcessId, PEXCEPTION_POINTERS p
|
|||
return fSuccess;
|
||||
}
|
||||
|
||||
bool WriteChecksumFile( FILE *fchksum, const hash_map< string, string >& rLibraries )
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
if ( fchksum && rLibraries.size() )
|
||||
{
|
||||
fprintf( fchksum, "<errormail:Checksums type=\"MD5\">\n" );
|
||||
|
||||
hash_map< string, string >::const_iterator iter;
|
||||
|
||||
for ( iter = rLibraries.begin();
|
||||
iter != rLibraries.end();
|
||||
iter++ )
|
||||
{
|
||||
sal_uInt8 checksum[RTL_DIGEST_LENGTH_MD5];
|
||||
sal_uInt32 nBytesProcessed = calc_md5_checksum(
|
||||
iter->second.c_str(),
|
||||
checksum, sizeof(checksum) );
|
||||
|
||||
if ( nBytesProcessed )
|
||||
{
|
||||
fprintf( fchksum, "<errormail:Checksum sum=\"0x" );
|
||||
for ( int i = 0; i < sizeof(checksum); fprintf( fchksum, "%02X", checksum[i++] ) );
|
||||
fprintf( fchksum, "\" bytes=\"%d\" file=\"%s\"/>\n",
|
||||
nBytesProcessed,
|
||||
GetFileName( iter->first ) );
|
||||
}
|
||||
}
|
||||
|
||||
fprintf( fchksum, "</errormail:Checksums>\n" );
|
||||
|
||||
success = true;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
//***************************************************************************
|
||||
|
||||
BOOL WriteDumpFile( DWORD dwProcessId, PEXCEPTION_POINTERS pExceptionPointers, DWORD dwThreadId )
|
||||
|
@ -1798,6 +1973,8 @@ static bool ReadBootstrapParams()
|
|||
{
|
||||
TCHAR *pVersion = _tcschr( szBuffer, ' ' );
|
||||
|
||||
g_strProductKey = szBuffer;
|
||||
|
||||
if ( pVersion )
|
||||
{
|
||||
*pVersion = 0;
|
||||
|
@ -2260,9 +2437,15 @@ int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int )
|
|||
{
|
||||
if ( WriteDumpFile( dwProcessId, pExceptionPointers, dwThreadId ) )
|
||||
{
|
||||
hash_map< string, string > aLibraries;
|
||||
|
||||
g_fpStackFile = _tmpfile();
|
||||
|
||||
WriteStackFile( g_fpStackFile, dwProcessId, pExceptionPointers );
|
||||
WriteStackFile( g_fpStackFile, aLibraries, dwProcessId, pExceptionPointers );
|
||||
|
||||
g_fpChecksumFile = _tmpfile();
|
||||
|
||||
WriteChecksumFile( g_fpChecksumFile, aLibraries );
|
||||
|
||||
InitCommonControls();
|
||||
|
||||
|
@ -2291,6 +2474,9 @@ int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int )
|
|||
|
||||
if ( g_fpStackFile )
|
||||
fclose( g_fpStackFile );
|
||||
|
||||
if ( g_fpChecksumFile )
|
||||
fclose( g_fpChecksumFile );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue