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.
 
 
 
 
 
 

191 lines
5.9 KiB

// UnbuffIO.h -- Defines the class CUnbufferedIO
#ifndef __UNBUFFIO_H__
#define __UNBUFFIO_H__
typedef void (*PFNCompletion)(PVOID pvEnvironment, PVOID pvTransaction, UINT uiCompletionCode, UINT cbTransferred);
#ifdef _DEBUG
#define GetBuffer(pcbBuffer) _GetBuffer(pcbBuffer, __FILE__, __LINE__)
#endif //_DEBUG
class CUnbufferedIO
{
friend VOID WINAPI UnbufferedIOCompletionRoutine(DWORD fdwError, DWORD cbTransferred, LPOVERLAPPED lpo);
public:
// Creators --
static CUnbufferedIO *NewTempFile (PSZ pszPath= NULL, BOOL fPersistent= FALSE);
static CUnbufferedIO *OpenExistingFile(PSZ pszFile, BOOL fAllowWrites= FALSE);
static CUnbufferedIO *CreateNewFile (PSZ pszFile, BOOL fOverwriteExistingFile= FALSE);
// Destructor --
~CUnbufferedIO();
// Attributes --
UINT CbSector ();
UINT CbCluster ();
BOOL IsTemporary();
const BYTE *FileName();
const BYTE *FilePath();
BOOL CbFile(PUINT pibFileLow, PUINT pibFileHigh= NULL);
// Buffer Allocation/Deallocation
#ifdef _DEBUG
PVOID _GetBuffer(PUINT pcbBuffer, PSZ pszWhichFile, UINT iWhichLine);
#else // _DEBUG
PVOID GetBuffer(PUINT pcbBuffer);
#endif // _DEBUG
void FreeBuffer(PVOID pvBuffer);
// I/O Transactions --
BOOL EmptyFile(); // True if file size is zero.
// Event based Synchronous/Asynchronous I/O transactions:
void Read (PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb, PUINT puiCompletionCode= NULL, HANDLE hEvent= NULL);
void Write(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb, PUINT puiCompletionCode= NULL, HANDLE hEvent= NULL);
void IOTransaction(BOOL fWrite, PVOID pv, UINT ibFileLow, UINT ibFileHigh,
UINT cb, PUINT puiCompletionCode, HANDLE hEvent
);
// Interfaces for asynchronous I/O with a completion routine:
void SetCompletionRoutine(PFNCompletion pfn);
void Read (PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb, PVOID pvTransaction, PVOID pvEnvironment);
void Write(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb, PVOID pvTransaction, PVOID pvEnvironment);
void StartIOTransaction(BOOL fWrite, PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb,
PVOID pvEnvironment, PVOID pvTransaction
);
// Converting a temporary file into a permanent file:
void MakePermanent(PSZ pszFileName, BOOL fAllowOverwrite= FALSE, int cbSize= -1);
// Mapping into memory space
PVOID MappedImage();
void UnmapImage();
// User interface for out-of-disk conditions.
BOOL AskForDiskSpace();
protected:
private:
enum { SourceDirectory=0, HelpDirectory, WindowsDirectory, PhaseLimit };
BOOL m_fInitialed;
BOOL m_fFileAttached;
HANDLE m_hFile;
UINT m_fTemporary;
UINT m_cbSector;
UINT m_cbCluster;
CRITICAL_SECTION m_cs;
UINT m_cActiveIOTransactions;
UINT m_cWaitingForLull;
HANDLE m_hEventLull;
UINT m_fWaitingForLullEnd;
HANDLE m_hEventLullEnd;
HANDLE m_hMapFile;
PVOID m_pvMemoryImage;
BOOL m_fAlready_Out_of_Space;
PFNCompletion m_pfnCompletion;
char m_szFile[MAX_PATH];
char m_szPath[MAX_PATH];
CUnbufferedIO();
void CUnbufferedIO::Initial();
BOOL SetupFile(PSZ pszPath, PSZ pszFile, HANDLE hFile, BOOL fTemporary);
BOOL GetStatistics();
void BeginLull();
void EndLull();
void BeginTransaction();
void ReleaseTransaction();
void AbortTransaction();
void FinishTransaction();
};
typedef char FILENAMEBUFFER[MAX_PATH + 1];
BOOL FindFile(FILENAMEBUFFER pszFile, BOOL *pfStartEnumeration);
inline UINT CUnbufferedIO::CbSector () { return m_cbSector; }
inline UINT CUnbufferedIO::CbCluster () { return m_cbCluster; }
inline BOOL CUnbufferedIO::IsTemporary() { return m_fTemporary;}
inline const BYTE *CUnbufferedIO::FileName() { return (const BYTE *) m_szFile; }
inline const BYTE *CUnbufferedIO::FilePath() { return (const BYTE *) m_szPath; }
inline void CUnbufferedIO::Read(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb,
PUINT puiCompletionCode, HANDLE hEvent
)
{
IOTransaction(FALSE, pvData, ibFileLow, ibFileHigh, cb, puiCompletionCode, hEvent);
}
inline void CUnbufferedIO::Write(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb,
PUINT puiCompletionCode, HANDLE hEvent
)
{
IOTransaction(TRUE, pvData, ibFileLow, ibFileHigh, cb, puiCompletionCode, hEvent);
}
inline void CUnbufferedIO::SetCompletionRoutine(PFNCompletion pfn)
{
BeginLull();
m_pfnCompletion= pfn;
EndLull();
}
inline void CUnbufferedIO::Read(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb,
PVOID pvTransaction, PVOID pvEnvironment
)
{
StartIOTransaction(FALSE, pvData, ibFileLow, ibFileHigh, cb, pvEnvironment, pvTransaction);
}
inline void CUnbufferedIO::Write(PVOID pvData, UINT ibFileLow, UINT ibFileHigh, UINT cb,
PVOID pvTransaction, PVOID pvEnvironment
)
{
StartIOTransaction(TRUE, pvData, ibFileLow, ibFileHigh, cb, pvEnvironment, pvTransaction);
}
inline BOOL CUnbufferedIO::AskForDiskSpace()
{
return ::AskForDiskSpace((const BYTE *) m_szPath);
}
#endif // __UNBUFFIO_H__