2025-06-04 03:22:50 +02:00

181 lines
2.7 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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