【问题标题】:store itdr on x64将 itdr 存储在 x64 上
【发布时间】:2011-05-03 17:25:42
【问题描述】:

我试图在我的驱动程序中获取 idt 地址,我在 asm 中创建了一个函数,它返回 idtr 包含的内容:

.data
  myData dq 0

.code
Function PROC
  sidt myData
  mov rax, myData
  ret
Function ENDP
END

但我得到的地址很奇怪,例如在windbg中:

r idtr
idtr=fffff80000b95080

但是我的司机显示:

idtr = f80000b950800fff

我在 x64 上读到 IDTR 包含 IDT 表的 64 位基地址。如果有人解释为什么我的输出与 WinDbg 不同,我将不胜感激。

【问题讨论】:

    标签: c assembly windows-7 device-driver


    【解决方案1】:

    这是英特尔文档对 SIDT 指令的评价:

    在 64 位模式下,操作数大小固定为 8+2 字节。该指令存储 8 字节基值和 2 字节限制值。

    和:

    DEST[0:15] <- IDTR(Limit);
    DEST[16:79] <- IDTR(Base);
    

    这意味着您的 myData 变量需要 10 个字节长,并且指令将限制存储在前 2 个字节中,基地址存储在接下来的 8 个字节中。这也解释了为什么您的值在第一个 ffff 字节之后与 WinDbg 的值匹配。

    【讨论】:

    • 所以我不应该返回这个值,而是将适当的结构传递给这个函数并正确填充limit和Base?感谢您的回答。
    • @Vasilij:是的,您可以传递包含 10 个字节 (2+8) 的结构的地址,SIDT 将正确填写这些值。
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2020-01-19
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多