在WIndows上获取64位进程的TEB

在WIndows上获取64位进程的TEB,windows,winapi,win32-process,Windows,Winapi,Win32 Process,我正在尝试获取Windows8中64个远程线程的TEB 根据中的定义,我这样做: sz = sizeof(NTSTATUS) + sizeof(PTEB) + sizeof(HANDLE) + sizeof(HANDLE) + sizeof(ULONG_PTR) + sizeof(LONG) + sizeof(LONG); infoBuff = malloc(sz); stat = NtQueryInformationThread(mainThread, (THREADINFOCLASS

我正在尝试获取Windows8中64个远程线程的TEB

根据中的定义,我这样做:

    sz = sizeof(NTSTATUS) + sizeof(PTEB) + sizeof(HANDLE) + sizeof(HANDLE) + sizeof(ULONG_PTR) + sizeof(LONG) + sizeof(LONG);
infoBuff = malloc(sz);
stat = NtQueryInformationThread(mainThread, (THREADINFOCLASS) 0, infoBuff, sz, NULL);
if (!NT_SUCCESS(stat)) {
    printf ("ERROR (code 0x%x): Cannot get information about about the main TEB. \n", stat);
    return 1;
}
如果我编译32位,sz是0x1C,调用成功返回。 如果我编译64位,sz是0x2C,但调用返回状态0xc000004:status\u INFO\u LENGTH\u MISMATCH

任何想法64位目标上的线程基本信息的正确大小是多少? 或者是另一种获取远程TEB的方法

谢谢,
Alex

结构中存在您不允许的填充,因此出现
状态\u信息\u长度\u不匹配
错误

找出结构大小的最简单、最可靠的方法是让编译器计算出来:

sizeof(THREAD_BASIC_INFORMATION)
无论如何,你可以很容易地用手算出:

Type Name Offset Size ---- ---- ------ ---- NTSTATUS ExitStatus; 0 4 Padding 4 4 PVOID TebBaseAddress; 8 8 CLIENT_ID ClientId; 16 16 KAFFINITY AffinityMask; 32 8 KPRIORITY Priority; 40 4 KPRIORITY BasePriority; 44 4 类型名称偏移量大小 ---- ---- ------ ---- NTSTATUS存在状态;0 4 填充4 PVOID基址;8 8 客户ID ClientId;16 16 亲缘关系;32 8 KPRIORITY优先级;40 4 KPRIORITY-BasePriority;44 4 这将使结构的总大小为48字节,或
0x30


填充是为了确保
TebBaseAddress
是8字节对齐的。

您是否尝试直接在其上执行sizeof?我无法执行sizeof(线程基本信息),因为我在任何地方都找不到结构定义。非常感谢David,它成功了!我无法执行sizeof(线程基本信息),因为我在任何地方都找不到结构定义。您可以将链接到的结构定义粘贴到程序中。另一个有用的提示是,结构的对齐方式等于其成员的最大对齐方式。这意味着您的结构具有对齐8。这意味着它的大小必须是8的倍数。作为一种精神检查很有用。是的,明白了!非常感谢大卫!