initial
This commit is contained in:
181
public/wintab/wintabx/xlibmod.inc
Normal file
181
public/wintab/wintabx/xlibmod.inc
Normal file
@ -0,0 +1,181 @@
|
||||
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
|
||||
|
Reference in New Issue
Block a user