【问题标题】:Can I lock a 4GB or larger memory block by calling SetFileIoOverlappedRange multiple times?我可以通过多次调用 SetFileIoOverlappedRange 来锁定 4GB 或更大的内存块吗?
【发布时间】:2016-11-28 20:46:42
【问题描述】:

由于SetFileIoOverlappedRangeLength参数只有ULONG,如何锁定4GB或更大的内存块?

假设我分配了一个连续的 4 GB 内存块用于重叠 I/O 并调用 SetFileIoOverlappedRange 两次,每半个块调用一次。两个调用都返回一个成功(非零)状态码。调用是否相加,导致锁定整个 4 GB 块?还是第二个调用“覆盖”第一个?我怎么知道?

【问题讨论】:

  • documentation指出,“范围与文件句柄关联后,不能解除关联。”
  • @IInspectable 这是否意味着调用是累加的?我该如何检查?谢谢!
  • 与 MapViewOfFile() 中存在的限制相同,视图不能大于 4GB。内核内部的某种结构,不知道它为什么存在。
  • @HansPassant - ZwMapViewOfSection 在 x64 系统上对 4Gb 没有限制
  • @HansPassant 但MapViewOfFile 中的dwNumberOfBytesToMap 被声明为SIZE_T

标签: windows file winapi overlapped-io


【解决方案1】:

假设我分配了一个连续的 4 GB 内存块用于重叠 I/O 并调用 SetFileIoOverlappedRange 两次

我了解该范围适用于 OVERLAPPED 结构,而不适用于数据缓冲区。

(实际上,对于IO_STATUS_BLOCK 结构。参见FileIoStatusBlockRangeInformation。)

您可能不需要或没有 4GB 的 OVERLAPPED 结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多