New MASM32 header for NSIS plug-ins
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2792 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
aec369dfbc
commit
2894ac8453
1 changed files with 145 additions and 0 deletions
145
Contrib/ExDLL/extdll.inc
Normal file
145
Contrib/ExDLL/extdll.inc
Normal file
|
@ -0,0 +1,145 @@
|
|||
;################################################################
|
||||
; 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
|
Loading…
Add table
Add a link
Reference in a new issue