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

472 lines
12 KiB
C++

#include <pch.cxx>
#pragma hdrstop
#define TRKDATA_ALLOCATE
#include "trklib.hxx"
#include "trkwks.hxx"
#include "trkstub.h"
extern "C"
NTSTATUS
WINAPI
StartTrkWksServiceStubs(
PSVCS_START_RPC_SERVER RpcpStartRpcServer,
LPTSTR SvcsRpcPipeName
)
{
NTSTATUS dwStatus = STATUS_SUCCESS;
dwStatus = RpcpStartRpcServer(
SvcsRpcPipeName,
Stubtrkwks_v1_2_s_ifspec
);
if(NT_SUCCESS(dwStatus))
{
dwStatus = RpcpStartRpcServer(
SvcsRpcPipeName,
Stubtrkwks_v1_2_s_ifspec
);
}
return dwStatus;
}
extern "C"
NTSTATUS
WINAPI
StopTrkWksServiceStubs(
PSVCS_STOP_RPC_SERVER RpcpStopRpcServer
)
{
NTSTATUS dwStatus = STATUS_SUCCESS;
RpcpStopRpcServer(
Stubtrkwks_v1_2_s_ifspec
);
dwStatus = RpcpStopRpcServer(
Stubtrkwks_v1_2_s_ifspec
);
return dwStatus;
}
HRESULT
GetBinding( const TCHAR *ptszProtSeq,
const TCHAR *ptszEndPoint,
RPC_BINDING_HANDLE *phBinding )
{
WCHAR *pwszStringBinding = NULL;
HRESULT hr = E_FAIL;
RPC_STATUS rpcstatus;
rpcstatus = RpcStringBindingCompose( NULL,
const_cast<TCHAR*>(ptszProtSeq),
NULL,
const_cast<TCHAR*>(ptszEndPoint),
NULL,
&pwszStringBinding);
if( RPC_S_OK != rpcstatus )
{
hr = rpcstatus;
goto Exit;
}
rpcstatus = RpcBindingFromStringBinding( pwszStringBinding, phBinding );
if( RPC_S_OK != rpcstatus )
{
hr = rpcstatus;
goto Exit;
}
hr = S_OK;
Exit:
if( NULL != pwszStringBinding )
{
RpcStringFree( &pwszStringBinding );
pwszStringBinding = NULL;
}
return hr;
}
HRESULT StubLnkSearchMachine(RPC_BINDING_HANDLE IDL_handle,
ULONG RestrictionsIn,
const CDomainRelativeObjId *pdroidBirthLast,
const CDomainRelativeObjId *pdroidLast,
CDomainRelativeObjId *pdroidBirthNext,
CDomainRelativeObjId *pdroidNext,
CMachineId *pmcidNext,
TCHAR *ptsz )
{
HRESULT hr;
RPC_STATUS rpcstatus;
RPC_BINDING_HANDLE hBinding = NULL;
BOOL fImpersonating = FALSE;
hr = GetBinding( s_tszTrkWksRemoteRpcProtocol,
s_tszTrkWksRemoteRpcEndPoint,
&hBinding );
if( FAILED(hr) ) goto Exit;
rpcstatus = RpcImpersonateClient( IDL_handle );
if( STATUS_SUCCESS != rpcstatus )
{
hr = HRESULT_FROM_WIN32( rpcstatus );
goto Exit;
}
fImpersonating = TRUE;
__try
{
hr = LnkSearchMachine( hBinding,
RestrictionsIn,
pdroidBirthLast,
pdroidLast,
pdroidBirthNext,
pdroidNext,
pmcidNext,
ptsz );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
hr = GetExceptionCode();
}
Exit:
if( fImpersonating )
{
RpcRevertToSelf();
}
if( NULL != hBinding )
{
RpcBindingFree( &hBinding );
hBinding = NULL;
}
return hr;
}
HRESULT StubLnkCallSvrMessage(
/* [in] */ handle_t IDL_handle,
/* [switch_is][out][in] */ TRKSVR_MESSAGE_UNION __RPC_FAR *pMsg)
{
HRESULT hr;
RPC_STATUS rpcstatus;
RPC_BINDING_HANDLE hBinding = NULL;
BOOL fImpersonating = FALSE;
hr = GetBinding( s_tszTrkWksRemoteRpcProtocol,
s_tszTrkWksRemoteRpcEndPoint,
&hBinding );
if( FAILED(hr) ) goto Exit;
rpcstatus = RpcImpersonateClient( IDL_handle );
if( STATUS_SUCCESS != rpcstatus )
{
hr = HRESULT_FROM_WIN32( rpcstatus );
goto Exit;
}
fImpersonating = TRUE;
__try
{
hr = LnkCallSvrMessage( hBinding, pMsg );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
hr = GetExceptionCode();
}
Exit:
if( fImpersonating )
{
RpcRevertToSelf();
}
if( NULL != hBinding )
{
RpcBindingFree( &hBinding );
hBinding = NULL;
}
return hr;
}
void
StubLnkMendLink(PRPC_ASYNC_STATE pAsync_handle,
RPC_BINDING_HANDLE IDL_handle,
FILETIME ftLimit,
DWORD RestrictionsIn,
const CDomainRelativeObjId *pdroidBirth,
const CDomainRelativeObjId *pdroidLast,
const CMachineId * pmcidLast,
CDomainRelativeObjId * pdroidCurrent,
CMachineId * pmcidCurrent,
ULONG * pcbPath,
WCHAR * wsz)
{
HRESULT hr;
RPC_STATUS rpcstatus;
RPC_BINDING_HANDLE hBinding = NULL;
BOOL fImpersonating = FALSE;
RPC_ASYNC_STATE RpcAsyncState;
HANDLE hEvent = NULL;
hr = GetBinding( s_tszTrkWksLocalRpcProtocol,
s_tszTrkWksLocalRpcEndPoint,
&hBinding );
if( FAILED(hr) ) goto Exit;
rpcstatus = RpcImpersonateClient( IDL_handle );
if( STATUS_SUCCESS != rpcstatus )
{
hr = HRESULT_FROM_WIN32( rpcstatus );
goto Exit;
}
fImpersonating = TRUE;
__try
{
DWORD dwWaitReturn;
rpcstatus = RpcAsyncInitializeHandle( &RpcAsyncState, RPC_ASYNC_VERSION_1_0 );
if ( RPC_S_OK != rpcstatus )
{
hr = HRESULT_FROM_WIN32( rpcstatus );
__leave;
}
hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); // Auto-reset, not initially signaled
if( NULL == hEvent )
{
hr = HRESULT_FROM_WIN32( GetLastError() );
__leave;
}
RpcAsyncState.NotificationType = RpcNotificationTypeEvent;
RpcAsyncState.u.hEvent = hEvent;
RpcAsyncState.UserInfo = NULL;
LnkMendLink( &RpcAsyncState,
hBinding,
ftLimit,
RestrictionsIn,
pdroidBirth,
pdroidLast,
pmcidLast,
pdroidCurrent,
pmcidCurrent,
pcbPath,
wsz );
dwWaitReturn = WaitForSingleObject( hEvent, INFINITE );
if ( WAIT_OBJECT_0 != dwWaitReturn )
{
// There was an error of some kind.
hr = HRESULT_FROM_WIN32( GetLastError() );
__leave;
}
// Now we find out how the LnkMendLink call completed. If we get
// RPC_S_OK, then it completed normally, and the result is
// in hr.
rpcstatus = RpcAsyncCompleteCall( &RpcAsyncState, &hr );
if ( RPC_S_OK != rpcstatus )
{
// The call either failed or was cancelled (the reason for the
// cancel would be that the UI thread called CTracker::CancelSearch,
// or because we timed out above and called RpcAsyncCancelCall).
hr = HRESULT_FROM_WIN32(rpcstatus);
__leave;
}
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
hr = GetExceptionCode();
}
Exit:
if( NULL != hEvent )
{
CloseHandle( hEvent );
hEvent = NULL;
}
if( fImpersonating )
{
RpcRevertToSelf();
}
if( NULL != hBinding )
{
RpcBindingFree( &hBinding );
hBinding = NULL;
}
if( NULL != pAsync_handle )
{
HRESULT hrT = RpcAsyncCompleteCall( pAsync_handle, &hr );
}
}
HRESULT Stubold_LnkMendLink(
/* [in] */ handle_t IDL_handle,
/* [in] */ FILETIME ftLimit,
/* [in] */ ULONG Restrictions,
/* [in] */ const CDomainRelativeObjId __RPC_FAR *pdroidBirth,
/* [in] */ const CDomainRelativeObjId __RPC_FAR *pdroidLast,
/* [out] */ CDomainRelativeObjId __RPC_FAR *pdroidCurrent,
/* [string][out] */ WCHAR __RPC_FAR wsz[ MAX_PATH + 1 ] )
{
return E_NOTIMPL;
}
HRESULT Stubold2_LnkSearchMachine( RPC_BINDING_HANDLE IDL_handle,
ULONG RestrictionsIn,
const CDomainRelativeObjId *pdroidLast,
CDomainRelativeObjId *pdroidNext,
CMachineId *pmcidNext,
TCHAR *tsz )
{
return E_NOTIMPL;
}
HRESULT Stubold_LnkSearchMachine(
/* [in] */ handle_t IDL_handle,
/* [in] */ ULONG Restrictions,
/* [in] */ const CDomainRelativeObjId __RPC_FAR *pdroidLast,
/* [out] */ CDomainRelativeObjId __RPC_FAR *pdroidReferral,
/* [string][out] */ TCHAR __RPC_FAR tsz[ MAX_PATH + 1 ])
{
return E_NOTIMPL;
}
HRESULT
StubLnkGetBackup(
/* [in] */ handle_t IDL_handle,
/* [out][in] */ DWORD __RPC_FAR *pcVolumes,
/* [size_is][size_is][out] */ VolumeMapEntry __RPC_FAR *__RPC_FAR *ppVolumeChanges,
/* [out] */ FILETIME __RPC_FAR *pft)
{
return E_NOTIMPL;
}
HRESULT
StubGetFileTrackingInformation( RPC_BINDING_HANDLE IDL_handle,
/*[in]*/ CDomainRelativeObjId droidCurrent,
/*[in]*/ TrkInfoScope scope,
/*[out]*/ TRK_FILE_TRACKING_INFORMATION_PIPE pipeFileInfo )
{
return E_NOTIMPL;
}
HRESULT
StubGetVolumeTrackingInformation( RPC_BINDING_HANDLE IDL_handle,
/*[in]*/ CVolumeId volid,
/*[in]*/ TrkInfoScope scope,
/*[out]*/ TRK_VOLUME_TRACKING_INFORMATION_PIPE pipeVolInfo )
{
return E_NOTIMPL;
}
HRESULT StubLnkRestartDcSynchronization(
RPC_BINDING_HANDLE IDL_handle
)
{
return E_NOTIMPL;
}
HRESULT StubLnkSetVolumeId(
handle_t IDL_handle,
ULONG iVolume,
const CVolumeId VolId)
{
RPC_STATUS rpcstatus;
RPC_BINDING_HANDLE hBinding = NULL;
HRESULT hr = E_FAIL;
BOOL fImpersonating = FALSE;
hr = GetBinding( s_tszTrkWksRemoteRpcProtocol,
s_tszTrkWksRemoteRpcEndPoint,
&hBinding );
if( FAILED(hr) ) goto Exit;
rpcstatus = RpcImpersonateClient( IDL_handle );
if( STATUS_SUCCESS != rpcstatus )
{
hr = HRESULT_FROM_WIN32( rpcstatus );
goto Exit;
}
fImpersonating = TRUE;
__try
{
hr = LnkSetVolumeId( hBinding, iVolume, VolId );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
hr = GetExceptionCode();
}
Exit:
if( fImpersonating )
{
RpcRevertToSelf();
}
if( NULL != hBinding )
{
RpcBindingFree( &hBinding );
hBinding = NULL;
}
return hr;
}
HRESULT
StubTriggerVolumeClaims( RPC_BINDING_HANDLE IDL_handle,
/*[in]*/ ULONG cVolumes,
/*[in]*/ const CVolumeId *rgvolid )
{
return E_NOTIMPL;
}
HRESULT StubLnkOnRestore(/*[in]*/ RPC_BINDING_HANDLE IDL_handle)
{
return E_NOTIMPL;
}
HRESULT Stubold_LnkCallSvrMessage(
/* [in] */ handle_t IDL_handle,
/* [out][in] */ TRKSVR_MESSAGE_UNION_OLD __RPC_FAR *pMsg)
{
return E_NOTIMPL;
}