home *** CD-ROM | disk | FTP | other *** search
- PAGE,132
- ;***************************************************************************
- ;*
- ;* DLLENTRY.ASM
- ;*
- ;* DLL Entry code
- ;*
- ;* 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,
- ;* LPSTR lpszCmdLine);
- ;*
- ;* 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.
- ;*
- ;**************************************************************************
-
- 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
-
- cBegin
- push di ;Handle of the module instance
- push ds ;Library data segment
- push cx ;Heap size
- push es ;Command line segment
- push si ;Command line offset
-
- ;** 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
-