Bool CloseFile(FileHandle& Handle) { HANDLE file=reinterpret_cast<HANDLE>(Handle.GetPointer()); Bool result=static_cast<Bool>(CloseHandle(file) == TRUE); Handle=FileHandle::Zero(); return result; }
UInt64 TellFile(const FileHandle& Handle) { long hi=0, lo; lo=SetFilePointer(reinterpret_cast<HANDLE>(Handle.GetPointer()), 0, &hi, FILE_CURRENT); if (lo!=INVALID_SET_FILE_POINTER) return (static_cast<UInt64>(hi) << 32) + lo; else return 0; }
UInt64 SeekFile(const FileHandle& Handle, const UInt64 Offset, const SeekOrigin::Type Origin) { long hi=static_cast<long>(Offset), lo=Offset>>32; lo=SetFilePointer(reinterpret_cast<HANDLE>(Handle.GetPointer()), lo, &hi, GetNativeSeekOrigin(Origin)); if (lo!=INVALID_SET_FILE_POINTER) return (static_cast<UInt64>(hi) << 32) + lo; else return 0; }
Bool WriteFile(const FileHandle& Handle, const UInt8* Buffer, const UInt64 WriteBytes, UInt64& BytesWritten) { DWORD lowWriteBytes = 0; BOOL result = ::WriteFile(reinterpret_cast<HANDLE>(Handle.GetPointer()), reinterpret_cast<const void*>(Buffer), static_cast<DWORD>(WriteBytes), reinterpret_cast<DWORD*>(&lowWriteBytes), reinterpret_cast<LPOVERLAPPED>(0)) == TRUE; BytesWritten = lowWriteBytes; return result == TRUE; }
Bool ReadFile(const FileHandle& Handle, UInt8* Buffer, const UInt64 ReadBytes, UInt64& BytesRead) { DWORD lowReadBytes=0; BOOL result = ::ReadFile(reinterpret_cast<HANDLE>(Handle.GetPointer()), reinterpret_cast<void*>(Buffer), static_cast<DWORD>(ReadBytes), reinterpret_cast<DWORD*>(&lowReadBytes), reinterpret_cast<LPOVERLAPPED>(0)) == TRUE; BytesRead = lowReadBytes; return result == TRUE; }
MemoryMappingHandle MapFileIntoMemory(const FileHandle& Handle) { MemoryMappingHandle result; HANDLE file=CreateFileMapping(reinterpret_cast<HANDLE>(Handle.GetPointer()), 0, PAGE_READWRITE | SEC_RESERVE, 0, 0, 0); if (file) { FileMapping* fileMapping=new FileMapping; fileMapping->fileMapping=file; fileMapping->data=MapViewOfFile(file, FILE_MAP_WRITE|FILE_MAP_READ, 0, 0, 0); result=MemoryMappingHandle::GenerateFromPointer(fileMapping); } return result; }
Bool FlushFile(const FileHandle& Handle) { return ::FlushFileBuffers(reinterpret_cast<HANDLE>(Handle.GetPointer())) == TRUE; }