Source code

Revision control

Copy as Markdown

Other Tools

;################################################################↩
; 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↩