Leaked source code of windows server 2003
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.
 
 
 
 
 
 

263 lines
5.1 KiB

#include "stdafx.h"
#include "imgutil.h"
#include "resource.h"
#include "csnfstrm.h"
CSniffStream::CSniffStream() :
m_pbBuffer( NULL ),
m_iOffset( 0 ),
m_nBufferSize( 0 ),
m_nValidBytes( 0 ),
m_iNextFreeByte( 0 )
{
}
CSniffStream::~CSniffStream()
{
delete m_pbBuffer;
}
STDMETHODIMP CSniffStream::Clone( IStream** ppStream )
{
if( ppStream == NULL )
{
return( E_POINTER );
}
*ppStream = NULL;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Commit( DWORD dwFlags )
{
(void)dwFlags;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::CopyTo( IStream* pStream, ULARGE_INTEGER nBytes,
ULARGE_INTEGER* pnBytesRead, ULARGE_INTEGER* pnBytesWritten )
{
(void)pStream;
(void)nBytes;
(void)pnBytesRead;
(void)pnBytesWritten;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::LockRegion( ULARGE_INTEGER iOffset,
ULARGE_INTEGER nBytes, DWORD dwLockType )
{
(void)iOffset;
(void)nBytes;
(void)dwLockType;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Read( void* pBuffer, ULONG nBytes,
ULONG* pnBytesRead )
{
ULONG nBytesToRead = 0;
ULONG nBytesLeft;
ULONG nBytesRead;
BYTE* pbBuffer;
HRESULT hResult;
if( pnBytesRead != NULL )
{
*pnBytesRead = 0;
}
if( pBuffer == NULL )
{
return( E_POINTER );
}
if( nBytes == 0 )
{
return( E_INVALIDARG );
}
pbBuffer = LPBYTE( pBuffer );
nBytesLeft = nBytes;
if( m_pbBuffer != NULL )
{
_ASSERTE( m_nValidBytes > 0 );
nBytesToRead = min( nBytesLeft, m_nValidBytes );
memcpy( pbBuffer, &m_pbBuffer[m_iOffset], nBytesToRead );
nBytesLeft -= nBytesToRead;
if( pnBytesRead != NULL )
{
*pnBytesRead += nBytesToRead;
}
m_nValidBytes -= nBytesToRead;
pbBuffer += nBytesToRead;
m_iOffset += nBytesToRead;
if( m_nValidBytes == 0 )
{
delete m_pbBuffer;
m_pbBuffer = NULL;
m_nValidBytes = 0;
m_iNextFreeByte = 0;
m_iOffset = 0;
m_nBufferSize = 0;
}
}
if( nBytesLeft == 0 )
{
return( S_OK );
}
_ASSERTE( m_pbBuffer == NULL );
hResult = m_pStream->Read( pbBuffer, nBytesLeft, &nBytesRead );
if( hResult == S_OK && pnBytesRead != NULL )
{
*pnBytesRead += nBytesRead;
}
return( hResult );
}
STDMETHODIMP CSniffStream::Revert()
{
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Seek( LARGE_INTEGER nDisplacement, DWORD dwOrigin,
ULARGE_INTEGER* piNewPosition )
{
(void)nDisplacement;
(void)dwOrigin;
(void)piNewPosition;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::SetSize( ULARGE_INTEGER nNewSize )
{
(void)nNewSize;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Stat( STATSTG* pStatStg, DWORD dwFlags )
{
(void)pStatStg;
(void)dwFlags;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::UnlockRegion( ULARGE_INTEGER iOffset,
ULARGE_INTEGER nBytes, DWORD dwLockType )
{
(void)iOffset;
(void)nBytes;
(void)dwLockType;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Write( const void* pBuffer, ULONG nBytes,
ULONG* pnBytesWritten )
{
(void)pBuffer;
(void)nBytes;
(void)pnBytesWritten;
return( E_NOTIMPL );
}
STDMETHODIMP CSniffStream::Init( IStream* pStream )
{
if( pStream == NULL )
{
return( E_INVALIDARG );
}
m_pStream = pStream;
return( S_OK );
}
STDMETHODIMP CSniffStream::Peek( void* pBuffer, ULONG nBytes,
ULONG* pnBytesRead )
{
BYTE* pbNewBuffer;
HRESULT hResult;
ULONG nBytesToRead;
ULONG nBytesRead;
if( pnBytesRead != NULL )
{
*pnBytesRead = 0;
}
if( pBuffer == NULL )
{
return( E_POINTER );
}
if( nBytes == 0 )
{
return( E_INVALIDARG );
}
hResult = S_OK;
if( nBytes > m_nValidBytes )
{
// We have to read from the stream
if( nBytes > (m_nBufferSize-m_iOffset) )
{
// We need more buffer space
pbNewBuffer = new BYTE[nBytes];
if( pbNewBuffer == NULL )
{
return( E_OUTOFMEMORY );
}
if( m_pbBuffer != NULL )
{
memcpy( pbNewBuffer, &m_pbBuffer[m_iOffset], m_nValidBytes );
}
delete m_pbBuffer;
m_pbBuffer = pbNewBuffer;
m_nBufferSize = nBytes;
m_iOffset = 0;
m_iNextFreeByte = m_nValidBytes;
}
hResult = m_pStream->Read( &m_pbBuffer[m_iNextFreeByte],
nBytes-m_nValidBytes, &nBytesRead );
m_iNextFreeByte += nBytesRead;
m_nValidBytes += nBytesRead;
}
// Copy as much as we can from our buffer
nBytesToRead = min( nBytes, m_nValidBytes );
if( nBytesToRead > 0 )
{
memcpy( pBuffer, &m_pbBuffer[m_iOffset], nBytesToRead );
if( pnBytesRead != NULL )
{
*pnBytesRead += nBytesToRead;
}
}
if( nBytesToRead == nBytes )
{
return( S_OK );
}
else
{
return( hResult );
}
}