/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: Abstract: History: --*/ #include "precomp.h" #include #include #include #include #include "rpcctx.h" HRESULT RpcResToWmiRes( RPC_STATUS stat, HRESULT hrDefault ) { // // override the default error code here if a more specific one can be // determined // switch( stat ) { case EPT_S_NOT_REGISTERED : return WMIMSG_E_TARGETNOTLISTENING; case ERROR_ACCESS_DENIED : return WBEM_E_ACCESS_DENIED; }; return hrDefault == S_OK ? HRESULT_FROM_WIN32(stat) : hrDefault; } /******************************************************/ /* MIDL allocate and free */ /******************************************************/ void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len) { return( new BYTE[len] ); } void __RPC_USER midl_user_free(void __RPC_FAR * ptr) { delete [] ptr; } /*************************************************************************** CMsgRpcRcvrCtx ****************************************************************************/ STDMETHODIMP CMsgRpcRcvrCtx::GetTimeSent( SYSTEMTIME* pTime ) { *pTime = *m_pHdr->GetTimeSent(); return S_OK; } STDMETHODIMP CMsgRpcRcvrCtx::GetSendingMachine( WCHAR* awchMachine, ULONG cMachine, ULONG* pcMachine ) { LPCWSTR wszSource = m_pHdr->GetSendingMachine(); *pcMachine = wcslen( wszSource ) + 1; if ( *pcMachine > cMachine ) { return S_FALSE; } wcscpy( awchMachine, wszSource ); return S_OK; } STDMETHODIMP CMsgRpcRcvrCtx::GetTarget( WCHAR* awchTarget, ULONG cTarget, ULONG* pcTarget ) { *pcTarget = 0; return WBEM_E_NOT_SUPPORTED; } STDMETHODIMP CMsgRpcRcvrCtx::IsSenderAuthenticated() { HRESULT hr; DWORD dwAuthn; DWORD dwLevel; RPC_STATUS stat; stat = RpcBindingInqAuthClient( m_hClient, NULL, NULL, &dwLevel, &dwAuthn, NULL ); if ( stat == RPC_S_OK && dwAuthn != RPC_C_AUTHN_NONE && dwLevel >= RPC_C_AUTHN_LEVEL_PKT_INTEGRITY ) { hr = WBEM_S_NO_ERROR; } else { hr = WBEM_S_FALSE; } return hr; } STDMETHODIMP CMsgRpcRcvrCtx::ImpersonateSender() { HRESULT hr; RPC_STATUS stat = RpcImpersonateClient( m_hClient ); if ( stat == RPC_S_OK ) { hr = WBEM_S_NO_ERROR; } else { hr = RpcResToWmiRes( stat, S_OK ); } return hr; } STDMETHODIMP CMsgRpcRcvrCtx::RevertToSelf() { HRESULT hr; RPC_STATUS stat = RpcRevertToSelf(); if ( stat == RPC_S_OK ) { hr = WBEM_S_NO_ERROR; } else { hr = RpcResToWmiRes( stat, S_OK ); } return hr; } STDMETHODIMP CMsgRpcRcvrCtx::GetSenderId( PBYTE pchSenderId, ULONG cSenderId, ULONG* pcSenderId ) { HRESULT hr; RPC_STATUS stat; *pcSenderId = 0; stat = RpcImpersonateClient( m_hClient ); if ( stat == RPC_S_OK ) { HANDLE hToken; if ( OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken) ) { // // use the passed in buffer to get the SID_AND_ATTRIBUTES // DWORD dwLen; if ( GetTokenInformation( hToken, TokenUser, pchSenderId, cSenderId, &dwLen ) ) { // // move the sid to the beginning of the buffer. // PSID pSid = PSID_AND_ATTRIBUTES(pchSenderId)->Sid; *pcSenderId = GetLengthSid( pSid ); memmove( pchSenderId, pSid, *pcSenderId ); hr = WBEM_S_NO_ERROR; } else { DWORD dwRes = GetLastError(); if ( dwRes == ERROR_MORE_DATA ) { *pcSenderId = dwLen; hr = WBEM_S_FALSE; } else { hr = WMIMSG_E_AUTHFAILURE; } } CloseHandle( hToken ); } else { hr = WMIMSG_E_AUTHFAILURE; } RpcRevertToSelf(); } else { hr = RpcResToWmiRes( stat, S_OK ); } return hr; }