重叠的结构和LARGE_INTEGER

dcr*_*rer 3 c windows debugging winapi windbg

我通过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};
Run Code Online (Sandbox Code Playgroud)

创建记录后。可以提示用户读取,写入或删除记录。用户输入的记录存储在recNo中

currentPtr.QuadPart = (LONGLONG)recNo * sizeof(RECORD) + sizeof(HEADER);
ov.Offset = currentPtr.LowPart;
ov.OffsetHigh = currentPtr.HighPart;
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何计算LARGE_INTEGR currentPtr的值吗?什么是联盟?我看了windbg中的示例,但我不明白currentPtr.LowPartcurrentPtr.HighPart的计算方式。下面是使用OVERLAPPED结构调用文件读取操作的示例。

ReadFile (hFile, &record, sizeof (RECORD), &nXfer, &ov)
Run Code Online (Sandbox Code Playgroud)

rcg*_*ldr 5

联合将不同的名称和类型分配给内存中的相同位置。因此,如果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.
Run Code Online (Sandbox Code Playgroud)

OVERLAPPED用于异步I / O。重叠模式下的读或写调用将立即返回,并且在I / O完成时将以信号通知OVERLAPPED结构中指定的事件。

有关OVERLAPPED结构的MSDN文章:

http://msdn.microsoft.com/zh-CN/library/windows/desktop/ms684342(v=vs.85).aspx

在32位模式下,Offset将与指针共享内存,在64位模式下,Offset和OffsetHigh将与Pointer共享内存。Offset和OffsetHigh是输入,而Pointer在内部使用。InternalHigh的名称很差,因为它现在报告已传输的字节数,并且可能会再次更改。内部现在处于状态。