Windows2003-3790/inetsrv/iis/svcs/wp/cmdsync/iissync.cxx
2020-09-30 16:53:55 +02:00

260 lines
6.3 KiB
C++

#define INITGUID
#include <windows.h>
#include <stdio.h>
#include <ole2.h>
#include "mdsync.h"
//
// HRESULTTOWIN32() maps an HRESULT to a Win32 error. If the facility code
// of the HRESULT is FACILITY_WIN32, then the code portion (i.e. the
// original Win32 error) is returned. Otherwise, the original HRESULT is
// returned unchagned.
//
#define HRESULTTOWIN32(hres) \
((HRESULT_FACILITY(hres) == FACILITY_WIN32) \
? HRESULT_CODE(hres) \
: (hres))
BOOL g_fDone = FALSE;
DWORD g_dwTarget = 0;
SYNC_STAT* g_pStat = NULL;
CHAR g_achMsg1[128];
CHAR g_achMsg2[128];
CHAR g_achMsg3[128];
CHAR g_achMsg4[128];
CHAR g_achMsg5[128];
CHAR g_achMsg6[128];
CHAR g_achMsg7[128];
CHAR g_achMsg8[128];
CHAR g_achMsg9[128];
DWORD
WINAPI
Monitor(
LPVOID pV
)
{
for ( ;; )
{
printf( g_achMsg1,
g_pStat->m_dwSourceScan,
g_pStat->m_fSourceComplete ? g_achMsg2 : g_achMsg3 );
for ( UINT i = 0 ; i < g_dwTarget ; ++i )
{
printf( "(%d,%d), ", g_pStat->m_adwTargets[i*2], g_pStat->m_adwTargets[i*2+1] );
}
printf( "\r" );
if ( g_fDone )
{
break;
}
Sleep( 1000 );
}
return 0;
}
/* INTRINSA ignore = all */
VOID
DisplayErrorMessage(
DWORD dwErr
)
{
LPSTR pErr;
if ( FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&pErr,
0,
NULL ) )
{
LPSTR p;
if ( p = strchr( pErr, '\r' ) )
{
*p = '\0';
}
fputs( pErr, stdout );
LocalFree( pErr );
}
else
{
fputs( g_achMsg9, stdout );
}
}
int __cdecl main( int argc, char*argv[] )
{
IMdSync* pIf;
LPDWORD pdwErr;
HANDLE hThread;
DWORD dwThreadId;
LPSTR pTargets;
int iA;
UINT cT;
int Status = 0;
HRESULT hRes;
DWORD dwFlags = 0;
DWORD iT;
BOOL fAtLeastOnError = FALSE;
if ( argc < 2 )
{
CHAR achMsg[2048];
if ( LoadString( NULL, 100, achMsg, sizeof(achMsg) ) )
{
printf( achMsg );
}
return 3;
}
if ( !LoadString( NULL, 101, g_achMsg1, sizeof(g_achMsg1) ) ||
!LoadString( NULL, 102, g_achMsg2, sizeof(g_achMsg2) ) ||
!LoadString( NULL, 103, g_achMsg3, sizeof(g_achMsg3) ) ||
!LoadString( NULL, 105, g_achMsg5, sizeof(g_achMsg5) ) ||
!LoadString( NULL, 106, g_achMsg6, sizeof(g_achMsg6) ) ||
!LoadString( NULL, 107, g_achMsg7, sizeof(g_achMsg7) ) ||
!LoadString( NULL, 108, g_achMsg8, sizeof(g_achMsg8) ) ||
!LoadString( NULL, 109, g_achMsg9, sizeof(g_achMsg9) ) ||
!LoadString( NULL, 104, g_achMsg4, sizeof(g_achMsg4) ) )
{
DisplayErrorMessage( GetLastError() );
return 1;
}
//
// Count targets, get target name length
//
for ( cT = 1, g_dwTarget=0, iA = 1 ; iA < argc ; ++iA )
{
if ( argv[iA][0] == '-' )
{
switch ( argv[iA][1] )
{
case 'c':
dwFlags |= MD_SYNC_FLAG_CHECK_ADMINEX_SIGNATURE;
break;
}
}
else
{
cT += strlen( argv[iA] ) + 1;
++g_dwTarget;
}
}
if ( !(g_pStat = (SYNC_STAT*)LocalAlloc( LMEM_FIXED,
sizeof(SYNC_STAT)+sizeof(DWORD)*2*g_dwTarget )) ||
!(pTargets = (LPSTR)LocalAlloc( LMEM_FIXED, cT )) ||
!(pdwErr = (LPDWORD)LocalAlloc( LMEM_FIXED, sizeof(DWORD)*g_dwTarget)) )
{
DisplayErrorMessage( GetLastError() );
return 1;
}
memset ( g_pStat, '\0', sizeof(SYNC_STAT)+sizeof(DWORD)*2*g_dwTarget );
//
// Create target string
//
for ( cT = 0, iA = 1 ; iA < argc ; ++iA )
{
if ( argv[iA][0] != '-' )
{
strcpy( pTargets + cT, argv[iA] );
cT += strlen( argv[iA] ) + 1;
}
}
pTargets[cT] = '\0';
//
// call synchronize method
//
CoInitializeEx( NULL, COINIT_MULTITHREADED );
if ( SUCCEEDED( hRes = CoCreateInstance( CLSID_MDSync, NULL, CLSCTX_INPROC_SERVER, IID_IMDSync, (LPVOID*)&pIf ) ) )
{
hThread = CreateThread( NULL, 0, ::Monitor, NULL, 0, &dwThreadId );
hRes = pIf->Synchronize( pTargets, pdwErr, dwFlags, (LPDWORD)g_pStat );
g_fDone = TRUE;
if ( hThread )
{
WaitForSingleObject( hThread, INFINITE );
}
printf( "\n" );
pIf->Release();
if ( FAILED( hRes ) && hRes != E_FAIL )
{
DisplayErrorMessage( HRESULTTOWIN32( hRes ) );
Status = 2;
}
else
{
for ( cT = 0, iA = 1, iT = 0 ; iA < argc ; ++iA )
{
if ( argv[iA][0] != '-' )
{
if ( pdwErr[iT] )
{
printf( g_achMsg5, argv[iA] );
DisplayErrorMessage( pdwErr[iT] );
printf( g_achMsg6, pdwErr[iT], pdwErr[iT] );
fAtLeastOnError = TRUE;
}
else
{
printf( g_achMsg4, argv[iA] );
}
++iT;
}
}
if ( fAtLeastOnError )
{
Status = 2;
}
}
}
else
{
DisplayErrorMessage( HRESULTTOWIN32( hRes ) );
Status = 2;
}
CoUninitialize();
LocalFree( g_pStat );
LocalFree( pTargets );
LocalFree( pdwErr );
if ( Status )
{
printf( g_achMsg8 );
}
else
{
printf( g_achMsg7 );
}
return Status;
}