You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
341 lines
8.2 KiB
341 lines
8.2 KiB
|
|
#include <windows.h>
|
|
#include <wmimsg.h>
|
|
#include <comutl.h>
|
|
#include <rcvtest.h>
|
|
#include <rcvtest_i.c>
|
|
#include <stdio.h>
|
|
|
|
FILE* g_pfLogFile;
|
|
|
|
class CReceiveTest : public IReceiveTest, public IClassFactory
|
|
{
|
|
public:
|
|
|
|
STDMETHOD_(ULONG,AddRef)() { return 1; }
|
|
STDMETHOD_(ULONG,Release)() { return 1; }
|
|
STDMETHOD(QueryInterface)( REFIID riid , void** ppv )
|
|
{
|
|
if ( riid == IID_IUnknown || riid == IID_IReceiveTest )
|
|
{
|
|
*ppv = (IReceiveTest*)this;
|
|
}
|
|
else if ( riid == IID_IClassFactory )
|
|
{
|
|
*ppv = (IClassFactory*)this;
|
|
}
|
|
else
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(CreateInstance)( IUnknown* pOuter, REFIID riid, void** ppv )
|
|
{
|
|
return QueryInterface( riid, ppv );
|
|
}
|
|
|
|
STDMETHOD(LockServer) (BOOL bLock ) { return S_OK; }
|
|
|
|
STDMETHOD(RunTest)( LPCWSTR wszTarget,
|
|
DWORD dwFlags,
|
|
LPCWSTR wszPrincipal,
|
|
ULONG cMsgs,
|
|
ULONG* pultime );
|
|
|
|
STDMETHOD(Kill)()
|
|
{
|
|
PostThreadMessage( GetCurrentThreadId(), WM_QUIT, 0, 0 );
|
|
return S_OK;
|
|
}
|
|
};
|
|
|
|
struct CTestMsgHandler : public IWmiMessageTraceSink,
|
|
public IWmiMessageSendReceive
|
|
{
|
|
HRESULT m_hr;
|
|
HANDLE m_hEvent;
|
|
long m_cCurrentMsgs;
|
|
long m_cExpectedMsgs;
|
|
SYSTEMTIME m_Start;
|
|
|
|
CTestMsgHandler( long cExpectedMsgs, HANDLE hEvent )
|
|
: m_cExpectedMsgs( cExpectedMsgs ), m_cCurrentMsgs(0),
|
|
m_hEvent( hEvent ), m_hr( S_OK )
|
|
{
|
|
}
|
|
|
|
~CTestMsgHandler()
|
|
{
|
|
CloseHandle( m_hEvent );
|
|
}
|
|
|
|
HRESULT GetResult() { return m_hr; }
|
|
|
|
STDMETHOD_(ULONG,AddRef)() { return 1; }
|
|
STDMETHOD_(ULONG,Release)() { return 1; }
|
|
|
|
STDMETHOD(QueryInterface)( REFIID riid , void** ppv )
|
|
{
|
|
if ( riid == IID_IWmiMessageTraceSink ||
|
|
riid == IID_IUnknown )
|
|
{
|
|
*ppv = (IWmiMessageTraceSink*)this;
|
|
}
|
|
else if ( riid == IID_IWmiMessageSendReceive )
|
|
{
|
|
*ppv = (IWmiMessageSendReceive*)this;
|
|
}
|
|
if ( *ppv == NULL )
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
void LogMessage( PBYTE pMsg,
|
|
ULONG cMsg,
|
|
PBYTE pAuxData,
|
|
ULONG cAuxData,
|
|
DWORD dwFlagStatus,
|
|
IUnknown* pCtx )
|
|
{
|
|
if ( g_pfLogFile == NULL )
|
|
{
|
|
return;
|
|
}
|
|
|
|
IWmiMessageReceiverContext* pRecvCtx;
|
|
|
|
pCtx->QueryInterface( IID_IWmiMessageReceiverContext,
|
|
(void**)&pRecvCtx );
|
|
|
|
SYSTEMTIME st;
|
|
WCHAR awchTime[64];
|
|
pRecvCtx->GetTimeSent( &st );
|
|
swprintf( awchTime, L"%d:%d:%d:%d", st.wHour,
|
|
st.wMinute,
|
|
st.wSecond,
|
|
st.wMilliseconds );
|
|
|
|
WCHAR awchTarget[256];
|
|
ULONG cTarget;
|
|
|
|
pRecvCtx->GetTarget( awchTarget, 256, &cTarget );
|
|
|
|
WCHAR awchSource[256];
|
|
ULONG cSource;
|
|
|
|
pRecvCtx->GetSendingMachine( awchSource, 256, &cSource );
|
|
|
|
WCHAR awchSenderId[256];
|
|
ULONG cSenderId;
|
|
|
|
pRecvCtx->GetSenderId( awchSenderId, 256, &cSenderId );
|
|
|
|
awchSource[cSource] = '\0';
|
|
awchSenderId[cSenderId] = '\0';
|
|
awchTarget[cTarget] = '\0';
|
|
|
|
BOOL bAuth;
|
|
|
|
bAuth = pRecvCtx->IsSenderAuthenticated() == S_OK ? TRUE : FALSE;
|
|
|
|
fwprintf( g_pfLogFile, L"MSG - #%d, Len:%d, AuxLen:%d, Status:%d, "
|
|
L"Time:%s, Source:%s, Target:%s, SenderId:%s, Auth:%d\n",
|
|
m_cCurrentMsgs, cMsg, cAuxData, dwFlagStatus,
|
|
awchTime, awchSource, awchTarget, awchSenderId, bAuth );
|
|
|
|
fflush( g_pfLogFile );
|
|
}
|
|
|
|
STDMETHOD(Notify)( HRESULT hRes,
|
|
GUID guidSource,
|
|
LPCWSTR wszError,
|
|
IUnknown* pCtx )
|
|
{
|
|
if ( g_pfLogFile != NULL )
|
|
{
|
|
fwprintf( g_pfLogFile, L"Notify : HR=0x%x, ErrorStr : %s\n",
|
|
hRes, wszError );
|
|
}
|
|
|
|
if ( SUCCEEDED(m_hr) )
|
|
{
|
|
m_hr = hRes;
|
|
SetEvent( m_hEvent );
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(SendReceive)( PBYTE pMsg,
|
|
ULONG cMsg,
|
|
PBYTE pAuxData,
|
|
ULONG cAuxData,
|
|
DWORD dwFlagStatus,
|
|
IUnknown* pCtx )
|
|
{
|
|
LogMessage( pMsg, cMsg, pAuxData, cAuxData, dwFlagStatus, pCtx );
|
|
|
|
long cCurrentMsgs = InterlockedIncrement( &m_cCurrentMsgs );
|
|
|
|
if ( cCurrentMsgs == 1 )
|
|
{
|
|
GetSystemTime( &m_Start );
|
|
}
|
|
|
|
if ( cCurrentMsgs >= m_cExpectedMsgs )
|
|
{
|
|
SetEvent( m_hEvent );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
};
|
|
|
|
static HANDLE g_hShutdown;
|
|
|
|
HRESULT CReceiveTest::RunTest( LPCWSTR wszTarget,
|
|
DWORD dwFlags,
|
|
LPCWSTR wszPrincipal,
|
|
ULONG cMsgs,
|
|
ULONG* pulTime )
|
|
{
|
|
HRESULT hr;
|
|
|
|
CLSID clsidReceiver;
|
|
|
|
*pulTime = 0;
|
|
|
|
if ( ( dwFlags & WMIMSG_MASK_QOS) != WMIMSG_FLAG_QOS_SYNCHRONOUS )
|
|
{
|
|
clsidReceiver = CLSID_WmiMessageMsmqReceiver;
|
|
}
|
|
else
|
|
{
|
|
clsidReceiver = CLSID_WmiMessageRpcReceiver;
|
|
}
|
|
|
|
CWbemPtr<IWmiMessageReceiver> pReceiver;
|
|
|
|
hr = CoCreateInstance( clsidReceiver,
|
|
NULL,
|
|
CLSCTX_INPROC,
|
|
IID_IWmiMessageReceiver,
|
|
(void**)&pReceiver );
|
|
if ( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
|
|
|
|
CTestMsgHandler TestHndlr = CTestMsgHandler( cMsgs, hEvent );
|
|
|
|
WMIMSG_RCVR_AUTH_INFO AuthInfo;
|
|
|
|
if ( wszPrincipal != NULL )
|
|
{
|
|
AuthInfo.awszPrincipal = &wszPrincipal;
|
|
AuthInfo.cwszPrincipal = 1;
|
|
hr = pReceiver->Open( wszTarget, dwFlags, &AuthInfo, &TestHndlr );
|
|
}
|
|
else
|
|
{
|
|
hr = pReceiver->Open( wszTarget, dwFlags, NULL, &TestHndlr );
|
|
}
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
SYSTEMTIME Start, End;
|
|
|
|
WaitForSingleObject( hEvent, INFINITE );
|
|
|
|
if ( FAILED( TestHndlr.m_hr ) )
|
|
{
|
|
return TestHndlr.m_hr;
|
|
}
|
|
|
|
Start = TestHndlr.m_Start;
|
|
|
|
GetSystemTime( &End );
|
|
|
|
__int64 i64Start, i64End;
|
|
DWORD dwElapsed;
|
|
SystemTimeToFileTime( &Start, PFILETIME(&i64Start) );
|
|
SystemTimeToFileTime( &End, PFILETIME(&i64End) );
|
|
dwElapsed = DWORD(i64End - i64Start) / 10000;
|
|
|
|
*pulTime = dwElapsed;
|
|
|
|
return S_OK;
|
|
};
|
|
|
|
extern "C" int __cdecl main( int argc, char* argv[] )
|
|
{
|
|
if ( argc > 1 )
|
|
{
|
|
LPCSTR szLogFile = argv[1];
|
|
|
|
g_pfLogFile = fopen( szLogFile, "w" );
|
|
|
|
if ( g_pfLogFile == NULL )
|
|
{
|
|
printf( "Could not open LogFile %s", szLogFile );
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
CoInitializeEx( NULL, COINIT_MULTITHREADED );
|
|
|
|
CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT,
|
|
RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL );
|
|
|
|
g_hShutdown = CreateEvent( NULL, TRUE, FALSE, NULL );
|
|
|
|
CReceiveTest RcvTest;
|
|
|
|
HRESULT hr;
|
|
DWORD dwReg;
|
|
|
|
hr = CoRegisterClassObject( CLSID_ReceiveTest,
|
|
(IClassFactory*)&RcvTest,
|
|
CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&dwReg );
|
|
if ( FAILED(hr) )
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
WaitForSingleObject( g_hShutdown, INFINITE );
|
|
|
|
if ( g_pfLogFile != NULL )
|
|
{
|
|
fclose( g_pfLogFile );
|
|
}
|
|
|
|
CoRevokeClassObject( dwReg );
|
|
|
|
CoUninitialize();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|