;################################################################ ; ExtDLL header for MASM32 ; ; Author: Ramon ; ; Obs: This header must be included after windows.inc and kernel32.inc ; because it need the prototypes for lstrcpy, lstrcpyn, ; GlobalAlloc and GlobalFree ; ;################################################################ stack_t struct next dd ? text dd ? ; 1 DUP(?) ; this should be the length of string_size stack_t ends .const ; For page showing plug-ins WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8) WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd) NOTIFY_BYE_BYE equ 'x' INST_0 EQU 0 ; $0 INST_1 EQU 1 ; $1 INST_2 EQU 2 ; $2 INST_3 EQU 3 ; $3 INST_4 EQU 4 ; $4 INST_5 EQU 5 ; $5 INST_6 EQU 6 ; $6 INST_7 EQU 7 ; $7 INST_8 EQU 8 ; $8 INST_9 EQU 9 ; $9 INST_R0 EQU 10 ; $R0 INST_R1 EQU 11 ; $R1 INST_R2 EQU 12 ; $R2 INST_R3 EQU 13 ; $R3 INST_R4 EQU 14 ; $R4 INST_R5 EQU 15 ; $R5 INST_R6 EQU 16 ; $R6 INST_R7 EQU 17 ; $R7 INST_R8 EQU 18 ; $R8 INST_R9 EQU 19 ; $R9 INST_CMDLINE EQU 20 ; $CMDLINE INST_INSTDIR EQU 21 ; $INSTDIR INST_OUTDIR EQU 22 ; $OUTDIR INST_EXEDIR EQU 23 ; $EXEDIR INST_LANG EQU 24 ; $LANGUAGE __INST_LAST EQU 25 .data? g_stringsize dd ? g_stacktop dd ? g_variables dd ? m2m MACRO M1, M2 push M2 pop M1 ENDM EXDLL_INIT MACRO m2m g_stringsize, string_size m2m g_stacktop, stacktop m2m g_variables, variables ENDM .code ; utility functions (not required but often useful) popstring proc uses edi pStr:DWORD LOCAL th:DWORD mov edi, g_stacktop cmp edi, 0 jz STACK_ERR mov edi, [edi] cmp edi, 0 jz STACK_ERR ASSUME edi:PTR stack_t invoke lstrcpy, pStr, ADDR [edi].text mov th , edi mov edi, [edi].next mov eax, g_stacktop mov [eax], edi invoke GlobalFree, th ASSUME edi:PTR NOTHING mov eax, 0 ret STACK_ERR: mov eax, 1 ret popstring endp pushstring proc uses edi pStr:DWORD cmp g_stacktop, 0 jz STACK_ERR mov eax, sizeof stack_t add eax, g_stringsize invoke GlobalAlloc, GPTR, eax mov edi, eax assume edi:PTR stack_t invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize mov eax, g_stacktop push DWORD PTR[eax] mov [eax], edi pop eax ;lea edi, [edi].next ; Not needed [edi].next == edi mov DWORD PTR[edi], eax ASSUME edi:PTR NOTHING STACK_ERR: ret pushstring endp getuservariable proc varnum:DWORD .if varnum < 0 || varnum >= __INST_LAST xor eax, eax .else mov eax, varnum imul eax, g_stringsize add eax, g_variables .endif ret getuservariable endp setuservariable proc varnum:DWORD, var:DWORD .if (var != NULL && varnum >= 0 && varnum < __INST_LAST) mov eax, varnum imul eax, g_stringsize add eax, g_variables invoke lstrcpy, eax, var .endif ret setuservariable endp