mirror of https://github.com/lianthony/NT4.0
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
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__
|