首页 > 解决方案 > 了解 OVERLAPPED 结构中的偏移量字段

问题描述

我正在浏览一些使用ReadFile并指定OVERLAPPED类型的代码。

根据我到目前为止阅读其他帖子的理解,这就是我得到的。

如果您想从ReadFile文件的第 8 个字节开始 a ,您可以在传递to之前将Offset变量 of设置OVERLAPPED为 8 并将OffsetHigh变量设置为 0 。这是有道理的。OVERLAPPEDReadFile

现在,如果我们设置OffsetHigh为 1 会发生什么?

标签: c++winapi

解决方案


实际偏移量是一个 64 位整数。Offset字段是低 32 位,字段OffsetHigh是高 32 位。这在文档中有很多说明:

Offset

用户指定的开始 I/O 请求的文件位置的低位部分。

...

OffsetHigh

用户指定的开始 I/O 请求的文件位置的高位部分。

...

和成员Offset一起代表一个 64 位文件位置。它是从文件或类文件设备开始的字节偏移量,由用户指定;系统不会修改这些值。调用进程必须在将结构传递给使用偏移量的函数之前设置此成员,例如or (和相关的)函数。OffsetHighOVERLAPPEDReadFileWriteFile

这种低位/高位的分割是 C 早期的遗留物,当时 64 位整数类型还不普遍(这就是为什么(U)LARGE_INTEGERWin32 API 中甚至存在类似结构的原因)。

所以:

抵消 偏移高 64 位值(十六进制) 64 位值(十进制)
8 0 0x00000000'00000008 8
8 1 0x00000001'00000008 4'294'967'304

推荐阅读