用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
1.9 KiB

5 months ago
#include "InStreamWrapper.h"
namespace SevenZip
{
namespace intl
{
InStreamWrapper::InStreamWrapper( const CMyComPtr< IStream >& baseStream )
: m_refCount( 0 )
, m_baseStream( baseStream )
{
}
InStreamWrapper::~InStreamWrapper()
{
}
HRESULT STDMETHODCALLTYPE InStreamWrapper::QueryInterface( REFIID iid, void** ppvObject )
{
if ( iid == __uuidof( IUnknown ) )
{
*ppvObject = reinterpret_cast< IUnknown* >( this );
AddRef();
return S_OK;
}
if ( iid == IID_ISequentialInStream )
{
*ppvObject = static_cast< ISequentialInStream* >( this );
AddRef();
return S_OK;
}
if ( iid == IID_IInStream )
{
*ppvObject = static_cast< IInStream* >( this );
AddRef();
return S_OK;
}
if ( iid == IID_IStreamGetSize )
{
*ppvObject = static_cast< IStreamGetSize* >( this );
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE InStreamWrapper::AddRef()
{
return static_cast< ULONG >( InterlockedIncrement( &m_refCount ) );
}
ULONG STDMETHODCALLTYPE InStreamWrapper::Release()
{
ULONG res = static_cast< ULONG >( InterlockedDecrement( &m_refCount ) );
if ( res == 0 )
{
delete this;
}
return res;
}
STDMETHODIMP InStreamWrapper::Read( void* data, UInt32 size, UInt32* processedSize )
{
ULONG read = 0;
HRESULT hr = m_baseStream->Read( data, size, &read );
if ( processedSize != NULL )
{
*processedSize = read;
}
// Transform S_FALSE to S_OK
return SUCCEEDED( hr ) ? S_OK : hr;
}
STDMETHODIMP InStreamWrapper::Seek( Int64 offset, UInt32 seekOrigin, UInt64* newPosition )
{
LARGE_INTEGER move;
ULARGE_INTEGER newPos;
move.QuadPart = offset;
HRESULT hr = m_baseStream->Seek( move, seekOrigin, &newPos );
if ( newPosition != NULL )
{
*newPosition = newPos.QuadPart;
}
return hr;
}
STDMETHODIMP InStreamWrapper::GetSize( UInt64* size )
{
STATSTG statInfo;
HRESULT hr = m_baseStream->Stat( &statInfo, STATFLAG_NONAME );
if ( SUCCEEDED( hr ) )
{
*size = statInfo.cbSize.QuadPart;
}
return hr;
}
}
}