2010-11-02 24 views
2

j'ai essayé d'obtenir l'adresse IDT dans mon chauffeur, j'ai fait fonction asm qui retourne ce idtr contient:magasin ITDR sur x64

.data 
    myData dq 0 

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

Mais l'adresse que je reçois est bizarre, par exemple dans windbg:

r idtr 
idtr=fffff80000b95080 

Cependant, mon pilote montre:

idtr = f80000b950800fff 

J'ai lu que sur x64 IDTR contient l'adresse de base 64 bits de IDT t capable. J'apprécierais que quelqu'un m'explique pourquoi ma sortie n'est pas la même que celle de WinDbg.

Répondre

5

C'est ce que les Intel docs disent l'instruction SIDT:

En mode 64 bits, la taille d'opérande est fixé à 8 + 2 octets. L'instruction stocke des valeurs limites de base de 8 octets et de 2 octets.

et:

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

Cela signifie votre variable myData doit être de 10 octets, et les instructions stocke la limite dans les 2 premiers octets et l'adresse de base dans les 8 prochains octets. Cela explique également pourquoi votre valeur correspond à la valeur de WinDbg après les premiers ffff octets.

+0

Donc je ne devrais pas retourner cette valeur, mais passer la structure appropriée à cette fonction et remplir correctement avec la limite et la base? Merci pour votre réponse. – Vasilij

+0

@Vasilij: Oui, vous pouvez passer l'adresse d'une structure qui contient 10 octets (2 + 8) et 'SIDT' remplira les valeurs correctement. – casablanca