summaryrefslogtreecommitdiffstats
path: root/private/crt32/dllstuff/crtlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/dllstuff/crtlib.c')
-rw-r--r--private/crt32/dllstuff/crtlib.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/private/crt32/dllstuff/crtlib.c b/private/crt32/dllstuff/crtlib.c
new file mode 100644
index 000000000..8a813c580
--- /dev/null
+++ b/private/crt32/dllstuff/crtlib.c
@@ -0,0 +1,258 @@
+#ifdef CRTDLL
+/***
+*crtlib.c - CRT DLL initialization and termination routine (Win32, Dosx32)
+*
+* Copyright (c) 1991-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* This module contains initialization entry point for the CRT DLL in
+* Win32 and Dosx32 environments. It also contains some of the supporting
+* initialization and termination code.
+*
+*Revision History:
+* 08-12-91 GJF Module created. Sort of.
+* 01-17-92 GJF Return exception code value for RTEs corresponding
+* to exceptions.
+* 01-29-92 GJF Support for wildcard expansion in filenames on the
+* command line.
+* 02-14-92 GJF Moved file inheritance stuff to ioinit.c. Call to
+* inherit() is replace by call to _ioinit().
+* 08-26-92 SKS Add _osver, _winver, _winmajor, _winminor
+* 09-04-92 GJF Replaced _CALLTYPE3 with WINAPI.
+* 09-30-92 SRW Call _heap_init before _mtinit
+* 10-19-92 SKS Add "dowildcard" parameter to GetMainArgs()
+* Prepend a second "_" to name since it is internal-only
+* 04-16-93 SKS Change call to _mtdeletelocks to _mtterm. _mtterm
+* calls _mtdeletelocks and also frees up the TLS index.
+* 04-27-93 GJF Removed support for _RT_STACK, _RT_INTDIV,
+* _RT_INVALDISP and _RT_NONCONT.
+* 05-11-93 SKS Change _CRTDLL_INIT to fail loading on failure to
+* initialize/clean up, rather than calling _amsg_exit().
+* 06-03-93 GJF Added __proc_attached flag.
+* 06-07-93 GJF Incorporated SteveWo's code to call LoadLibrary, from
+* crtdll.c.
+* 12-14-93 SKS Add _freeptd(), which frees up the per-thread data
+* maintained by the C run-time library.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <oscalls.h>
+#include <dos.h>
+#include <internal.h>
+#include <os2dll.h>
+#include <process.h>
+#include <rterr.h>
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * flag set iff _CRTDLL_INIT was called with DLL_PROCESS_ATTACH
+ */
+static int __proc_attached = 0;
+
+/*
+ * command line, environment, and a few other globals
+ */
+char *_acmdln; /* points to command line */
+char *_aenvptr; /* points to environment block */
+
+void (_CALLTYPE1 * _aexit_rtn)(int) = _exit; /* RT message return procedure */
+
+static void _CALLTYPE4 inherit(void); /* local function */
+
+
+/***
+*void __GetMainArgs(pargc, pargv, penvp, dowildcard) - get values for args to main()
+*
+*Purpose:
+* This function invokes the command line parsing and copies the args
+* to main back through the passsed pointers. The reason for doing
+* this here, rather than having _CRTDLL_INIT do the work and exporting
+* the __argc and __argv, is to support the linked-in option to have
+* wildcard characters in filename arguments expanded.
+*
+*Entry:
+* int *pargc - pointer to argc
+* char ***pargv - pointer to argv
+* char ***penvp - pointer to envp
+* int dowildcard - flag (true means expand wildcards in cmd line)
+*
+*Exit:
+* No return value. Values for the arguments to main() are copied through
+* the passed pointers.
+*
+*******************************************************************************/
+
+
+void _CALLTYPE1 __GetMainArgs (
+ int *pargc,
+ char ***pargv,
+ char ***penvp,
+ int dowildcard)
+{
+ if ( dowildcard )
+ __setargv(); /* do wildcard expansion after parsing args */
+ else
+ _setargv(); /* NO wildcard expansion; just parse args */
+
+ *pargc = __argc;
+ *pargv = __argv;
+ *penvp = _environ;
+}
+
+
+/***
+*BOOL _CRTDLL_INIT(hDllHandle, dwReason, lpreserved) - C DLL initialization.
+*
+*Purpose:
+* This routine does the C runtime initialization.
+*
+*Entry:
+*
+*Exit:
+*
+*******************************************************************************/
+
+BOOL WINAPI _CRTDLL_INIT(
+ HANDLE hDllHandle,
+ DWORD dwReason,
+ LPVOID lpreserved
+ )
+{
+ char szDllName[ MAX_PATH ];
+
+ if ( dwReason == DLL_PROCESS_ATTACH ) {
+
+ /*
+ * Increment flag indicating process attach notification
+ * has been received.
+ */
+ __proc_attached++;
+
+ /*
+ * Pin ourselves in memory since we dont clean up if we
+ * unload.
+ */
+ if ( !GetModuleFileName( hDllHandle,
+ szDllName,
+ sizeof(szDllName))
+ )
+ {
+ strcpy(szDllName, "CRTDLL");
+ }
+ LoadLibrary(szDllName);
+ }
+ else if ( dwReason == DLL_PROCESS_DETACH ) {
+ /*
+ * if this is a process detach notification, make sure there
+ * has been a prior process attach notification.
+ */
+ if ( __proc_attached > 0 )
+ __proc_attached--;
+ else
+ /* no prior process attach, just return */
+ return FALSE;
+ }
+ else if ( dwReason == DLL_THREAD_DETACH )
+ {
+ _freeptd(NULL); /* free up per-thread CRT data */
+ }
+
+
+ /*
+ * Only do initialization when a client process attaches to
+ * the DLL.
+ */
+ if ( dwReason != DLL_PROCESS_ATTACH ) {
+ /*
+ * if a client process is detaching, make sure minimal
+ * runtime termination is performed and clean up our
+ * 'locks' (i.e., delete critical sections).
+ */
+ if ( dwReason == DLL_PROCESS_DETACH ) {
+
+ if ( _C_Termination_Done == FALSE )
+ _c_exit();
+#ifdef MTHREAD
+ _mtterm(); /* free TLS index, call _mtdeletelocks() */
+#endif
+ }
+
+ return TRUE;
+ }
+
+ _acmdln = (char *)GetCommandLine();
+ _aenvptr = (char *)GetEnvironmentStrings();
+
+ /*
+ * Get the full Win32 version
+ */
+ _osversion = /* OBSOLETE */
+ _osver = GetVersion();
+
+ _winminor = (_osver >> 8) & 0x00FF ;
+ _winmajor = _osver & 0x00FF ;
+ _winver = (_winmajor << 8) + _winminor;
+ _osver = (_osver >> 16) & 0x00FFFF ;
+
+ /* --------- The following block is OBSOLETE --------- */
+
+ /*
+ * unpack base version info
+ */
+ _baseversion = (_osversion & 0xFFFF0000) >> 16;
+ _baseminor = _baseversion & 0x00FF;
+ _basemajor = (_baseversion & 0xFF00) >> 8;
+
+ /*
+ * unpack top-level version info (Windows version)
+ */
+ _osversion &= 0x0000FFFF;
+ _osmajor = _osversion & 0x00FF;
+ _osminor = (_osversion & 0xFF00) >> 8;
+
+ /* --------- The preceding block is OBSOLETE --------- */
+
+ _heap_init(); /* initialize heap */
+#ifdef MTHREAD
+ if(!_mtinit()) /* initialize multi-thread */
+ return FALSE; /* fail DLL load on failure */
+#endif
+ _ioinit(); /* inherit file info */
+ _setenvp(); /* get environ info */
+
+ _cinit(); /* do C data initialize */
+
+ return TRUE;
+}
+
+/***
+*_amsg_exit(rterrnum) - Fast exit fatal errors
+*
+*Purpose:
+* Exit the program with error code of 255 and appropriate error
+* message.
+*
+*Entry:
+* int rterrnum - error message number (amsg_exit only).
+*
+*Exit:
+* Calls exit() (for integer divide-by-0) or _exit() indirectly
+* through _aexit_rtn [amsg_exit].
+* For multi-thread: calls _exit() function
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+void _CALLTYPE1 _amsg_exit (
+ int rterrnum
+ )
+{
+ _FF_MSGBANNER(); /* write run-time error banner */
+ _NMSG_WRITE(rterrnum); /* write message */
+
+ _aexit_rtn(255); /* normally _exit(255) */
+}
+#endif /* CRTDLL */