微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DeviceIoControl(FSCTL_QUERY_ALLOCATED_RANGES) 是否保证返回范围的顺序和无交集?

如何解决DeviceIoControl(FSCTL_QUERY_ALLOCATED_RANGES) 是否保证返回范围的顺序和无交集?

我正在查看复制稀疏文件(到另一个稀疏文件)的代码,它使用 DeviceIoControl(... FSCTL_QUERY_ALLOCATED_RANGES ...) 获取包含实际数据的范围列表。

是否保证结果包含以下范围:

  • 不相交?

  • FileOffset 字段排序?

  • 不是空的吗?

  • FileOffset + Length > FileOffset(即没有环绕uint64_t)?

编辑:

我已经实施了验证,以防操作系统不提供任何这些保证:

// version of std::remove_if that permits coalescing
template<class ForwardIt,class BinaryPredicate>
ForwardIt coalesce_neighbors(ForwardIt first,ForwardIt last,BinaryPredicate p)
{
    for(ForwardIt i = first; i != last; ++i)
        if (!p(*first,*i))
        {
            if (first != i)
                *first = std::move(*i);
            ++first;
        }
    return first;
}


// for given range set do: sort by offset,check for validity,discard empty ones,coalesce intersecting/adjacent ones
FILE_ALLOCATED_RANGE_BUFFER* sanitize_ranges_(FILE_ALLOCATED_RANGE_BUFFER* p,FILE_ALLOCATED_RANGE_BUFFER* p_end)
{
    auto ui = [](LARGE_INTEGER const& v){ return static_cast<ULONGLONG>(v.QuadPart); };

    std::sort(p,p_end,[=](auto& l,auto& r){ return ui(l.FileOffset) < ui(r.FileOffset); });  // sort ranges by offset

    return coalesce_neighbors(p,auto& r){
        if (std::numeric_limits<ULONGLONG>::max() - ui(r.FileOffset) < ui(r.Length))            // no wraparounds allowed
            throw std::logic_error("invalid range (wraparound)");

        if (ui(r.Length) == 0) return true;                                                     // discard empty ranges

        if (&l != &r && ui(l.FileOffset) + ui(l.Length) >= ui(r.FileOffset))                    // 'l.offset <= r.offset' is guranteed due to sorting
        {
            l.Length.QuadPart = ui(r.FileOffset) + ui(r.Length) - ui(l.FileOffset);             // coalesce intersecting/adjacent ranges
            return true;                                                                        // ... and discard neighbor we ate
        }

        return false;
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?