181 lines
2.7 KiB
PHP
181 lines
2.7 KiB
PHP
MODULE_TEMPLATE MACRO mod, style, mod_list
|
||
|
||
include cmacros.inc
|
||
include xlib.inc
|
||
|
||
fNOLOADLIBRARY = 0
|
||
IFNB <style>
|
||
IRP astyle,<style>
|
||
IFIDN <astyle>,<NOLOADLIBRARY>
|
||
fNOLOADLIBRARY = 1
|
||
ENDIF
|
||
ENDM
|
||
ENDIF
|
||
|
||
externFP GetProcAddress
|
||
IFE fNOLOADLIBRARY
|
||
externFP LoadLibrary
|
||
externFP SetErrorMode
|
||
IF UNLINK
|
||
externFP FreeLibrary
|
||
ENDIF
|
||
ELSE
|
||
externFP GetModuleHandle
|
||
ENDIF
|
||
|
||
sBegin Data
|
||
globalW __h&mod, 0
|
||
staticW procptr, 0
|
||
sEnd Data
|
||
|
||
sBegin Code
|
||
assumes cs,Code
|
||
assumes ds,Data
|
||
|
||
IF fNOLOADLIBRARY
|
||
IFNB <mod_list>
|
||
__&mod&string label byte
|
||
IRP amod, <mod_list>
|
||
db "&amod&",0
|
||
ENDM
|
||
db 0
|
||
ELSE
|
||
__&mod&string db "&mod&",0
|
||
ENDIF
|
||
ELSE
|
||
__&mod&string db "&mod&",0
|
||
__&mod&file db "&mod&.dll",0
|
||
ENDIF
|
||
|
||
__&mod&dynlink proc far
|
||
public __&mod&dynlink
|
||
|
||
IF UNLINK
|
||
mov ax, procptr
|
||
ENDIF
|
||
mov procptr, bx
|
||
IF UNLINK
|
||
mov bx, cs:[bx].pcData
|
||
mov [bx].pdNext, ax
|
||
ENDIF
|
||
|
||
cmp __h&mod, 0
|
||
jne get_proc
|
||
|
||
farPtr mstr,cs,bx
|
||
IF fNOLOADLIBRARY
|
||
lea bx, __&mod&string
|
||
mod_loop:
|
||
save <bx, si, di, es>
|
||
cCall GetModuleHandle,<mstr>
|
||
or ax, ax
|
||
jz no_link
|
||
ELSE
|
||
mov ax,08000h ;SEM_NOOPENFILEERRORBOX 0x8000
|
||
save <si, di, es>
|
||
cCall SetErrorMode,<ax>
|
||
mov dx, ax ; old error flags to DX
|
||
|
||
lea bx, __&mod&file
|
||
save <dx, si, di, es>
|
||
cCall LoadLibrary,<mstr>
|
||
|
||
xchg dx, ax ; old error flags to AX, LoadLibrary ret to DX
|
||
save <dx, si, di, es>
|
||
cCall SetErrorMode,<ax>
|
||
|
||
cmp dx, 32
|
||
jb no_link
|
||
ENDIF
|
||
mov __h&mod, ax
|
||
|
||
get_proc:
|
||
push bx ;; save ptr into module name list
|
||
push es
|
||
push cs
|
||
pop es
|
||
mov bx, procptr
|
||
farPtr pstr,es,bx
|
||
lea bx, cs:[bx].pcStr
|
||
cmp byte ptr cs:[bx], 0
|
||
jnz @f
|
||
les bx, cs:[bx+1]
|
||
@@:
|
||
mov ax, __h&mod
|
||
save <si, di>
|
||
cCall GetProcAddress,<ax,pstr>
|
||
push ax
|
||
or ax,dx
|
||
pop ax
|
||
pop es
|
||
pop bx ;; restore module name list ptr
|
||
jz no_link
|
||
mov bx, procptr
|
||
mov bx, cs:[bx].pcData
|
||
lea bx, [bx].pdPtr
|
||
mov [bx], ax
|
||
mov [bx+2], dx
|
||
jmp dword ptr [bx]
|
||
|
||
no_link:
|
||
IF fNOLOADLIBRARY
|
||
IFNB <mod_list>
|
||
@@:
|
||
cmp byte ptr cs:[bx], 0
|
||
jz @f
|
||
inc bx
|
||
jmp short @b
|
||
@@:
|
||
inc bx
|
||
cmp byte ptr cs:[bx], 0
|
||
jz @f
|
||
jmp mod_loop
|
||
@@:
|
||
ENDIF
|
||
ENDIF
|
||
xor ax, ax
|
||
xor dx, dx
|
||
mov bx, procptr
|
||
lea bx, cs:[bx].pcRetF
|
||
jmp bx
|
||
|
||
__&mod&dynlink endp
|
||
|
||
IF UNLINK
|
||
__Unlink&mod proc far
|
||
public __Unlink&mod
|
||
|
||
|
||
mov bx, __h&mod
|
||
cmp bx, 0
|
||
jz unlink_done
|
||
mov __h&mod, 0
|
||
|
||
IFE fNOLOADLIBRARY
|
||
cCall FreeLibrary,<bx>
|
||
ENDIF
|
||
|
||
unlink_procs:
|
||
mov bx, procptr
|
||
@@:
|
||
cmp bx, 0
|
||
jz unlink_done
|
||
mov ax, cs:[bx].pcLinkProc
|
||
mov bx, cs:[bx].pcData
|
||
mov word ptr [bx].pdPtr, ax
|
||
mov ax, cs
|
||
mov word ptr [bx].pdPtr+2, ax
|
||
mov bx, [bx].pdNext
|
||
jmp @b
|
||
|
||
unlink_done:
|
||
mov procptr, 0
|
||
ret
|
||
|
||
__Unlink&mod endp
|
||
ENDIF
|
||
|
||
sEnd Code
|
||
end
|
||
ENDM
|
||
|