|
|
// EmManager.cpp : Implementation of CEmManager
#include "stdafx.h"
#include "Emsvc.h"
#include "EmManager.h"
#include "Processes.h"
#include "sahlp.h"
#include <winerror.h>
BSTR CopyBSTR ( LPBYTE pb, ULONG cb );
/*
BOOL OleDateFromTm(WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest) { // Validate year and month (ignore day of week and milliseconds)
if (wYear > 9999 || wMonth < 1 || wMonth > 12) return FALSE;
// Check for leap year and set the number of days in the month
BOOL bLeapYear = ((wYear & 3) == 0) && ((wYear % 100) != 0 || (wYear % 400) == 0);
int nDaysInMonth = _afxMonthDays[wMonth] - _afxMonthDays[wMonth-1] + ((bLeapYear && wDay == 29 && wMonth == 2) ? 1 : 0);
// Finish validating the date
if (wDay < 1 || wDay > nDaysInMonth || wHour > 23 || wMinute > 59 || wSecond > 59) { return FALSE; }
// Cache the date in days and time in fractional days
long nDate; double dblTime;
//It is a valid date; make Jan 1, 1AD be 1
nDate = wYear*365L + wYear/4 - wYear/100 + wYear/400 + _afxMonthDays[wMonth-1] + wDay;
// If leap year and it's before March, subtract 1:
if (wMonth <= 2 && bLeapYear) --nDate;
// Offset so that 12/30/1899 is 0
nDate -= 693959L;
dblTime = (((long)wHour * 3600L) + // hrs in seconds
((long)wMinute * 60L) + // mins in seconds
((long)wSecond)) / 86400.;
dtDest = (double) nDate + ((nDate >= 0) ? dblTime : -dblTime);
return TRUE; }
const COleDateTime& COleDateTime::operator=(const FILETIME& filetimeSrc) { // Assume UTC FILETIME, so convert to LOCALTIME
FILETIME filetimeLocal; if (!FileTimeToLocalFileTime( &filetimeSrc, &filetimeLocal)) { #ifdef _DEBUG
DWORD dwError = GetLastError(); TRACE1("\nFileTimeToLocalFileTime failed. Error = %lu.\n\t", dwError); #endif // _DEBUG
m_status = invalid; } else { // Take advantage of SYSTEMTIME -> FILETIME conversion
SYSTEMTIME systime; m_status = FileTimeToSystemTime(&filetimeLocal, &systime) ? valid : invalid;
// At this point systime should always be valid, but...
if (GetStatus() == valid) { m_status = _AfxOleDateFromTm(systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, m_dt) ? valid : invalid; } }
return *this; }
*/
HRESULT CEmManager::EnumLogFiles ( VARIANT *lpVariant, LPCTSTR lpSearchString ) { ATLTRACE(_T("CEmManager::EnumLogFiles\n"));
HRESULT hr = E_FAIL; TCHAR szDirectory[_MAX_PATH] = _T(""); TCHAR szExt[_MAX_EXT] = _T(""); LPWIN32_FIND_DATA lpFindData = NULL; LONG cFiles = 0;
__try {
if(lpSearchString == NULL) {
_Module.GetEmDirectory ( EMOBJ_LOGFILE, (LPTSTR)szDirectory, sizeof szDirectory / sizeof (TCHAR), (LPTSTR)szExt, sizeof szExt / sizeof (TCHAR) ); } else {
_tcscpy(szDirectory, lpSearchString); _tcscpy(szExt, _T("")); }
hr = EnumFiles ( szDirectory, szExt, &lpFindData, &cFiles );
if ( SUCCEEDED(hr) ) {
hr = PackageFilesToVariant ( EMOBJ_LOGFILE, lpFindData, cFiles, lpVariant ); }
if( lpFindData ) { free( lpFindData ); lpFindData = NULL; }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr); }
HRESULT CEmManager::EnumCmdSets ( OUT VARIANT *lpVariant, IN LPCTSTR lpSearchString ) { ATLTRACE(_T("CEmManager::EnumCmdSets\n"));
HRESULT hr = E_FAIL; TCHAR szDirectory[_MAX_PATH]; TCHAR szExt[_MAX_EXT]; LPWIN32_FIND_DATA lpFindData = NULL; LONG cFiles = 0;
__try {
if( lpSearchString == NULL ) {
_Module.GetEmDirectory ( EMOBJ_CMDSET, (LPTSTR)szDirectory, sizeof szDirectory / sizeof ( TCHAR ), (LPTSTR)szExt, sizeof szExt / sizeof ( TCHAR ) ); } else {
_tcscpy( szDirectory, lpSearchString ); _tcscpy( szExt, _T("")); }
hr = EnumFiles ( szDirectory, szExt, &lpFindData, &cFiles );
if ( SUCCEEDED(hr) ) {
hr = PackageFilesToVariant ( EMOBJ_CMDSET, lpFindData, cFiles, lpVariant ); }
if( lpFindData ) { free( lpFindData ); lpFindData = NULL; }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr); }
HRESULT CEmManager::EnumDumpFiles ( OUT VARIANT *lpVariant, IN LPCTSTR lpSearchString ) { ATLTRACE(_T("CEmManager::EnumDumpFiles\n"));
HRESULT hr = E_FAIL; TCHAR szDirectory[_MAX_PATH]; TCHAR szExt[_MAX_EXT]; LPWIN32_FIND_DATA lpFindData = NULL; LONG cFiles = 0;
__try {
if(lpSearchString == NULL) {
_Module.GetEmDirectory ( EMOBJ_MINIDUMP, (LPTSTR)szDirectory, sizeof szDirectory / sizeof ( TCHAR ), (LPTSTR)szExt, sizeof szExt / sizeof ( TCHAR ) ); } else {
_tcscpy( szDirectory, lpSearchString ); _tcscpy( szExt, _T("")); }
hr = EnumFiles ( szDirectory, szExt, &lpFindData, &cFiles );
if ( SUCCEEDED(hr) ) {
hr = PackageFilesToVariant ( EMOBJ_MINIDUMP, lpFindData, cFiles, lpVariant ); }
if( lpFindData ) { free( lpFindData ); lpFindData = NULL; }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr); }
HRESULT CEmManager::EnumFiles ( LPTSTR lpszDirectory, LPTSTR lpszExt, LPWIN32_FIND_DATA *lppFindData, LONG *lpFiles ) { ATLTRACE(_T("CEmManager::EnumFiles\n"));
HRESULT hr = E_FAIL; HANDLE hFind = INVALID_HANDLE_VALUE; LPWIN32_FIND_DATA lpFindFileData = NULL; LONG cMaxFiles = 0; LONG cGrowBy = 100; LONG cFileBuf = 0; BOOL fContinue = TRUE; TCHAR szFileName[_MAX_PATH]; DWORD dwErr;
*lppFindData = NULL; *lpFiles = 0;
cFileBuf = cGrowBy; cMaxFiles = 0;
__try {
_tcscpy ( szFileName, lpszDirectory ); if ( _tcslen ( lpszExt ) > 0 ) { _tcscat ( szFileName, _T ( "\\*" ) ); _tcscat ( szFileName, lpszExt ); }
// start with a initial buffer
lpFindFileData = ( LPWIN32_FIND_DATA) malloc ( sizeof ( WIN32_FIND_DATA) * cFileBuf ); if ( lpFindFileData == NULL ) goto qEnumFiles;
// read from the filesystem
hFind = FindFirstFile ( szFileName, &lpFindFileData[cMaxFiles] );
while ( hFind != INVALID_HANDLE_VALUE && fContinue ) {
cMaxFiles++;
// grow buffer if necessary
if ( cMaxFiles == cFileBuf ) { cFileBuf += cGrowBy;
LPWIN32_FIND_DATA lpNewFileData = (LPWIN32_FIND_DATA) realloc ( lpFindFileData, sizeof ( WIN32_FIND_DATA) * cFileBuf ); if ( lpNewFileData == NULL ) { goto qEnumFiles; }
delete lpFindFileData; lpFindFileData = lpNewFileData; }
fContinue = FindNextFile ( hFind, &lpFindFileData[cMaxFiles] ); }
if ( hFind == INVALID_HANDLE_VALUE || fContinue == FALSE ) { dwErr = GetLastError(); }
if ( dwErr == ERROR_NO_MORE_FILES || dwErr == ERROR_FILE_NOT_FOUND ) hr = S_OK; else hr = HRESULT_FROM_WIN32 ( dwErr );
qEnumFiles:
if ( SUCCEEDED ( hr ) ) { *lppFindData = lpFindFileData; *lpFiles = cMaxFiles; } else { if ( lpFindFileData ) free ( lpFindFileData ); }
if ( hFind != INVALID_HANDLE_VALUE ) FindClose ( hFind );
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
if ( lpFindFileData ) free ( lpFindFileData );
if ( hFind != INVALID_HANDLE_VALUE ) FindClose ( hFind );
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr); }
HRESULT CEmManager::PackageFilesToVariant ( EmObjectType eObjectType, LPWIN32_FIND_DATA lpFindFileData, LONG cFiles, LPVARIANT lpVariant ) { ATLTRACE(_T("CEmManager::PackageFilesToVariant\n"));
HRESULT hr = E_FAIL; EmObject emObject; BSTR bstrObject = NULL; LONG iFile = 0;
__try {
::VariantClear ( lpVariant );
hr = Variant_CreateOneDim ( lpVariant, cFiles, VT_BSTR ); if ( FAILED(hr) ) goto qPackage;
for ( iFile=0 ; iFile<cFiles ; iFile++ ) {
ZeroMemory ( &emObject, sizeof EmObject );
// type
emObject.type = eObjectType;
// ID
emObject.nId = 0;
// name
_tcscpy ( emObject.szName, lpFindFileData[iFile].cFileName );
emObject.nStatus = 0; //STAT_FILECREATED;
// Start time
emObject.dateStart = CServiceModule::GetDateFromFileTm(lpFindFileData[iFile].ftCreationTime);
// End time
emObject.dateEnd = 0;
emObject.dwBucket1 = lpFindFileData[iFile].nFileSizeLow;
// Now that EmObject is filled up, preprocess as appropriate
switch ( eObjectType ) {
case EMOBJ_MSINFO: FillMsInfoFileInfo( NULL, &lpFindFileData[iFile], &emObject ); break;
case EMOBJ_MINIDUMP: case EMOBJ_USERDUMP: FillDumpFileInfo( NULL, &lpFindFileData[iFile], &emObject ); break;
case EMOBJ_LOGFILE: FillLogFileInfo( NULL, &lpFindFileData[iFile], &emObject ); break;
case EMOBJ_CMDSET: ScanCmdfile ( NULL, &lpFindFileData[iFile], &emObject ); break; }
bstrObject = CopyBSTR ( (LPBYTE) &emObject, sizeof (EmObject) ); if ( bstrObject == NULL ) { hr = E_OUTOFMEMORY; goto qPackage; }
hr = ::SafeArrayPutElement ( lpVariant->parray, &iFile, bstrObject ); if ( FAILED (hr) ) goto qPackage;
SysFreeString ( bstrObject ); }
qPackage:
if ( FAILED(hr)) { ::VariantClear ( lpVariant ); }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
::VariantClear ( lpVariant );
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr);
}
HRESULT CEmManager::ScanCmdfile ( LPCTSTR lpszCmdFileDir, LPWIN32_FIND_DATA lpFindData, EmObject *pEmObject ) { USES_CONVERSION;
ATLTRACE(_T("CEmManager::ScanCmdfile\n"));
HRESULT hr = S_OK; const DWORD cchBuf = 512; DWORD dwBytesRead; char szBuf[cchBuf+1]; HANDLE hFile = INVALID_HANDLE_VALUE; const DWORD cTemplates = 4; LPSTR szTemplate [cTemplates]; DWORD dwErr; DWORD dwIndex;
TCHAR szCmdDir[_MAX_PATH] = _T(""); TCHAR szCurrentDir[_MAX_PATH] = _T(""); DWORD dwBufSize = _MAX_PATH; BOOL bMatchFound = FALSE; char *pNewLine = NULL;
__try {
if( !lpszCmdFileDir ) {
_Module.GetEmDirectory( EMOBJ_CMDSET, szCmdDir, sizeof( szCmdDir ) / sizeof( TCHAR ), NULL, NULL); lpszCmdFileDir = szCmdDir; }
// fill template
szTemplate[0] = ( "!emdbg.tag" ); szTemplate[1] = ( "! emdbg.tag" ); szTemplate[2] = ( "*" ); szTemplate[3] = ( " *" );
ZeroMemory ( szBuf, sizeof szBuf );
if(GetCurrentDirectory(dwBufSize, szCurrentDir) == 0) {
hr = HRESULT_FROM_WIN32(GetLastError()); goto qScan; }
if(SetCurrentDirectory(lpszCmdFileDir) == 0) {
hr = HRESULT_FROM_WIN32(GetLastError()); goto qScan; }
hFile = ::CreateFile ( lpFindData->cFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
if ( hFile == INVALID_HANDLE_VALUE ) { dwErr = GetLastError(); hr = HRESULT_FROM_WIN32 ( dwErr ); goto qScan; }
if ( !::ReadFile ( hFile, szBuf, cchBuf, &dwBytesRead, NULL ) ) { dwErr = GetLastError(); hr = HRESULT_FROM_WIN32 ( dwErr ); goto qScan; }
pNewLine = strchr(szBuf, '\r\n'); if( pNewLine ) *pNewLine = '\0';
// see if a valid .ecx file
for ( dwIndex=0 ; dwIndex<cTemplates ; dwIndex++ ) { if ( 0 == strncmp( szBuf, szTemplate[dwIndex], strlen ( szTemplate[dwIndex] ) ) ) {
bMatchFound = TRUE; break; } }
// check if we got a match
if ( bMatchFound == FALSE ) { pEmObject->hr = E_FAIL; } else {
int cCh = 0;
{ EmObject obj; cCh = sizeof ( obj.szBucket1 ) / sizeof ( TCHAR ); }
// eat spaces
LPSTR pszSrc = szBuf; pszSrc += strlen ( szTemplate[dwIndex] ); while ( pszSrc != NULL && *pszSrc == ' ' ) pszSrc++;
LPTSTR pszSrcW = A2T ( pszSrc );
ZeroMemory ( pEmObject->szBucket1, cCh ); _tcsncpy ( pEmObject->szBucket1, pszSrcW, cCh - sizeof ( TCHAR ) ); }
qScan:
if ( hFile != INVALID_HANDLE_VALUE ) ::CloseHandle ( hFile );
if ( _tcscmp( szCurrentDir, _T("") ) != 0 ) {
if(SetCurrentDirectory(szCurrentDir) == 0) {
hr = HRESULT_FROM_WIN32(GetLastError()); } }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
if ( hFile != INVALID_HANDLE_VALUE ) ::CloseHandle ( hFile );
if ( _tcscmp( szCurrentDir, _T("") ) != 0 ) {
SetCurrentDirectory(szCurrentDir); }
hr = E_UNEXPECTED; _ASSERTE( false ); }
return hr; }
HRESULT CEmManager::FillLogFileInfo ( LPCTSTR lpszLogFileDir, LPWIN32_FIND_DATA lpFindData, EmObject *pEmObject ) { HRESULT hr = E_FAIL; LPTSTR lpszLogDir = NULL;
__try { if( !lpszLogFileDir ){
lpszLogDir = new TCHAR[_MAX_PATH+1]; if( !lpszLogDir ) return E_OUTOFMEMORY; _Module.GetEmDirectory( EMOBJ_LOGFILE, lpszLogDir, _MAX_PATH, NULL, NULL ); lpszLogFileDir = lpszLogDir; }
_tcscpy(pEmObject->szSecName, lpszLogFileDir);
//qFileLogFileInfo:
if( lpszLogDir ) { delete [] lpszLogDir; lpszLogDir = NULL; } } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; if( lpszLogDir ) { delete [] lpszLogDir; lpszLogDir = NULL; }
_ASSERTE( false ); }
return hr; }
HRESULT CEmManager::FillMsInfoFileInfo ( LPCTSTR lpszMsInfoFileDir, LPWIN32_FIND_DATA lpFindData, EmObject *pEmObject ) { HRESULT hr = E_FAIL; LPTSTR lpszMsInfoDir = NULL;
__try { if( !lpszMsInfoFileDir ){
lpszMsInfoDir = new TCHAR[_MAX_PATH+1]; if( !lpszMsInfoDir ) return E_OUTOFMEMORY; _Module.GetEmDirectory( EMOBJ_MSINFO, lpszMsInfoDir, _MAX_PATH, NULL, NULL ); lpszMsInfoFileDir = lpszMsInfoDir; }
_tcscpy(pEmObject->szSecName, lpszMsInfoFileDir);
//qFileLogFileInfo:
if( lpszMsInfoDir ) { delete [] lpszMsInfoDir; lpszMsInfoDir = NULL; } } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; if( lpszMsInfoDir ) { delete [] lpszMsInfoDir; lpszMsInfoDir = NULL; }
_ASSERTE( false ); }
return hr; }
HRESULT CEmManager::FillDumpFileInfo ( LPCTSTR lpszDumpFileDir, LPWIN32_FIND_DATA lpFindData, EmObject *pEmObject ) { HRESULT hr = E_FAIL; LPTSTR lpszDumpDir = NULL;
__try { if( !lpszDumpFileDir ){
lpszDumpDir = new TCHAR[_MAX_PATH+1]; if( !lpszDumpDir ) return E_OUTOFMEMORY; _Module.GetEmDirectory( EMOBJ_MINIDUMP, lpszDumpDir, _MAX_PATH, NULL, NULL ); lpszDumpFileDir = lpszDumpDir; }
_tcscpy(pEmObject->szSecName, lpszDumpFileDir);
//qFileLogFileInfo:
if( lpszDumpDir ) { delete [] lpszDumpDir; lpszDumpDir = NULL; } } __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; if( lpszDumpDir ) { delete [] lpszDumpDir; lpszDumpDir = NULL; }
_ASSERTE( false ); }
return hr; }
//
// a-mando
//
HRESULT CEmManager::EnumMsInfoFiles ( OUT VARIANT *lpVariant, IN LPCTSTR lpSearchString ) { ATLTRACE(_T("CEmManager::EnumMsInfoFiles\n"));
HRESULT hr = E_FAIL; TCHAR szDirectory[_MAX_PATH]; TCHAR szExt[_MAX_EXT]; LPWIN32_FIND_DATA lpFindData = NULL; LONG cFiles = 0;
__try {
if(lpSearchString == NULL) {
_Module.GetEmDirectory ( EMOBJ_MSINFO, (LPTSTR)szDirectory, sizeof szDirectory / sizeof ( TCHAR ), (LPTSTR)szExt, sizeof szExt / sizeof ( TCHAR ) ); } else {
_tcscpy( szDirectory, lpSearchString ); _tcscpy( szExt, _T("")); }
hr = EnumFiles ( szDirectory, szExt, &lpFindData, &cFiles );
if ( SUCCEEDED(hr) ) {
hr = PackageFilesToVariant ( EMOBJ_MSINFO, lpFindData, cFiles, lpVariant ); }
if( lpFindData ) { free( lpFindData ); lpFindData = NULL; }
} __except ( EXCEPTION_EXECUTE_HANDLER, 1 ) {
hr = E_UNEXPECTED; _ASSERTE( false ); }
return (hr); }
// a-mando
|