#include "stdafx.h" #include "utils.h" #include CComModule _Module; #include #include #include "seo.h" #include "seolib.h" #include "seo_i.c" #define INITGUID #include #include "smtpguid.h" #define STR_SMTP_NTFSDRV_DISPLAY_NAME "Exchange Ntfs Store Driver" #define STR_SMTP_NTFSDRV_SINKCLASS "Exchange.NtfsDrv" #define LONG_SMTP_NTFSDRV_PRIORITY 28000 // {C028FD82-F943-11d0-85BD-00C04FB960EA} DEFINE_GUID(NNTP_SOURCE_TYPE_GUID, 0xc028fd82, 0xf943, 0x11d0, 0x85, 0xbd, 0x0, 0xc0, 0x4f, 0xb9, 0x60, 0xea); DEFINE_GUID(GUID_SMTP_NTFSDRV_BINDING, 0x609b7e3a, 0xc918, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xa3, 0x5b, 0x82); HRESULT RegisterSEOService() { HRESULT hr; // // see if we've done the service level registration by getting the list // of source types and seeing if the SMTP source type is registered // CComPtr pEventManager; hr = CoCreateInstance(CLSID_CEventManager, NULL, CLSCTX_ALL, IID_IEventManager, (LPVOID *) &pEventManager); if (hr != S_OK) return hr; CComPtr pSourceTypes; hr = pEventManager->get_SourceTypes(&pSourceTypes); if (FAILED(hr)) return hr; CComPtr pSourceType; CComBSTR bstrSourceTypeGUID = (LPCOLESTR) CStringGUID(GUID_SMTP_SOURCE_TYPE); hr = pSourceTypes->Item(&CComVariant(bstrSourceTypeGUID), &pSourceType); if (FAILED(hr)) return hr; // if this failed then we need to register the source type and event // component categories if (hr == S_FALSE) { // register the component categories CComPtr pComCat; hr = CoCreateInstance(CLSID_CEventComCat, NULL, CLSCTX_ALL, IID_IEventComCat, (LPVOID *) &pComCat); if (hr != S_OK) return hr; // register the source type hr = pSourceTypes->Add(bstrSourceTypeGUID, &pSourceType); if (FAILED(hr)) return hr; _ASSERT(hr == S_OK); CComBSTR bstrSourceTypeDisplayName = "SMTP Server"; hr = pSourceType->put_DisplayName(bstrSourceTypeDisplayName); if (FAILED(hr)) return hr; hr = pSourceType->Save(); if (FAILED(hr)) return hr; // add the event types to the source type CComPtr pEventTypes; hr = pSourceType->get_EventTypes(&pEventTypes); if (FAILED(hr)) return hr; // // Register the event categories // struct { CONST GUID * pcatid; LPSTR szDisplayName; } rgCATTable[] = { // // Protocol event categories // { &CATID_SMTP_ON_INBOUND_COMMAND, "SMTP Protocol OnInboundCommand" }, { &CATID_SMTP_ON_SERVER_RESPONSE, "SMTP Protocol OnServerResponse" }, { &CATID_SMTP_ON_SESSION_START, "SMTP Protocol OnSessionStart" }, { &CATID_SMTP_ON_MESSAGE_START, "SMTP Protocol OnMessageStart" }, { &CATID_SMTP_ON_PER_RECIPIENT, "SMTP Protocol OnPerRecipient" }, { &CATID_SMTP_ON_BEFORE_DATA, "SMTP Protocol OnBeforeData" }, { &CATID_SMTP_ON_SESSION_END, "SMTP Protocol OnSessionEnd" }, { &CATID_SMTP_LOG, "SMTP OnEventLog" }, // // Transport event categories // { &CATID_SMTP_STORE_DRIVER, "SMTP StoreDriver" }, { &CATID_SMTP_TRANSPORT_SUBMISSION, "SMTP Transport OnSubmission" }, { &CATID_SMTP_TRANSPORT_PRECATEGORIZE, "SMTP Transport OnPreCategorize" }, { &CATID_SMTP_TRANSPORT_CATEGORIZE, "SMTP Transport OnCategorize" }, { &CATID_SMTP_TRANSPORT_POSTCATEGORIZE, "SMTP Transport OnPostCategorize" }, { &CATID_SMTP_TRANSPORT_ROUTER, "SMTP Transport OnGetMessageRouter" }, { &CATID_SMTP_MSGTRACKLOG, "SMTP Transport OnMsgTrackLog" }, { &CATID_SMTP_DNSRESOLVERRECORDSINK, "SMTP Transport OnDnsResolveRecord" }, { &CATID_SMTP_MAXMSGSIZE, "SMTP Transport OnMaxMsgSize" }, { &CATID_SMTP_GET_AUX_DOMAIN_INFO_FLAGS, "SMTP Transport GetAuxiliaryDomainInfoFlags" } }; for(DWORD dwCount = 0; dwCount < (sizeof(rgCATTable)/sizeof(rgCATTable[0])); dwCount++) { CComBSTR bstrCATID = (LPCOLESTR) CStringGUID( *(rgCATTable[dwCount].pcatid) ); CComBSTR bstrDisplayName = rgCATTable[dwCount].szDisplayName; // // Register the category // hr = pComCat->RegisterCategory( bstrCATID, bstrDisplayName, 0); if(FAILED(hr)) return hr; // // Add the category to the SMTP source type // hr = pEventTypes->Add( bstrCATID ); if(FAILED(hr)) return hr; } } return S_OK; } HRESULT pRegisterSEOForSmtp(BOOL fSetUpSourceType) { HRESULT hr; CComPtr pEventUtil; TCHAR szDisplayName[32]; CComPtr pBindingManager; CComPtr pBindings; CComPtr pBinding; CComPtr pSourceProps; DebugOutput(_T("Registering Server Events")); // Register the source type, event types if (fSetUpSourceType) { DebugOutput(_T("Setting up source and event types")); hr = RegisterSEOService(); } // Set up the default site (instance) lstrcpy(szDisplayName,_T("smtpsvc 1")); hr = CoCreateInstance(CLSID_CEventUtil,NULL,CLSCTX_ALL,IID_IEventUtil,(LPVOID *) &pEventUtil); if (FAILED(hr)) return(hr); hr = pEventUtil->RegisterSource(CComBSTR((LPCWSTR) CStringGUID(GUID_SMTP_SOURCE_TYPE)), CComBSTR((LPCWSTR) CStringGUID(GUID_SMTPSVC_SOURCE)), 1, CComBSTR(_T("smtpsvc")), CComBSTR(_T("")), CComBSTR(_T("event.metabasedatabasemanager")), CComBSTR(szDisplayName), &pBindingManager); if (FAILED(hr)) goto Exit; hr = pBindingManager->get_Bindings(CComBSTR((LPCWSTR) CStringGUID(CATID_SMTP_STORE_DRIVER)), &pBindings); if (FAILED(hr)) goto Exit; // Set up the NTFS driver sink hr = pBindings->Add(CComBSTR((LPCWSTR) CStringGUID(GUID_SMTP_NTFSDRV_BINDING)),&pBinding); if (FAILED(hr)) goto Exit; hr = pBinding->put_DisplayName(CComBSTR(STR_SMTP_NTFSDRV_DISPLAY_NAME)); if (FAILED(hr)) goto Exit; hr = pBinding->put_SinkClass(CComBSTR(STR_SMTP_NTFSDRV_SINKCLASS)); if (FAILED(hr)) goto Exit; hr = pBinding->get_SourceProperties(&pSourceProps); if (FAILED(hr)) goto Exit; hr = pSourceProps->Add(CComBSTR(_T("priority")),&CComVariant(LONG_SMTP_NTFSDRV_PRIORITY)); if (FAILED(hr)) goto Exit; hr = pBinding->Save(); if (FAILED(hr)) goto Exit; // hr = pBindingManager->get_Bindings(CComBSTR((LPCWSTR) CStringGUID(CATID_SMTP_ON_DELIVERY)), // &pBindings); Exit: return(hr); } HRESULT RegisterSEOForSmtp(BOOL fSetUpSourceType) { HRESULT hr; hr = CoInitialize(NULL); if (FAILED(hr)) { DebugOutput(_T("Cannot CoInitialize()")); return(hr); } hr = pRegisterSEOForSmtp(fSetUpSourceType); CoUninitialize(); return(hr); } HRESULT UnregisterSEOSourcesForSourceType(GUID guidSourceType) { HRESULT hr; // // find the NNTP source type in the event manager // CComPtr pEventManager; hr = CoCreateInstance(CLSID_CEventManager, NULL, CLSCTX_ALL, IID_IEventManager, (LPVOID *) &pEventManager); if (hr != S_OK) return hr; CComPtr pSourceTypes; hr = pEventManager->get_SourceTypes(&pSourceTypes); if (FAILED(hr)) return hr; CComPtr pSourceType; CComBSTR bstrSourceTypeGUID = (LPCOLESTR) CStringGUID(guidSourceType); hr = pSourceTypes->Item(&CComVariant(bstrSourceTypeGUID), &pSourceType); _ASSERT(hr != S_OK || pSourceType != NULL); if (hr != S_OK) return hr; // // get the list of sources registered for this source type // CComPtr pSources; hr = pSourceType->get_Sources(&pSources); if (FAILED(hr)) return hr; CComPtr pSourceEnum; hr = pSources->get__NewEnum((IUnknown **) &pSourceEnum); if (FAILED(hr)) return hr; do { VARIANT varSource; hr = pSourceEnum->Next(1, &varSource, NULL); if (FAILED(hr)) return hr; if (hr == S_OK) { if (varSource.vt == VT_DISPATCH) { CComPtr pSource; // QI for the IEventSource interface hr = varSource.punkVal->QueryInterface(IID_IEventSource, (void **) &pSource); if (FAILED(hr)) return hr; varSource.punkVal->Release(); // get the binding manager CComBSTR bstrSourceID; hr = pSource->get_ID(&bstrSourceID); if (FAILED(hr)) return hr; hr = pSources->Remove(&CComVariant(bstrSourceID)); _ASSERT(SUCCEEDED(hr)); pSource.Release(); } else { _ASSERT(FALSE); } } } while (hr == S_OK); return S_OK; } HRESULT UnregisterSEOSourcesForSMTP(void) { HRESULT hr; hr = CoInitialize(NULL); if (FAILED(hr)) { DebugOutput(_T("Cannot CoInitialize()")); return(hr); } hr = UnregisterSEOSourcesForSourceType(GUID_SMTP_SOURCE_TYPE); CoUninitialize(); return hr; } HRESULT UnregisterSEOSourcesForNNTP(void) { HRESULT hr; hr = CoInitialize(NULL); if (FAILED(hr)) { DebugOutput(_T("Cannot CoInitialize()")); return(hr); } hr = UnregisterSEOSourcesForSourceType(NNTP_SOURCE_TYPE_GUID); CoUninitialize(); return hr; }