windows-nt/Source/XPSP1/NT/com/svcdlls/trksvcs/utest/tforceown.cxx
2020-09-26 16:20:57 +08:00

411 lines
12 KiB
C++

#include "pch.cxx"
#pragma hdrstop
#include "teststub.cxx"
#define TRKDATA_ALLOCATE
#include "trksvr.hxx"
#undef TRKDATA_ALLOCATE
#import "itrkadmn.tlb" no_namespace
#include "itrkadmn.hxx"
const TCHAR tszKeyNameLinkTrack[] = TEXT("System\\CurrentControlSet\\Services\\TrkWks\\Parameters");
DWORD g_Debug = TRKDBG_ERROR;
void Usage()
{
_tprintf( TEXT("\n")
TEXT("Purpose: Use this test to check the ownership status - or take ownership - of\n")
TEXT(" file(s) or volume(s).\n")
TEXT("Usage: TForceOwn <options> <file(s) or volume(s)>\n")
TEXT("Options: -f<scope> Take ownership of file(s)\n")
TEXT(" -f<scope>s Check file ownership status\n")
TEXT(" -v<scope> Take ownership of volume(s)\n")
TEXT(" -v<scope>s Check volume ownership status\n")
TEXT("Where <scope> is:\n")
TEXT(" f One file\n")
TEXT(" v One volume\n")
TEXT(" m Whole machine\n")
TEXT("E.g.:\n")
TEXT(" TForceOwn -vs \\\\machine\\share\\path\\file.txt\n")
TEXT(" // Gets status for the volume containing file.txt\n")
TEXT(" TForceOwn -ffs \\\\machine\\share\\path\\file.txt\n")
TEXT(" // Gets status for a single file\n")
TEXT(" TForceOwn -fm\n")
TEXT(" // Forces all files on \\\\machine to be owned by that machine\n") );
}
void
DoVolumeStatus( TrkInfoScope scope, TCHAR *ptszUncPath )
{
HRESULT hr = E_FAIL;
LONG cVols = 0;
LONG iVol;
BSTR bstr = NULL;
LONG lLowerBound, lUpperBound;
// BUGBUG: we should have a try/catch(_com_error) here, but to do that
// we need to set USE_NATIVE_EH in the sources file, and we can't do
// that yet because the itrkadmn dll is still using __try.
_bstr_t bstrPath( ptszUncPath );
VARIANT varrglongIndex;
VARIANT varrgbstrVolId;
VARIANT varrglongStatus;
ITrkForceOwnershipPtr pForceOwn( TEXT("LinkTrack.TrkForceOwnership.1") );
__try
{
SAFEARRAYBOUND sabound;
hr = pForceOwn->VolumeStatus( bstrPath, scope, &varrglongIndex, &varrgbstrVolId, &varrglongStatus );
if( FAILED(hr) ) TrkRaiseException( hr );
TrkAssert( (VT_ARRAY|VT_I4) == varrglongIndex.vt );
TrkAssert( (VT_ARRAY|VT_BSTR) == varrgbstrVolId.vt );
TrkAssert( (VT_ARRAY|VT_I4) == varrglongStatus.vt );
TrkAssert( 1 == SafeArrayGetDim( varrglongIndex.parray ));
TrkAssert( 1 == SafeArrayGetDim( varrgbstrVolId.parray ));
TrkAssert( 1 == SafeArrayGetDim( varrglongStatus.parray ));
hr = SafeArrayGetLBound( varrglongIndex.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetLBound( varrgbstrVolId.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetLBound( varrglongStatus.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetUBound( varrglongIndex.parray, 1, &lUpperBound );
if( FAILED(hr) ) TrkRaiseException( hr );
cVols = lUpperBound + 1;
hr = SafeArrayGetUBound( varrgbstrVolId.parray, 1, &lUpperBound );
TrkAssert( SUCCEEDED(hr) && cVols == lUpperBound + 1 );
hr = SafeArrayGetUBound( varrglongStatus.parray, 1, &lUpperBound );
TrkAssert( SUCCEEDED(hr) && cVols == lUpperBound + 1 );
_tprintf( TEXT("\n")
TEXT("Volume ownership status for %s\n"),
ptszUncPath );
for( iVol = 0; iVol < cVols; iVol++ )
{
LONG lVolIndex, lStatus;
BSTR bstr = NULL;
_tprintf( TEXT("\n") );
hr = SafeArrayGetElement( varrglongIndex.parray, &iVol, &lVolIndex );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %c\n"), TEXT("Volume:"), TEXT('A')+static_cast<TCHAR>(lVolIndex) );
hr = SafeArrayGetElement( varrgbstrVolId.parray, &iVol, &bstr );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %s\n"), TEXT("ID:"), bstr );
SysFreeString( bstr ); bstr = NULL;
hr = SafeArrayGetElement( varrglongStatus.parray, &iVol, &lStatus );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %s\n"), TEXT("Status:"), (TCHAR*) CObjectOwnershipString(lStatus) );
}
}
__except( BreakOnDebuggableException() )
{
hr = GetExceptionCode();
TrkAssert( STATUS_ACCESS_VIOLATION != hr );
}
Exit:
VariantClear( &varrglongIndex );
VariantClear( &varrgbstrVolId );
VariantClear( &varrglongStatus );
if( bstr ) SysFreeString( bstr );
if( FAILED(hr) )
_tprintf( TEXT("DoVolumeStatus failed: %08x\n"), hr );
}
void
DoVolumes( TrkInfoScope scope, TCHAR *ptszUncPath )
{
HRESULT hr = E_FAIL;
// BUGBUG: we should have a try/catch(_com_error) here, but to do that
// we need to set USE_NATIVE_EH in the sources file, and we can't do
// that yet because the itrkadmn dll is still using __try.
_bstr_t bstrPath( ptszUncPath );
ITrkForceOwnershipPtr pForceOwn( TEXT("LinkTrack.TrkForceOwnership.1") );
__try
{
hr = pForceOwn->Volumes( bstrPath, scope );
if( FAILED(hr) ) TrkRaiseException( hr );
}
__except( BreakOnDebuggableException() )
{
hr = GetExceptionCode();
TrkAssert( STATUS_ACCESS_VIOLATION != hr );
}
Exit:
if( FAILED(hr) )
_tprintf( TEXT("DoVolumes failed: %08x\n"), hr );
}
void
DoFileStatus( TrkInfoScope scope, TCHAR *ptszUncPath )
{
HRESULT hr = E_FAIL;
LONG cFiles = 0;
LONG iFile;
BSTR bstr = NULL;
LONG lLowerBound, lUpperBound;
// BUGBUG: we should have a try/catch(_com_error) here, but to do that
// we need to set USE_NATIVE_EH in the sources file, and we can't do
// that yet because the itrkadmn dll is still using __try.
_bstr_t bstrPath( ptszUncPath );
VARIANT varrgbstrFileName;
VARIANT varrgbstrFileId;
VARIANT varrglongStatus;
ITrkForceOwnershipPtr pForceOwn( TEXT("LinkTrack.TrkForceOwnership.1") );
__try
{
SAFEARRAYBOUND sabound;
hr = pForceOwn->FileStatus( bstrPath, scope, &varrgbstrFileName, &varrgbstrFileId, &varrglongStatus );
if( FAILED(hr) ) TrkRaiseException( hr );
TrkAssert( (VT_ARRAY|VT_BSTR) == varrgbstrFileName.vt );
TrkAssert( (VT_ARRAY|VT_BSTR) == varrgbstrFileId.vt );
TrkAssert( (VT_ARRAY|VT_I4) == varrglongStatus.vt );
TrkAssert( 1 == SafeArrayGetDim( varrgbstrFileName.parray ));
TrkAssert( 1 == SafeArrayGetDim( varrgbstrFileId.parray ));
TrkAssert( 1 == SafeArrayGetDim( varrglongStatus.parray ));
hr = SafeArrayGetLBound( varrgbstrFileName.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetLBound( varrgbstrFileId.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetLBound( varrglongStatus.parray, 1, &lLowerBound );
TrkAssert( SUCCEEDED(hr) && 0 == lLowerBound );
hr = SafeArrayGetUBound( varrgbstrFileName.parray, 1, &lUpperBound );
if( FAILED(hr) ) TrkRaiseException( hr );
cFiles = lUpperBound + 1;
hr = SafeArrayGetUBound( varrgbstrFileId.parray, 1, &lUpperBound );
TrkAssert( SUCCEEDED(hr) && cFiles == lUpperBound + 1 );
hr = SafeArrayGetUBound( varrglongStatus.parray, 1, &lUpperBound );
TrkAssert( SUCCEEDED(hr) && cFiles == lUpperBound + 1 );
_tprintf( TEXT("\n")
TEXT("File ownership status for %s\n"),
ptszUncPath );
for( iFile = 0; iFile < cFiles; iFile++ )
{
BSTR bstr = NULL;
long lStatus;
_tprintf( TEXT("\n") );
hr = SafeArrayGetElement( varrgbstrFileName.parray, &iFile, &bstr );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %s\n"), TEXT("File:"), bstr );
SysFreeString( bstr ); bstr = NULL;
hr = SafeArrayGetElement( varrgbstrFileId.parray, &iFile, &bstr );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %s\n"), TEXT("ID:"), bstr );
SysFreeString( bstr ); bstr = NULL;
hr = SafeArrayGetElement( varrglongStatus.parray, &iFile, &lStatus );
if( FAILED(hr) ) TrkRaiseException( hr );
_tprintf( TEXT("%10s %s\n"), TEXT("Status:"), (TCHAR*) CObjectOwnershipString(lStatus) );
}
}
__except( BreakOnDebuggableException() )
{
hr = GetExceptionCode();
TrkAssert( STATUS_ACCESS_VIOLATION != hr );
}
Exit:
VariantClear( &varrgbstrFileName );
VariantClear( &varrgbstrFileId );
VariantClear( &varrglongStatus );
if( bstr ) SysFreeString( bstr );
if( FAILED(hr) )
_tprintf( TEXT("DoFileStatus failed: %08x\n"), hr );
}
void
DoFiles( TrkInfoScope scope, TCHAR *ptszUncPath )
{
HRESULT hr = E_FAIL;
// BUGBUG: we should have a try/catch(_com_error) here, but to do that
// we need to set USE_NATIVE_EH in the sources file, and we can't do
// that yet because the itrkadmn dll is still using __try.
_bstr_t bstrPath( ptszUncPath );
ITrkForceOwnershipPtr pForceOwn( TEXT("LinkTrack.TrkForceOwnership.1") );
__try
{
hr = pForceOwn->Files( bstrPath, scope );
if( FAILED(hr) ) TrkRaiseException( hr );
}
__except( BreakOnDebuggableException() )
{
hr = GetExceptionCode();
TrkAssert( STATUS_ACCESS_VIOLATION != hr );
}
Exit:
if( FAILED(hr) )
_tprintf( TEXT("DoFiles failed: %08x\n"), hr );
}
struct tagStartOle
{
tagStartOle() { CoInitialize( NULL ); }
~tagStartOle() { CoUninitialize(); }
} StartOle;
EXTERN_C void __cdecl _tmain( ULONG cArgs, TCHAR *rgtszArgs[] )
{
TrkInfoScope scope;
TrkDebugCreate( TRK_DBG_FLAGS_WRITE_TO_DBG | TRK_DBG_FLAGS_WRITE_TO_STDOUT, "TForceOwn" );
if( 3 > cArgs
||
( rgtszArgs[1][0] != TEXT('-')
&&
rgtszArgs[1][0] != TEXT('/')
)
)
{
Usage();
goto Exit;
}
_tcsupr( rgtszArgs[1] );
switch( rgtszArgs[ 1 ][ 1 ] )
{
case TEXT('V'):
switch( rgtszArgs[1][2] )
{
case TEXT('V'):
scope = TRKINFOSCOPE_VOLUME;
break;
case TEXT('M'):
scope = TRKINFOSCOPE_MACHINE;
break;
default:
_tprintf( TEXT("Unsupported option: %s\n"), rgtszArgs[1] );
goto Exit;
}
if( TEXT('S') == rgtszArgs[1][3] )
DoVolumeStatus( scope, rgtszArgs[2] );
else
DoVolumes( scope, rgtszArgs[2] );
break;
case TEXT('F'):
switch( rgtszArgs[1][2] )
{
case TEXT('F'):
scope = TRKINFOSCOPE_ONE_FILE;
break;
case TEXT('V'):
scope = TRKINFOSCOPE_VOLUME;
break;
case TEXT('M'):
scope = TRKINFOSCOPE_MACHINE;
break;
default:
_tprintf( TEXT("Unsupported option: %s\n"), rgtszArgs[1] );
goto Exit;
}
if( TEXT('S') == rgtszArgs[1][3] )
DoFileStatus( scope, rgtszArgs[2] );
else
DoFiles( scope, rgtszArgs[2] );
break;
default:
_tprintf( TEXT("Unsupported option: %s\n"), rgtszArgs[1] );
break;
}
Exit:
return;
}