2025-11-28 00:35:46 +09:00

336 lines
10 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
#include "stdafx.h"
#include "ComSpyCtl.h"
#include <comsvcs.h>
#include "SysLCESub.h"
#include "ComSpyAudit.h"
#include "CComSpy.h"
#include "crmsub.h"
#include <strsafe.h>
STDMETHODIMP CCRMSub::OnCRMRecoveryStart(
COMSVCSEVENTINFO * pInfo,
GUID guidApp)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMRecoveryStart", GuidToBstr(pInfo->guidApp));
IF_AUDIT_DO(OnCRMRecoveryStart)(pInfo->perfCount, GuidToBstr(pInfo->guidApp));
return S_OK;
} // CCRMSub::OnCRMRecoveryStart
STDMETHODIMP CCRMSub::OnCRMRecoveryDone(
COMSVCSEVENTINFO * pInfo,
GUID guidApp)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMRecoveryDone", GuidToBstr(pInfo->guidApp));
IF_AUDIT_DO(OnCRMRecoveryDone)(pInfo->perfCount, GuidToBstr(pInfo->guidApp));
return S_OK;
} // CCRMSub::OnCRMRecoveryDone
STDMETHODIMP CCRMSub::OnCRMCheckpoint(
COMSVCSEVENTINFO * pInfo,
GUID guidApp)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMCheckpoint", GuidToBstr(pInfo->guidApp));
IF_AUDIT_DO(OnCRMCheckpoint)(pInfo->perfCount, GuidToBstr(pInfo->guidApp));
return S_OK;
} // CCRMSub::OnCRMCheckpoint
STDMETHODIMP CCRMSub::OnCRMBegin(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID,
GUID guidActivity,
GUID guidTx,
WCHAR szProgIdCompensator[64], // NOTE: hardcoded
WCHAR szDescription[64]) // NOTE: hardcoded
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMBegin", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
m_pSpy->AddParamValueToList(L"Activity ID", GuidToBstr(guidActivity));
m_pSpy->AddParamValueToList(L"Transaction UOW ID", GuidToBstr(guidTx));
m_pSpy->AddParamValueToList(L"Compensator Prog ID", szProgIdCompensator);
m_pSpy->AddParamValueToList(L"Description", szDescription);
IF_AUDIT_DO(OnCRMBegin)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID),
GuidToBstr(guidActivity),
GuidToBstr(guidTx),
szProgIdCompensator,
szDescription
);
return S_OK;
} // CCRMSub::OnCRMBegin
STDMETHODIMP CCRMSub::OnCRMPrepare(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMPrepare", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMPrepare)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMPrepare
STDMETHODIMP CCRMSub::OnCRMCommit(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMCommit", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMCommit)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMCommit
STDMETHODIMP CCRMSub::OnCRMAbort(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMAbort", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMAbort)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMAbort
STDMETHODIMP CCRMSub::OnCRMIndoubt(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMIndoubt", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMIndoubt)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMIndoubt
STDMETHODIMP CCRMSub::OnCRMDone(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMDone", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMDone)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMDone
STDMETHODIMP CCRMSub::OnCRMRelease(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMRelease", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMRelease)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMRelease
STDMETHODIMP CCRMSub::OnCRMAnalyze(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID,
DWORD dwCrmRecordType,
DWORD dwRecordSize)
{
// internals info from CrmLogRecordFormat.h
static const LPCWSTR aRecordType[] =
{
L"None", // 0x00
L"LogInfo", // 0x01
L"NewClerk", // 0x02
L"ClerkList", // 0x03
L"ClerkBegin", // 0x20
L"Write", // 0x21
L"Forget", // 0x22
L"ClerkEnd", // 0x23
};
DWORD dwRecordTypeIndex;
if (dwCrmRecordType <= 0x03)
dwRecordTypeIndex = dwCrmRecordType;
else if (dwCrmRecordType < 0x20)
return E_INVALIDARG;
else if (dwCrmRecordType <= 0x23)
dwRecordTypeIndex = dwCrmRecordType - 0x20 + 4;
else
return E_INVALIDARG;
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMAnalyze", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
m_pSpy->AddParamValueToList(L"Record Type", aRecordType[dwRecordTypeIndex]);
WCHAR szRecordSize[32];
StringCchPrintf(szRecordSize, ARRAYSIZE(szRecordSize), L"%d", dwRecordSize);
m_pSpy->AddParamValueToList(L"Record Size", szRecordSize);
IF_AUDIT_DO(OnCRMAnalyze)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID),
aRecordType[dwRecordTypeIndex],
dwRecordSize
);
return S_OK;
} // CCRMSub::OnCRMAnalyze
STDMETHODIMP CCRMSub::OnCRMWrite(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID,
BOOL bVariants,
DWORD dwRecordSize)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMWrite", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
m_pSpy->AddParamValueToList(L"Variants?", (bVariants ? L"Yes" : L"No"));
WCHAR szRecordSize[32];
StringCchPrintf(szRecordSize, ARRAYSIZE(szRecordSize), L"%d", dwRecordSize);
m_pSpy->AddParamValueToList(L"Record Size", szRecordSize);
IF_AUDIT_DO(OnCRMWrite)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID),
bVariants,
dwRecordSize
);
return S_OK;
} // CCRMSub::OnCRMWrite
STDMETHODIMP CCRMSub::OnCRMForget(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMForget", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMForget)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMForget
STDMETHODIMP CCRMSub::OnCRMForce(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMForce", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
IF_AUDIT_DO(OnCRMForce)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID)
);
return S_OK;
} // CCRMSub::OnCRMForce
STDMETHODIMP CCRMSub::OnCRMDeliver(
COMSVCSEVENTINFO * pInfo,
GUID guidClerkCLSID,
BOOL bVariants,
DWORD dwRecordSize)
{
m_pSpy->AddEventToList(pInfo->perfCount, L"OnCRMDeliver", GuidToBstr(pInfo->guidApp));
m_pSpy->AddParamValueToList(L"Clerk CLSID", GuidToBstr(guidClerkCLSID));
m_pSpy->AddParamValueToList(L"Variants?", (bVariants ? L"Yes" : L"No"));
WCHAR szRecordSize[32];
StringCchPrintf(szRecordSize,ARRAYSIZE(szRecordSize), L"%d", dwRecordSize);
m_pSpy->AddParamValueToList(L"Record Size", szRecordSize);
IF_AUDIT_DO(OnCRMDeliver)(pInfo->perfCount, GuidToBstr(pInfo->guidApp),
GuidToBstr(guidClerkCLSID),
bVariants,
dwRecordSize
);
return S_OK;
} // CCRMSub::OnCRMDeliver