kernel/eka/euser/epoc/win32/uc_exe.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/euser/epoc/win32/uc_exe.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,110 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\win32\uc_exe.cpp
+// 
+//
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32wins.h>
+#include <u32exec.h>
+#include <e32svr.h>
+
+#ifdef __VC32__
+#define __FLTUSED
+#endif //__VC32__
+
+// include the static data definitions
+#include "win32crt.h"
+
+// include compiler helpers
+#include "x86hlp.inl"
+
+GLREF_C TInt E32Main();
+
+#ifdef __CW32__
+TBool InitCWRuntime();
+TBool CleanupCWRuntime();
+#endif
+
+void globalDestructorFunc()
+	{
+#ifdef __CW32__
+	CleanupCWRuntime();
+#else
+	destroyStatics(); // this is a macro
+#endif
+	}
+
+extern "C"
+EXPORT_C TInt _E32Startup(TInt aReason, TAny* aInfo)
+//
+// Ordinal 1 - the EPOC executable entrypoint
+//
+	{
+	if (TUint(aReason)<=TUint(KModuleEntryReasonThreadInit))
+		{
+		SStdEpocThreadCreateInfo& cinfo = *(SStdEpocThreadCreateInfo*)aInfo;
+
+#ifdef USE_INSTRUMENTED_HEAP
+		cinfo.iFlags |= ETraceHeapAllocs;
+#elif defined(ENABLE_HEAP_MONITORING)
+		cinfo.iFlags |= ETraceHeapAllocs|EMonitorHeapMemory;
+#endif
+		TInt r = UserHeap::SetupThreadHeap( (aReason!=KModuleEntryReasonProcessInit), cinfo);
+
+		if (r==KErrNone)
+			r = UserSvr::DllSetTls(KGlobalDestructorTlsKey, KDllUid_Special, (TAny*)globalDestructorFunc);
+
+		if (r==KErrNone)
+			{
+			if (aReason==KModuleEntryReasonProcessInit)
+				{
+				// Init statics for implicitly linked DLLs
+				User::InitProcess();
+
+#ifdef __CW32__
+				// Ensure runtime library gets initialised
+				r = InitCWRuntime() ? KErrNone : KErrGeneral;
+#endif
+
+				if (r==KErrNone)
+					{
+					// Init statics for EXE
+					constructStatics();
+
+					r = E32Main();
+					}
+				}
+			else
+				r = (*cinfo.iFunction)(cinfo.iPtr);
+			}
+		User::Exit(r);
+		}
+	if (aReason==KModuleEntryReasonException)
+		{
+		User::HandleException(aInfo);
+		return 0;
+		}
+	User::Invariant();
+	return 0;
+	}
+
+GLDEF_C void __stdcall _E32Bootstrap()
+//
+// Win32 entrypoint, Boot epoc with auto-run
+//
+	{
+	BootEpoc(ETrue);
+	}