重叠结构和 LARGE_INTEGER
OVERLAPPED STRUCTURES and LARGE_INTEGER
我正在完成 Windows 系统编程中的练习,但我没有完全理解 LARGE_INTEGER 和 OVERLAPPED 结构。例如,我在 main 中定义了以下结构。第一个结构用于跟踪记录数。第二个用于记录数据。作者定义并使用两个重叠结构来跟踪记录文件偏移量。
typedef struct _HEADER {
DWORD numRecords;
DWORD numNonEmptyRecords;
} HEADER; /* 8bytes */
typedef struct _RECORD {
DWORD referenceCount;
SYSTEMTIME recordCreationTime;
SYSTEMTIME recordLastRefernceTime;
SYSTEMTIME recordUpdateTime;
TCHAR dataString[STRING_SIZE];
} RECORD; /* 308bytes */
LARGE_INTEGER currentPtr;
OVERLAPPED ov = {0, 0, 0, 0, NULL}, ovZero = {0, 0, 0, 0, NULL};
创建记录后。可以提示用户读取、写入或删除 一条记录。用户输入的记录存储在recNo.
currentPtr.QuadPart = (LONGLONG)recNo * sizeof(RECORD) + sizeof(HEADER);
ov.Offset = currentPtr.LowPart;
ov.OffsetHigh = currentPtr.HighPart;
谁能解释一下 LARGE_INTEGR currentPtr 的值是如何计算的? 什么是联盟?我看过 windbg 中的示例,我不明白 currentPtr.LowPart 和 currentPtr.HighPart 是如何计算的。以下是使用 OVERLAPPED 结构调用文件读取操作的示例。
ReadFile (hFile, &record, sizeof (RECORD), &nXfer, &ov)
联合为内存中的同一位置赋予不同的名称和类型。因此,如果 LARGE_INTEGER 联合存储在位置 0x1000,并且由于 X86 是小端:
LARGE_INTEGER.QuadPart is 64 bit integer at 0x1000
LARGE_INTEGER.LowPart is the lower 32 bits of the 64 bit integer at 0x1000.
LARGE_INTEGER.HighPart is the upper 32 bits of the 64 bit integer at 0x1004.
OVERLAPPED 用于异步I/O。重叠模式下的读取或写入调用将立即 return,OVERLAPPED 结构中指定的事件将在 I/O 完成时发出信号。
OVERLAPPED 结构的 MSDN 文章:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684342(v=vs.85).aspx
32位模式下Offset与Pointer共享内存,64位模式下Offset和OffsetHigh与Pointer共享内存。 Offset 和 OffsetHigh 是输入,而 Pointer 是内部使用的。 InternalHigh 命名不当,因为它现在报告传输的字节数,并且可能会再次更改。内部现在是一种状态。
我正在完成 Windows 系统编程中的练习,但我没有完全理解 LARGE_INTEGER 和 OVERLAPPED 结构。例如,我在 main 中定义了以下结构。第一个结构用于跟踪记录数。第二个用于记录数据。作者定义并使用两个重叠结构来跟踪记录文件偏移量。
typedef struct _HEADER {
DWORD numRecords;
DWORD numNonEmptyRecords;
} HEADER; /* 8bytes */
typedef struct _RECORD {
DWORD referenceCount;
SYSTEMTIME recordCreationTime;
SYSTEMTIME recordLastRefernceTime;
SYSTEMTIME recordUpdateTime;
TCHAR dataString[STRING_SIZE];
} RECORD; /* 308bytes */
LARGE_INTEGER currentPtr;
OVERLAPPED ov = {0, 0, 0, 0, NULL}, ovZero = {0, 0, 0, 0, NULL};
创建记录后。可以提示用户读取、写入或删除 一条记录。用户输入的记录存储在recNo.
currentPtr.QuadPart = (LONGLONG)recNo * sizeof(RECORD) + sizeof(HEADER);
ov.Offset = currentPtr.LowPart;
ov.OffsetHigh = currentPtr.HighPart;
谁能解释一下 LARGE_INTEGR currentPtr 的值是如何计算的? 什么是联盟?我看过 windbg 中的示例,我不明白 currentPtr.LowPart 和 currentPtr.HighPart 是如何计算的。以下是使用 OVERLAPPED 结构调用文件读取操作的示例。
ReadFile (hFile, &record, sizeof (RECORD), &nXfer, &ov)
联合为内存中的同一位置赋予不同的名称和类型。因此,如果 LARGE_INTEGER 联合存储在位置 0x1000,并且由于 X86 是小端:
LARGE_INTEGER.QuadPart is 64 bit integer at 0x1000
LARGE_INTEGER.LowPart is the lower 32 bits of the 64 bit integer at 0x1000.
LARGE_INTEGER.HighPart is the upper 32 bits of the 64 bit integer at 0x1004.
OVERLAPPED 用于异步I/O。重叠模式下的读取或写入调用将立即 return,OVERLAPPED 结构中指定的事件将在 I/O 完成时发出信号。
OVERLAPPED 结构的 MSDN 文章:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684342(v=vs.85).aspx
32位模式下Offset与Pointer共享内存,64位模式下Offset和OffsetHigh与Pointer共享内存。 Offset 和 OffsetHigh 是输入,而 Pointer 是内部使用的。 InternalHigh 命名不当,因为它现在报告传输的字节数,并且可能会再次更改。内部现在是一种状态。