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:
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
	}
}
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".
En effet en désassemblent, voici le code que j'obtiens:
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
Le pushad et le pushfd sont manquants car je n'ai pas copié ces instructions.

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