#include #pragma hdrstop #include #include "trkwks.hxx" #include "dltadmin.hxx" HRESULT SendParameterValueToService( BOOL fTrkWks, DWORD dwParameter, DWORD dwValue ) { HRESULT hr = E_FAIL; RPC_STATUS rpcstatus; RPC_TCHAR * ptszStringBinding; RPC_BINDING_HANDLE hBinding = NULL; BOOL fBound = FALSE; TRKSVR_MESSAGE_UNION Msg; if( !fTrkWks ) return( HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED )); rpcstatus = RpcStringBindingCompose( NULL, TEXT("ncalrpc"), NULL, TEXT("trkwks"), NULL, &ptszStringBinding); if( rpcstatus ) { TrkLog(( TRKDBG_ERROR, TEXT("Failed RpcStringBindingCompose %lu"), rpcstatus )); hr = HRESULT_FROM_WIN32(rpcstatus); goto Exit; } rpcstatus = RpcBindingFromStringBinding( ptszStringBinding, &hBinding ); RpcStringFree( &ptszStringBinding ); if( rpcstatus ) { TrkLog(( TRKDBG_ERROR, TEXT("Failed RpcBindingFromStringBinding") )); hr = HRESULT_FROM_WIN32(rpcstatus); goto Exit; } fBound = TRUE; memset( &Msg, 0, sizeof(Msg) ); Msg.MessageType = WKS_CONFIG; Msg.Priority = PRI_0; Msg.WksConfig.dwParameter = dwParameter; Msg.WksConfig.dwNewValue = dwValue; __try { hr = LnkCallSvrMessage( hBinding, &Msg); } __except( EXCEPTION_EXECUTE_HANDLER ) { hr = HRESULT_FROM_WIN32( GetExceptionCode() ); } if( FAILED(hr) ) { _tprintf( TEXT("Failed call to service (%08x)\n"), hr ); goto Exit; } Exit: if( fBound ) RpcBindingFree( &hBinding ); return( hr ); } BOOL DltAdminConfig( ULONG cArgs, TCHAR * const rgptszArgs[], ULONG *pcEaten ) { BOOL fTrkWks = FALSE; LONG iArg = 0; BOOL fDynamic = FALSE; if( 1 <= cArgs && IsHelpArgument( rgptszArgs[0] )) { printf("\nOption Config\n" " Purpose: Set tracking service configuration\n" " Usage: -config [options] [ ]\n" " If the parm/value is ommitted, a list\n" " of parameters is displayed\n" " Options: -d Attempt to dynamically change the parameter\n" " on the running service\n" " E.g.: -config trkwks VolInitInitialDelay 0\n" " -config trkwks\n" " -config trkwks -d MoveNotifyTimeout 5\n" ); return( TRUE ); } if( !_tcsicmp( rgptszArgs[iArg], TEXT("trkwks") )) fTrkWks = TRUE; else if( !_tcsicmp( rgptszArgs[iArg], TEXT("trksvr") )) fTrkWks = FALSE; else { _tprintf( TEXT("Invalid service name (%s). Use -? for help\n"), rgptszArgs[0] ); return( FALSE ); } iArg++; while( iArg < cArgs && ( rgptszArgs[ iArg ][0] == TEXT('/') || rgptszArgs[ iArg ][0] == TEXT('-') ) ) { _tcsupr( rgptszArgs[ iArg ] ); switch( rgptszArgs[ iArg ][ 1 ] ) { case TEXT('D'): fDynamic = TRUE; break; default: _tprintf( TEXT("Unknown option (%s). Use -? for help\n"), rgptszArgs[iArg] ); return( FALSE ); } iArg++; (*pcEaten)++; } if( iArg + 2 != cArgs && iArg != cArgs ) { printf( "Invalid parameters. Use -? for help\n" ); return( FALSE ); } (*pcEaten) += 2; if( fTrkWks ) { CTrkWksConfiguration configWks; configWks.Initialize( TRUE ); // => Persistable if( iArg == cArgs ) printf( "Configurable parameters:\n\n" ); for( int i = 0; i < configWks.GetParameterCount(); i++ ) { if( iArg == cArgs ) { _tprintf( TEXT(" %s\n"), configWks.GetParameterName( i ) ); } else if( !_tcsicmp( configWks.GetParameterName(i), rgptszArgs[iArg] )) { DWORD dwValue; if( 1 == _stscanf( rgptszArgs[iArg+1], TEXT("0x%x"), &dwValue ) || 1 == _stscanf( rgptszArgs[iArg+1], TEXT("%lu"), &dwValue) ) { if( fDynamic ) { HRESULT hr = SendParameterValueToService( fTrkWks, i, dwValue ); if( FAILED(hr) ) { _tprintf( TEXT("Couldn't set %s in service (%08x)"), rgptszArgs[iArg], hr ); return( FALSE ); } else { } } HRESULT hr = configWks.PersistParameter( i, dwValue ); if( FAILED(hr) ) { printf( "Couldn't write parameter to registry (%08x)", hr ); return( FALSE ); } else { _tprintf( TEXT("Set %s to 0x%x\n"), configWks.GetParameterName(i), dwValue ); } } else { _tprintf( TEXT("Couldn't interpret parameter value (%s)\n"), rgptszArgs[iArg+1] ); return( FALSE ); } break; } } } return( TRUE ); } // main()