92 lines
2.6 KiB
NASM
92 lines
2.6 KiB
NASM
page ,132
|
|
title libentry - Windows dynamic link library entry routine
|
|
;***
|
|
;libentry.asm - Windows dynamic link library entry routine
|
|
;
|
|
; Copyright (c) 1988-1992, Microsoft Corporation. All rights reserved.
|
|
;
|
|
;Purpose:
|
|
;
|
|
; This module generates a code segment called INIT_TEXT.
|
|
; It initialises the local heap if one exists and then calls
|
|
; the C routine LibMain() which should have the form:
|
|
;
|
|
; BOOL FAR PASCAL LibMain(HANDLE hModule,
|
|
; WORD wDataSeg,
|
|
; WORD cbHeap,
|
|
; LPSTR lpszCmdLine);
|
|
;
|
|
; The result of the call to LibMain is returned to Windows.
|
|
; LibMain should return TRUE if it completes initialisation
|
|
; successfully, FALSE if some error occurs.
|
|
;
|
|
; NOTES:
|
|
;
|
|
; (1) This module is not needed if you use the C 7.0 Win 3.x
|
|
; libraries; they perform this operation automatically. You may,
|
|
; however, need this module when using the "No C Runtime" build
|
|
; option.
|
|
;
|
|
; (2) 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 "****".
|
|
;
|
|
;*******************************************************************************
|
|
|
|
extrn LibMain:far ; the C routine to be called
|
|
extrn LocalInit:far ; Windows heap init routine
|
|
extrn __acrtused:abs ; Force in C segment definitions, etc.
|
|
|
|
public LibEntry ; entry point for the DLL
|
|
|
|
;INIT_TEXT segment byte public 'CODE'
|
|
; assume cs:INIT_TEXT
|
|
_TEXT segment byte public 'CODE'
|
|
assume cs:_TEXT
|
|
|
|
LibEntry proc far
|
|
|
|
ifndef _NOTWLO
|
|
; Include the special startup code that makes WIN DLLs
|
|
; compatible with WLO. This code MUST be the first sequence
|
|
; in the DLL startup.
|
|
|
|
; include convdll.inc
|
|
endif
|
|
|
|
push di ; handle of the module instance
|
|
push ds ; library data segment
|
|
push cx ; heap size
|
|
push es ; **** command line ptr (always NULL)
|
|
push si ; ****
|
|
|
|
; if we have some heap then initialise it
|
|
jcxz callc ; jump if no heap specified
|
|
|
|
; call the Windows function LocalInit() to set up the heap
|
|
; LocalInit((LPSTR)start, WORD cbHeap);
|
|
|
|
push ds ; Heap segment
|
|
xor ax,ax
|
|
push ax ; Heap start offset in segment
|
|
push cx ; Heap end offset in segment
|
|
call LocalInit ; try to initialise it
|
|
or ax,ax ; did it do it ok ?
|
|
jz exit ; quit if it failed
|
|
|
|
; invoke the C routine to do any special initialisation
|
|
|
|
callc:
|
|
call LibMain ; invoke the 'C' routine (result in AX)
|
|
|
|
exit:
|
|
ret ; return the result
|
|
|
|
LibEntry endp
|
|
|
|
;INIT_TEXT ends
|
|
_TEXT ends
|
|
|
|
end LibEntry
|