#include #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(ptszProtSeq), NULL, const_cast(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; }