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不同,我将不胜感激.
这就是英特尔文档关于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值匹配.