BOOL ReadFile( HANDLE hFile, // handle to file LPVOID lpBuffer, // data buffer DWORD nNumberOfBytesToRead, // number of bytes to read LPDWORD lpNumberOfBytesRead, // number of bytes read LPOVERLAPPED lpOverlapped // overlapped buffer ); BOOL WriteFile( HANDLE hFile, // handle to file LPCVOID lpBuffer, // data buffer DWORD nNumberOfBytesToWrite, // number of bytes to write LPDWORD lpNumberOfBytesWritten, // number of bytes written LPOVERLAPPED lpOverlapped // overlapped buffer ); BOOL FlushFileBuffers( HANDLE hFile // handle to file );
typedef struct _OVERLAPPED { ULONG_PTR Internal; // [out] Error code ULONG_PTR InternalHigh; // [out] Numver of bytes transferred DWORD Offset; // [in] Low 32-bit file offset DWORD OffsetHigh; // [in] High 32-bit file offset HANDLE hEvent; // [in] Event handle or data } OVERLAPPED; #define HasOverlappedIoCompleted(pOverlapped) \ ((pOverlapped)->Internal != STATUS_PENDING)
BOOL GetOverlappedResult( HANDLE hFile, // handle to file, pipe, or device LPOVERLAPPED lpOverlapped, // overlapped structure LPDWORD lpNumberOfBytesTransferred, // bytes transferred BOOL bWait // wait option );
BOOL ReadFileEx( HANDLE hFile, // handle to file LPVOID lpBuffer, // data buffer DWORD nNumberOfBytesToRead, // number of bytes to read LPOVERLAPPED lpOverlapped, // offset LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // completion routine ); BOOL WriteFileEx( HANDLE hFile, // handle to output file LPCVOID lpBuffer, // data buffer DWORD nNumberOfBytesToWrite, // number of bytes to write LPOVERLAPPED lpOverlapped, // overlapped buffer LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // completion routine ); VOID CALLBACK FileIOCompletionRoutine( DWORD dwErrorCode, // completion code DWORD dwNumberOfBytesTransfered, // number of bytes transferred LPOVERLAPPED lpOverlapped // I/O information buffer );
HANDLE CreateIoCompletionPort ( HANDLE FileHandle, // handle to file HANDLE ExistingCompletionPort, // handle to I/O completion port ULONG_PTR CompletionKey, // completion key DWORD NumberOfConcurrentThreads // number of threads to execute concurrently );
HANDLE CreatenewCompletionPort( DWORD dwNumberOfConcurrentThreads ) { return (CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, dwNumberOfConcurrentThreads ));
BOOL AssociateDeviceWithCompletionPort( HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey ) { HANDLE h = CreateIoCompletionPort( hDevice, hCompPort, dwCompKey, 0 ); return ( h == hCompPort ); }
BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, // handle to completion port LPDWORD lpNumberOfBytes, // bytes transferred PULONG_PTR lpCompletionKey, // file completion key LPOVERLAPPED *lpOverlapped, // buffer DWORD dwMilliseconds // optional timeout value );
BOOL PostQueuedCompletionStatus( HANDLE CompletionPort, // handle to an I/O completion port DWORD dwNumberOfBytesTransferred, // bytes transferred ULONG_PTR dwCompletionKey, // completion key LPOVERLAPPED lpOverlapped // overlapped buffer );