Contoh BIND

Contoh berikut mengilustrasikan memeriksa gambar BIND masuk menggunakan fitur SLI_OPEN ini.

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;  
  

Perhatikan bahwa untuk Microsoft Visual C++ 4.0 atau yang lebih baru, dan untuk Windows Server, prototipe fungsi harus:

VOID WINAPI BindValidation (LUA_VERB_RECORD FAR * pVerb );  
  

Di Windows Server, makro WINAPI sama dengan _STDCall.

Rutin BIND memiliki akses ke blok kontrol aplikasi unit logis (LUA) yang diteruskan ke dalamnya. Rutinitas BIND harus memvalidasi BIND dan menunjukkan kode pengembalian primer dan sekunder Antarmuka Tingkat Sesi (SLI) yang sesuai dalam catatan kata kerja LUA. Selain itu, rutinitas dapat menunjukkan ukuran unit permintaan/respons (RU) primer dan sekunder yang didukung oleh program SLI dengan mengatur byte 10 dan 11 di bidang common.lua_data_ptr (di mana perintah BIND ditunjukkan).

Berikut ini adalah opsi pengkompilasi Visual C++ untuk modul yang berisi panggilan balik:

/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  
  

Berikut ini adalah kode yang dihasilkan untuk panggilan balik:

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  

Berikut ini adalah kode yang dihasilkan oleh SLI untuk memanggil panggilan balik ini:

// (*aSCB->bind_rtn)(sliVCB);  
push    ebp  
call    DWORD PTR [ebx+188]  
// note there is no ADD ESP,4 following the call  

Berikut ini adalah jejak internal klien yang menunjukkan WINSLI mendeteksi panggilan balik validasi ikatan yang disediakan pengguna:

|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  

Berikut ini adalah penelusuran internal klien yang menunjukkan callback validasi pengikatan.

|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  

Berikut ini adalah jejak API untuk menunjukkan kesalahan validasi pengikatan.

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            >