Exemple BIND
L’exemple suivant illustre la vérification de l’image BIND entrante à l’aide de ces fonctionnalités de SLI_OPEN.
lua_vcb.specific.open.lua_open_extension[0].lua_routine_type =
LUA_ROUTINE_TYPE_BIND;
strcpy(lua_vcb.specific.open.lua_open_extension[0].lua_module_name,
"WINSLI32");
strcpy(lua_vcb.specific.open.lua_open_extension[0].lua_procedure_name,
"BindValidation");
lua_vcb.specific.open.lua_open_extension[1].lua_routine_type =
LUA_ROUTINE_TYPE_END;
Notez que pour Microsoft Visual C++ 4.0 ou version ultérieure, et pour Windows Server, le prototype de fonction doit être :
VOID WINAPI BindValidation (LUA_VERB_RECORD FAR * pVerb );
Sur Windows Server, la macro WINAPI équivaut à _STDCall.
La routine BIND a accès au bloc de contrôle de verbe (VCB) de l’application d’unité logique (LUA) qui lui est passé. La routine BIND doit valider bind et indiquer le code de retour principal et secondaire de l’interface de niveau de session (SLI) approprié dans l’enregistrement de verbe LUA. En outre, la routine peut indiquer les tailles d’unités de requête/de réponse (RU) principales et secondaires prises en charge par le programme SLI en définissant les octets 10 et 11 dans le champ common.lua_data_ptr (où la commande BIND est indiquée).
Voici les options du compilateur Visual C++ pour le module contenant le rappel :
/FA -c -Zle -W3 -WX -Ge -Gy -Gz -Ox -Zd
-DCONDITION_HANDLING -DSTD_CALL
-Di386=1 -D_X86_ -DNT_UP -DWIN32 -DDEVL
-D_DLL -D_MT -DWIN32_SUPPORT
Voici le code généré pour le rappel :
PUBLIC _BindValidation@4
; COMDAT _BindValidation@4
_TEXT SEGMENT
_pVerb$ = 8
_BindValidation@4 PROC NEAR ; COMDAT
// pVerb->common.lua_prim_rc = LUA_STATE_CHECK;
mov eax, DWORD PTR _pVerb$[esp-4]
mov WORD PTR [eax+4], 512 ; 00000200H
ret 4
_BindValidation@4 ENDP
_TEXT ENDS
Voici le code généré par SLI pour appeler ce rappel :
// (*aSCB->bind_rtn)(sliVCB);
push ebp
call DWORD PTR [ebx+188]
// note there is no ADD ESP,4 following the call
Voici la trace interne du client montrant WINSLI détectant le rappel de validation de liaison fourni par l’utilisateur :
|00000157.000000f7 OUDMD Opening User DLL Modules
|00000157.000000f7 OUDMD Opening a Bind Routine
|00000157.000000f7 OUDMD Opening DLL = WINSLI32
|00000157.000000f7 OUDMD Loading Routine = BindValidation
Voici la trace interne du client montrant le rappel de validation de liaison :
|00000157.0000015c CLUAD Calling BIND Routine
|00000157.0000015c CLUAD Return from BIND routine, prc=512
|00000157.0000015c CLUAD Returned With Error From Routine
|00000157.0000015c FrRUI Freeing RUI vcb = 0x14E424
|00000157.0000015c BINDP USER BIND ROUTINE FAILED
Voici une trace d’API pour afficher l’erreur de validation de liaison :
000015c SLI ---------------------------------------------- 11:11:52.28
000015c SLI SLI_OPEN post
000015c SLI SESSION_FAILURE - NEG_RSP_FROM_BIND_ROUTINE
000015c SLI ---- Verb Parameter Block at address 00405150 ----
000015c SLI 52004900 000F0000 00000039 01000000
<R.I........9....>
000015c SLI 00000000 4C553220 20202020 48000000
<....LU2 H...>
000015c SLI 88E01400 00000400 C0904000 F4000000
<h.........@.4...>
000015c SLI 00000000 00000000 00000040 00000000
<...........@....>
000015c SLI 00000000 02000000 0157494E 534C4933
<.........WINSLI3>
000015c SLI 32004269 6E645661 6C696461 74696F6E
<2.BindValidation>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 00000000 00000000
<................>
000015c SLI 00000000 00000000 0000
<.......... >
000015c SLI ---- Data at address 004090C0 ----
000015c SLI 86998584
<fred >