84 lines
2.7 KiB
NASM
84 lines
2.7 KiB
NASM
PAGE,132
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;
|
||
; LIBENTRY.ASM
|
||
;
|
||
; Windows dynamic link library entry routine
|
||
;
|
||
; This module generates a code segment called INIT_TEXT.
|
||
; It initializes the local heap if one exists and then calls
|
||
; the C routine LibMain() which should have the form:
|
||
; BOOL FAR PASCAL LibMain(HANDLE hInstance,
|
||
; WORD wDataSeg,
|
||
; WORD cbHeap,
|
||
; DWORD ignore); /* Always NULL - ignore */
|
||
;
|
||
; The result of the call to LibMain is returned to Windows.
|
||
; The C routine should return TRUE if it completes initialization
|
||
; successfully, FALSE if some error occurs.
|
||
;
|
||
; Note - The last parameter to LibMain is included for compatibility
|
||
; reasons. Applications that wish to modify this file and remove the
|
||
; parameter from LibMain may do so by simply removing the two
|
||
; "push" instructions below marked with "****".
|
||
;
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
||
include cmacros.inc
|
||
|
||
externFP <LibMain> ; the C routine to be called
|
||
|
||
createSeg INIT_TEXT, INIT_TEXT, BYTE, PUBLIC, CODE
|
||
sBegin INIT_TEXT
|
||
assumes CS,INIT_TEXT
|
||
|
||
?PLM=0 ; 'C'naming
|
||
;externA <_acrtused> ; ensures that Win DLL startup code is linked
|
||
|
||
?PLM=1 ; 'PASCAL' naming
|
||
externFP <LocalInit> ; Windows heap init routine
|
||
|
||
cProc LibEntry, <PUBLIC,FAR> ; entry point into DLL
|
||
|
||
include CONVDLL.INC
|
||
|
||
cBegin
|
||
push di ; handle of the module instance
|
||
push ds ; library data segment
|
||
push cx ; heap size
|
||
push es ; Always NULL **** May remove (see above)
|
||
push si ; Always NULL **** May remove (see above)
|
||
|
||
; if we have some heap then initialize it
|
||
jcxz callc ; jump if no heap specified
|
||
|
||
; call the Windows function LocalInit() to set up the heap
|
||
; LocalInit((LPSTR)start, WORD cbHeap);
|
||
|
||
xor ax,ax
|
||
cCall LocalInit <ds, ax, cx>
|
||
or ax,ax ; did it do it ok ?
|
||
jz error ; quit if it failed
|
||
|
||
; invoke the C routine to do any special initialization
|
||
|
||
callc:
|
||
call LibMain ; invoke the 'C' routine (result in AX)
|
||
jmp short exit ; LibMain is responsible for stack clean up
|
||
|
||
error:
|
||
pop si ; clean up stack on a LocalInit error
|
||
pop es
|
||
pop cx
|
||
pop ds
|
||
pop di
|
||
|
||
exit:
|
||
|
||
cEnd
|
||
|
||
sEnd INIT_TEXT
|
||
|
||
end LibEntry
|
||
|