J'écris une fonction d'assemblage à appeler à partir de C qui appellera l'instruction machine sidt
avec une adresse mémoire transmise à la fonction C. De mon analyse du code produit par MSVC10, j'ai construit le code suivant (syntaxe yasm):Accès aux paramètres transmis sur la pile dans une fonction ASM
SECTION .data
SECTION .text
GLOBAL _sidtLoad
_sidtLoad:
push ebp
mov ebp,esp
sub esp,0C0h
push ebx
push esi
push edi
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
sidt [ebp+8]
pop edi
pop esi
pop ebx
add esp,0C0h
cmp ebp,esp
mov esp,ebp
pop ebp
ret
Voici la signature de la fonction C:
void sidtLoad (void* mem);
Pour autant que je peux voir tout devrait travail, j'ai même vérifié l'adresse mémoire transmise à la fonction et ai vu qu'elle correspond à l'adresse stockée à [ebp + 8] (les octets sont inversés, ce qui je suppose est le résultat de l'endianness et devrait être géré par la machine) . J'ai essayé d'autres arguments pour l'instruction sidt
, comme [ebp + 12], [ebp + 4], [ebp-8] etc. mais pas de chance.
P.S J'écris ceci dans un module d'assemblage externe afin de contourner le manque d'assemblage en ligne lorsque je cible x64 en utilisant MSVC10. Cependant, cette fonction/programme d'assemblage particulier est exécuté en tant que x86, juste pour que je puisse comprendre tout le processus.
P.P.S Je n'utilise pas le __sidt
intrinsèque que le Kit de pilotes Windows (WDK) ne semble pas le prendre en charge. Ou au moins je ne peux pas le faire fonctionner avec ça!
Courez-vous en mode utilisateur ou en mode noyau? La manipulation directe de l'IDT n'est définitivement pas supportée par Windows - qu'essayez-vous de faire? – Michael
L'instruction sidt stocke simplement les données de l'IDT dans l'adresse spécifiée. J'ai initialisé une structure contenant les membres corrects et passe son adresse à la fonction sidtLoad(). Je veux simplement remplir la structure avec les informations IDT et l'imprimer. Cela fonctionne très bien si j'utilise inline asm pour appeler l'instruction sidt, donc je ne pense pas que ce soit un problème d'accès à la sécurité. –