259 lines
6.3 KiB
C
259 lines
6.3 KiB
C
|
// stdafx.h : include file for standard system include files,
|
||
|
// or project specific include files that are used frequently,
|
||
|
// but are changed infrequently
|
||
|
|
||
|
#if !defined(AFX_STDAFX_H__4AD508C0_3D5F_4F04_AAC2_814BF64663A6__INCLUDED_)
|
||
|
#define AFX_STDAFX_H__4AD508C0_3D5F_4F04_AAC2_814BF64663A6__INCLUDED_
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif // _MSC_VER > 1000
|
||
|
|
||
|
#define STRICT
|
||
|
#ifndef _WIN32_WINNT
|
||
|
#define _WIN32_WINNT 0x0400
|
||
|
#endif
|
||
|
#define _ATL_APARTMENT_THREADED
|
||
|
|
||
|
#include <afxwin.h>
|
||
|
#include <afxtempl.h>
|
||
|
#include <atlbase.h>
|
||
|
|
||
|
#include <initguid.h>
|
||
|
#include <dbgeng.h>
|
||
|
#include "emsvc.h"
|
||
|
#include "svcobjdef.h"
|
||
|
#include "comdef.h"
|
||
|
#include "Trace.h"
|
||
|
#include "GenCriticalSection.h"
|
||
|
#include "genobjdef.h"
|
||
|
#include "genlog.h"
|
||
|
|
||
|
#define OPT
|
||
|
|
||
|
//You may derive a class from CComModule and use it if you want to override
|
||
|
//something, but do not change the name of _Module
|
||
|
|
||
|
#define WINOS_NONE 0
|
||
|
#define WINOS_NT4 4
|
||
|
#define WINOS_WIN2K 5
|
||
|
|
||
|
/* _afxMonthDays */
|
||
|
AFX_STATIC_DATA int MonthDays[13] =
|
||
|
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
|
||
|
|
||
|
class CServiceModule : public CComModule
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
HRESULT RegisterServer(BOOL bRegTypeLib, BOOL bService);
|
||
|
HRESULT UnregisterServer();
|
||
|
void Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT nServiceNameID, const GUID* plibid = NULL);
|
||
|
void Start();
|
||
|
void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv);
|
||
|
void Handler(DWORD dwOpcode);
|
||
|
void Run();
|
||
|
BOOL IsInstalled();
|
||
|
BOOL Install();
|
||
|
BOOL Uninstall();
|
||
|
LONG Unlock();
|
||
|
void LogEvent(LPCTSTR pszFormat, ...);
|
||
|
void SetServiceStatus(DWORD dwState);
|
||
|
void SetupAsLocalServer();
|
||
|
|
||
|
/* _AfxOleDateFromTm */
|
||
|
static bool DateFromTm(WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest);
|
||
|
static DATE GetCurrentTime();
|
||
|
static DATE GetDateFromFileTm(const FILETIME& filetimeSrc);
|
||
|
|
||
|
HRESULT GetCompName( BSTR &bstrCompName );
|
||
|
|
||
|
HRESULT GetTempEmFileName ( short nObjType, BSTR &bstrFileName );
|
||
|
|
||
|
HRESULT GetEmDirectory (
|
||
|
EmObjectType eObjectType,
|
||
|
LPTSTR pszDirectory,
|
||
|
LONG cchDirectory,
|
||
|
LPTSTR pszExt,
|
||
|
LONG cchExt
|
||
|
);
|
||
|
|
||
|
HRESULT GetEmFilePath ( short nFileType, bstr_t& bstrFilePath );
|
||
|
|
||
|
HRESULT GetPathFromReg (
|
||
|
HKEY hKeyParent,
|
||
|
LPCTSTR lpszKeyName,
|
||
|
LPCTSTR lpszQueryKey,
|
||
|
LPTSTR pszDirectory,
|
||
|
ULONG *cchDirectory
|
||
|
);
|
||
|
|
||
|
HRESULT CreateEmDirectory (
|
||
|
LPTSTR lpDirName,
|
||
|
LONG ccDirName,
|
||
|
LPCTSTR lpParentDirPath = NULL
|
||
|
);
|
||
|
|
||
|
HRESULT RegisterDir (
|
||
|
HKEY hKeyParent,
|
||
|
LPCTSTR lpszKeyName,
|
||
|
LPCTSTR lpszNamedValue,
|
||
|
LPCTSTR lpValue
|
||
|
);
|
||
|
|
||
|
HRESULT CreateEmDirAndRegister (
|
||
|
LPTSTR lpDirName,
|
||
|
LONG ccDirName,
|
||
|
HKEY hKeyParent,
|
||
|
LPCTSTR lpszKeyName,
|
||
|
LPCTSTR lpszNamedValue
|
||
|
);
|
||
|
|
||
|
HRESULT GetCDBInstallDir (
|
||
|
LPTSTR lpCdbDir,
|
||
|
ULONG *pccCdbDir
|
||
|
);
|
||
|
|
||
|
HRESULT GetEmInstallDir (
|
||
|
LPTSTR lpEmDir,
|
||
|
ULONG *pccEmDir
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
GetMsInfoPath (
|
||
|
LPTSTR lpMsInfoPath,
|
||
|
ULONG *pccMsInfoPath
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
GetOsVersion (
|
||
|
OUT DWORD *pdwOsVer
|
||
|
);
|
||
|
|
||
|
//Implementation
|
||
|
private:
|
||
|
static void WINAPI _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv);
|
||
|
static void WINAPI _Handler(DWORD dwOpcode);
|
||
|
|
||
|
// data members
|
||
|
public:
|
||
|
TCHAR m_szServiceName[256];
|
||
|
SERVICE_STATUS_HANDLE m_hServiceStatus;
|
||
|
SERVICE_STATUS m_status;
|
||
|
DWORD dwThreadID;
|
||
|
BOOL m_bService;
|
||
|
|
||
|
CExcepMonSessionManager m_SessionManager;
|
||
|
|
||
|
bstr_t m_bstrLogFilePath;
|
||
|
bstr_t m_bstrLogFileExt;
|
||
|
|
||
|
bstr_t m_bstrDumpFilePath;
|
||
|
bstr_t m_bstrDumpFileExt;
|
||
|
|
||
|
bstr_t m_bstrEcxFilePath;
|
||
|
bstr_t m_bstrEcxFileExt;
|
||
|
|
||
|
bstr_t m_bstrMsInfoFilePath;
|
||
|
bstr_t m_bstrMsInfoFileExt;
|
||
|
|
||
|
};
|
||
|
|
||
|
extern CServiceModule _Module;
|
||
|
inline LONG GetEmUniqueId()
|
||
|
{
|
||
|
static LONG nId = 0;
|
||
|
return ::InterlockedIncrement(&nId);
|
||
|
}
|
||
|
|
||
|
inline BSTR CopyBSTR( LPBYTE pb, ULONG cb)
|
||
|
{
|
||
|
return ::SysAllocStringByteLen ((LPCSTR)pb, cb);
|
||
|
}
|
||
|
|
||
|
inline PEmObject GetEmObj(BSTR bstrEmObj)
|
||
|
{
|
||
|
//Do a simple cast from a BSTR to an EmObject
|
||
|
return ((PEmObject)bstrEmObj);
|
||
|
}
|
||
|
|
||
|
inline HRESULT
|
||
|
GetUniqueFileName
|
||
|
(
|
||
|
IN PEmObject pEmObj,
|
||
|
OUT LPTSTR lpszFileName,
|
||
|
IN LPCTSTR lpszPostFix = NULL,
|
||
|
IN LPCTSTR lpszFileExt = NULL,
|
||
|
IN bool bForSearch = false
|
||
|
)
|
||
|
{
|
||
|
ATLTRACE(_T("GetUniqueFileName\n"));
|
||
|
|
||
|
_ASSERTE( pEmObj != NULL );
|
||
|
_ASSERTE( lpszFileName != NULL );
|
||
|
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if( pEmObj == NULL ||
|
||
|
lpszFileName == NULL ) {
|
||
|
|
||
|
hr = E_INVALIDARG;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
_tcscpy(lpszFileName, _T(""));
|
||
|
|
||
|
if( _tcslen(pEmObj->szSecName) > 0 ) { _tcscpy( lpszFileName, pEmObj->szSecName ); }
|
||
|
else if( _tcslen(pEmObj->szName) > 0 ) { _tcscpy( lpszFileName, pEmObj->szName ); }
|
||
|
|
||
|
if( strlen((const char *)pEmObj->guidstream) > 0 ) {
|
||
|
|
||
|
TCHAR szGuid[_MAX_FNAME] = _T("");
|
||
|
|
||
|
StringFromGUID2( *(GUID *)(pEmObj->guidstream), szGuid, _MAX_FNAME );
|
||
|
|
||
|
_tcscat( lpszFileName, _T("_") );
|
||
|
_tcscat( lpszFileName, szGuid );
|
||
|
|
||
|
}
|
||
|
|
||
|
if( lpszPostFix && _tcslen(lpszPostFix) > 0 ) {
|
||
|
|
||
|
_tcscat( lpszFileName, _T("_") );
|
||
|
_tcscat( lpszFileName, lpszPostFix );
|
||
|
}
|
||
|
|
||
|
if( bForSearch == false ) {
|
||
|
|
||
|
TCHAR szUniqueId[100] = _T("");
|
||
|
_ltot(GetEmUniqueId(), szUniqueId, 10);
|
||
|
_tcscat( lpszFileName, _T("_") );
|
||
|
_tcscat( lpszFileName, szUniqueId );
|
||
|
}
|
||
|
else {
|
||
|
|
||
|
_tcscat( lpszFileName, _T("*") );
|
||
|
}
|
||
|
|
||
|
if( lpszFileExt && _tcslen(lpszFileExt) > 0 ) {
|
||
|
|
||
|
if(*lpszFileExt != _T('.')){ _tcscat( lpszFileName, _T(".") ); }
|
||
|
_tcscat( lpszFileName, lpszFileExt );
|
||
|
}
|
||
|
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
while( false );
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
#include <atlcom.h>
|
||
|
|
||
|
//{{AFX_INSERT_LOCATION}}
|
||
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||
|
|
||
|
#endif // !defined(AFX_STDAFX_H__4AD508C0_3D5F_4F04_AAC2_814BF64663A6__INCLUDED)
|