|
1 ;################################################################ |
|
2 ; ExtDLL header for MASM32 |
|
3 ; |
|
4 ; Author: Ramon |
|
5 ; |
|
6 ; Obs: This header must be included after windows.inc and kernel32.inc |
|
7 ; because it need the prototypes for lstrcpy, lstrcpyn, |
|
8 ; GlobalAlloc and GlobalFree |
|
9 ; |
|
10 ;################################################################ |
|
11 stack_t struct |
|
12 next dd ? |
|
13 text dd ? ; 1 DUP(?) ; this should be the length of string_size |
|
14 stack_t ends |
|
15 |
|
16 .const |
|
17 ; For page showing plug-ins |
|
18 WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8) |
|
19 WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd) |
|
20 NOTIFY_BYE_BYE equ 'x' |
|
21 |
|
22 INST_0 EQU 0 ; $0 |
|
23 INST_1 EQU 1 ; $1 |
|
24 INST_2 EQU 2 ; $2 |
|
25 INST_3 EQU 3 ; $3 |
|
26 INST_4 EQU 4 ; $4 |
|
27 INST_5 EQU 5 ; $5 |
|
28 INST_6 EQU 6 ; $6 |
|
29 INST_7 EQU 7 ; $7 |
|
30 INST_8 EQU 8 ; $8 |
|
31 INST_9 EQU 9 ; $9 |
|
32 INST_R0 EQU 10 ; $R0 |
|
33 INST_R1 EQU 11 ; $R1 |
|
34 INST_R2 EQU 12 ; $R2 |
|
35 INST_R3 EQU 13 ; $R3 |
|
36 INST_R4 EQU 14 ; $R4 |
|
37 INST_R5 EQU 15 ; $R5 |
|
38 INST_R6 EQU 16 ; $R6 |
|
39 INST_R7 EQU 17 ; $R7 |
|
40 INST_R8 EQU 18 ; $R8 |
|
41 INST_R9 EQU 19 ; $R9 |
|
42 INST_CMDLINE EQU 20 ; $CMDLINE |
|
43 INST_INSTDIR EQU 21 ; $INSTDIR |
|
44 INST_OUTDIR EQU 22 ; $OUTDIR |
|
45 INST_EXEDIR EQU 23 ; $EXEDIR |
|
46 INST_LANG EQU 24 ; $LANGUAGE |
|
47 __INST_LAST EQU 25 |
|
48 |
|
49 .data? |
|
50 g_stringsize dd ? |
|
51 g_stacktop dd ? |
|
52 g_variables dd ? |
|
53 |
|
54 m2m MACRO M1, M2 |
|
55 push M2 |
|
56 pop M1 |
|
57 ENDM |
|
58 |
|
59 EXDLL_INIT MACRO |
|
60 m2m g_stringsize, string_size |
|
61 m2m g_stacktop, stacktop |
|
62 m2m g_variables, variables |
|
63 ENDM |
|
64 |
|
65 .code |
|
66 |
|
67 ; utility functions (not required but often useful) |
|
68 popstring proc uses edi pStr:DWORD |
|
69 |
|
70 LOCAL th:DWORD |
|
71 |
|
72 mov edi, g_stacktop |
|
73 cmp edi, 0 |
|
74 jz STACK_ERR |
|
75 mov edi, [edi] |
|
76 cmp edi, 0 |
|
77 jz STACK_ERR |
|
78 |
|
79 ASSUME edi:PTR stack_t |
|
80 invoke lstrcpy, pStr, ADDR [edi].text |
|
81 mov th , edi |
|
82 mov edi, [edi].next |
|
83 mov eax, g_stacktop |
|
84 mov [eax], edi |
|
85 invoke GlobalFree, th |
|
86 ASSUME edi:PTR NOTHING |
|
87 mov eax, 0 |
|
88 ret |
|
89 |
|
90 STACK_ERR: |
|
91 mov eax, 1 |
|
92 ret |
|
93 |
|
94 popstring endp |
|
95 |
|
96 pushstring proc uses edi pStr:DWORD |
|
97 |
|
98 cmp g_stacktop, 0 |
|
99 jz STACK_ERR |
|
100 |
|
101 mov eax, sizeof stack_t |
|
102 add eax, g_stringsize |
|
103 invoke GlobalAlloc, GPTR, eax |
|
104 |
|
105 mov edi, eax |
|
106 assume edi:PTR stack_t |
|
107 |
|
108 invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize |
|
109 mov eax, g_stacktop |
|
110 push DWORD PTR[eax] |
|
111 mov [eax], edi |
|
112 pop eax |
|
113 ;lea edi, [edi].next ; Not needed [edi].next == edi |
|
114 mov DWORD PTR[edi], eax |
|
115 ASSUME edi:PTR NOTHING |
|
116 |
|
117 STACK_ERR: |
|
118 ret |
|
119 |
|
120 pushstring endp |
|
121 |
|
122 getuservariable proc varnum:DWORD |
|
123 |
|
124 .if varnum < 0 || varnum >= __INST_LAST |
|
125 xor eax, eax |
|
126 .else |
|
127 mov eax, varnum |
|
128 imul eax, g_stringsize |
|
129 add eax, g_variables |
|
130 .endif |
|
131 ret |
|
132 |
|
133 getuservariable endp |
|
134 |
|
135 setuservariable proc varnum:DWORD, var:DWORD |
|
136 |
|
137 .if (var != NULL && varnum >= 0 && varnum < __INST_LAST) |
|
138 mov eax, varnum |
|
139 imul eax, g_stringsize |
|
140 add eax, g_variables |
|
141 invoke lstrcpy, eax, var |
|
142 .endif |
|
143 ret |
|
144 |
|
145 setuservariable endp |