Salut,<br><br>Încerc să înţeleg cum funcţionază (sper că funcţionează) codul pentru interceptorul din schiţa din enunţul temei (la Windows):<br><br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">
_asm mov old_stack, ebp<br>_asm add old_stack, 8<br>_asm sub esp, param_size<br>_asm mov new_stack, esp<br><br>RtlCopyMemory(new_stack, old_stack, param_size);<br></blockquote><br>Aici asignăm valoarea registrului ebp în variabila old_stack... presupun că ne-o dă dispatcherul în registrul acela, nu?<br>
Dar de ce mai adunăm 8 bytes la adresa lui după?<br>Şi, mai departe, văd că alocăm memorie pe stivă pentru o nouă stivă de parametrii şi îi copiem acolo. Perfect. <br>Presupun că facem lucrul ăsta pentru ca funcţia veche, f, să aibă imediat pe stivă parametrii. Asta înseamnă că ne bazăm pe compilator să ne pună variabila new_stack fix la marginea stivei, nu? <br>
Şi... cine curăţă stiva după aceea? Din nou, presupunere, funcţia apelată? Dar asta nu înseamnă că şi funcţia noastră trebuie să cureţe stiva pentru parametrii primiţi? Şi nu facem asta...<br>Deci ce se întâmplă, mai exact, cu stiva la ieşire?<br>
<br>Mulţumesc,<br>Florin.<br><br>