Bonjour,
Je suis entrain de m'initier à la programmation de drivers sous Windows XP avec un processeur 32 bits et depuis un petit moment je bute pour récupérer un argument de type POBJECT_ATTRIBUTES au travers la pile.
Ma fonction se présente ainsi:
J'utilise WinDdg et lors de mon jump sur cet extrait de fonction, j'ai un plantage apparemment sur l'opération "mov addrObject, ebx".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 __declspec(naked) my_function() { ULONG addrObject; POBJECT_ATTRIBUTES pObjectAttrib; PUNICODE_STRING pObjectName; __asm { pushad pushfd mov ebp, esp mov ebx, dword ptr [ebp+30h] mov addrObject, ebx } pObjectAttrib = (POBJECT_ATTRIBUTES)addrObject; pObjectName = pObjectAttrib->ObjectName; //DbgPrint("YEP:Passage dans my_function...\n"); __asm { popad popfd } }
En effet en désassemblent, voici le code que j'obtiens:
Le pushad et le pushfd sont manquants car je n'ai pas copié ces instructions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 815fea04 8bec mov ebp,esp 815fea06 8b5d30 mov ebx,dword ptr [ebp+30h] <- ebx contient bien l'argument que je désire récupéré 815fea09 895df8 mov dword ptr [ebp-8],ebx <- ICI la valeur récupérée précédemment n'est pas stockée dans la variable locale??? 815fea0c 8b45f8 mov eax,dword ptr [ebp-8] ss:0010:f65b7d08=00000008 <- Je récupère donc une valeur erronée (celle déjà en place) 815fea0f 8945fc mov dword ptr [ebp-4],eax 815fea12 8b4dfc mov ecx,dword ptr [ebp-4] 815fea15 8b5108 mov edx,dword ptr [ecx+8] 815fea18 8955f4 mov dword ptr [ebp-0Ch],edx 815fea1b 61 popad 815fea1c 9d popfd
lors de l'opération "mov dword ptr [ebp-8],ebx", jeconstate que la valeur stockée à l'adresse de ebp-8 n'est pas modifiée. Je ne comprends pas du tout pourquoi... Si quelqu'un pourrait m'expliquer comment faire?
Merci.
Nicolas
Partager