Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

121 lines
2.3 KiB

// IOStream.cpp -- Implementation for class CIOStream
#include "stdafx.h"
#include "IOStream.h"
CIOStream *CIOStream::NewIOStream(CUnbufferedIO *puio)
{
ASSERT(puio);
CIOStream *pios= NULL;
__try
{
pios= New CIOStream;
pios->InitialIOStream(puio);
}
__finally
{
if (_abnormal_termination() && pios)
{
delete pios; pios= NULL;
}
}
return pios;
}
CIOStream::CIOStream()
{
m_cdw = 0;
m_cBlocks = 0;
m_ibFileNextLow = 0;
m_ibFileNextHigh = 0;
}
CIOStream::~CIOStream()
{
if (Writable()) FlushOutput(TRUE);
}
BOOL CIOStream::InitialIOStream(CUnbufferedIO *puio)
{
ASSERT(puio);
if (!InitialIOQueue(puio)) return FALSE;
return TRUE;
}
void CIOStream::AttachStream(BOOL fOut, UINT cdwStream,
UINT ibFileLow, UINT ibFileHigh
)
{
ASSERT(Initialed());
if (Writable()) FlushOutput(TRUE);
ASSERT(fOut || cdwStream);
if (fOut) m_cdw= 0;
else
{
m_cdw = cdwStream;
m_cBlocks = BlocksFor(cdwStream * sizeof(UINT), CbBlockSize());
}
m_ibFileNextLow = ibFileLow;
m_ibFileNextHigh = ibFileHigh;
EnableStream(fOut);
}
BOOL CIOStream::NextFileAddress(PUINT pibFileLow, PUINT pibFileHigh, PUINT pcdw)
{
if (*pcdw > CbBlockSize() / sizeof(UINT))
*pcdw = CbBlockSize() / sizeof(UINT);
ASSERT(!(m_ibFileNextLow % CbBlockSize()));
ASSERT(! m_ibFileNextHigh);
*pibFileLow = m_ibFileNextLow;
*pibFileHigh = m_ibFileNextHigh;
if (Writable())
{
m_cdw += *pcdw;
m_ibFileNextLow += (*pcdw) * sizeof(UINT);
return FALSE;
}
if (!m_cBlocks)
{
*pcdw= 0; return TRUE;
}
if (--m_cBlocks)
{
*pcdw = CbBlockSize() / sizeof(UINT);
m_cdw -= CbBlockSize() / sizeof(UINT);
m_ibFileNextLow += *pcdw * sizeof(UINT);
return FALSE;
}
else // The last block won't necessarily be full.
{
*pcdw= m_cdw; m_cdw= 0;
m_ibFileNextLow += *pcdw * sizeof(UINT);
return TRUE;
}
}
void CIOStream::ReleaseFileBlock(UINT ibFileLow, UINT ibFileHigh)
{
ASSERT(!ibFileHigh);
}