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;
}