将itdr存储在x64上

Vas*_*lij 2 c assembly device-driver windows-7

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

.data
  myData dq 0

.code
Function PROC
  sidt myData
  mov rax, myData
  ret
Function ENDP
END
Run Code Online (Sandbox Code Playgroud)

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

r idtr
idtr=fffff80000b95080
Run Code Online (Sandbox Code Playgroud)

但是我的司机显示:

idtr = f80000b950800fff
Run Code Online (Sandbox Code Playgroud)

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

cas*_*nca 5

这就是英特尔文档关于SIDT指令的说法:

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

和:

DEST[0:15] <- IDTR(Limit);
DEST[16:79] <- IDTR(Base);
Run Code Online (Sandbox Code Playgroud)

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