windows-nt/Source/XPSP1/NT/com/ole32/oleprx32/proxy/transmit.hxx
2020-09-26 16:20:57 +08:00

77 lines
2.3 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994.
//
// File: transmit.h
//
// Contents: Function prototypes for STGMEDIUM marshalling.
//
// Functions: STGMEDIUM_to_xmit
// STGMEDIUM_from_xmit
// STGMEDIUM_free_inst
//
// History: May-10-94 ShannonC Created
// May-10-95 Ryszardk wire_marshal changes
// Dec-14-00 JohnDoty Created as a place to put all the
// C++ specific stuff for marshalling.
//
//--------------------------------------------------------------------------
#pragma once
#include "transmit.h"
//+-------------------------------------------------------------------------
//
// class: CUserMarshalInfo
//
// purpose: Simple wrapper for NdrGetUserMarshalInfo.
//
// history: 11-Aug-99 JohnStra Created
//
//+-------------------------------------------------------------------------
class CUserMarshalInfo
{
public:
CUserMarshalInfo( ULONG* pFlags, UCHAR* pBuffer, ULONG Level = 1 )
{
// NdrGetUserMarshalInfo may fail. It shouldn't, but if it does we
// must gracefully handle it.
_RpcStatus = NdrGetUserMarshalInfo( pFlags, Level, &_MarshalInfo );
_pSuppliedBuffer = pBuffer;
if (RPC_S_OK == _RpcStatus)
{
if ( _pSuppliedBuffer < (UCHAR*)_MarshalInfo.Level1.Buffer ||
_pSuppliedBuffer > ((UCHAR*)_MarshalInfo.Level1.Buffer + _MarshalInfo.Level1.BufferSize) )
RpcRaiseException( ERROR_INVALID_USER_BUFFER );
}
}
inline UCHAR* GetBuffer()
{
return( _pSuppliedBuffer );
}
inline ULONG_PTR GetBufferSize()
{
return( (RPC_S_OK == _RpcStatus) ?
(ULONG_PTR) (_MarshalInfo.Level1.BufferSize - (_pSuppliedBuffer - (UCHAR*)_MarshalInfo.Level1.Buffer)) :
(ULONG_PTR) 0x7FFFFFFF );
}
inline IRpcChannelBuffer* GetRpcChannelBuffer()
{
return( (RPC_S_OK == _RpcStatus) ?
_MarshalInfo.Level1.pRpcChannelBuffer : NULL );
}
private:
RPC_STATUS _RpcStatus;
UCHAR* _pSuppliedBuffer;
NDR_USER_MARSHAL_INFO _MarshalInfo;
};