--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/emulator.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,277 @@
+// Copyright (c) 1998-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\include\emulator.h
+//
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef __EMULATOR_H__
+#define __EMULATOR_H__
+
+#include <e32def.h>
+#define WIN32_LEAN_AND_MEAN
+#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union
+#include <windows.h>
+#pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union
+
+class TUidType;
+class TProcessCreateInfo;
+
+static const BYTE KWin32SectionName_Symbian[IMAGE_SIZEOF_SHORT_NAME] = {'.','S','Y','M','B','I','A','N'};
+static const BYTE KWin32SectionName_Import[IMAGE_SIZEOF_SHORT_NAME] = {'.','i','d','a','t','a','\0','\0'};
+static const BYTE KWin32SectionName_EpocData[IMAGE_SIZEOF_SHORT_NAME] = {'.','d','a','t','a','\0','\0','\0'};
+static const BYTE KWin32SectionName_EpocBss[IMAGE_SIZEOF_SHORT_NAME] = {'.','b','s','s','\0','\0','\0','\0'};
+static const BYTE KWin32SectionName_Text[IMAGE_SIZEOF_SHORT_NAME] = {'.','t','e','x','t','\0','\0','\0'};
+static const BYTE KWin32SectionName_RData[IMAGE_SIZEOF_SHORT_NAME] = {'.','r','d','a','t','a','\0','\0'};
+static const BYTE KWin32SectionName_NmdExpData[IMAGE_SIZEOF_SHORT_NAME] = {'.','e','x','p','d','a','t','a'};
+
+/**
+Emulator utility functions. These APIs should only be used for extensions to emulator
+functionality and are unsupported on non-emulator platforms.
+
+@publishedPartner
+@released
+*/
+struct Emulator
+ {
+public:
+
+ /**
+ Declares a function pointer to TLock.
+
+ @see TLock.
+ */
+ typedef void (*TLockFunc)();
+
+ /**
+ Declares a function pointer to Win32SEHException.
+
+ @see Win32SEHException.
+ */
+ typedef DWORD (*TExceptionFunc)(EXCEPTION_RECORD* aException, CONTEXT* aContext);
+
+ /**
+ A structure which packs parameters to be inintialized.
+ */
+ struct SInit
+ {
+ TUint iCodePage;
+ TLockFunc iLock;
+ TLockFunc iUnlock;
+ TLockFunc iEscape;
+ TLockFunc iReenter;
+ TExceptionFunc iException;
+ };
+
+ /**
+ A structure which handles the global lock for host interaction.
+ */
+ struct TLock
+ {
+
+ /**
+ Constructor which calls the Emulator::Lock() function.
+
+ @see Emulator::Lock().
+ */
+ inline TLock()
+ {Emulator::Lock();}
+
+ /**
+ Destructor which calls the Emulator::Unlock() function.
+
+ @see Emulator::Unlock().
+ */
+ inline ~TLock()
+ {Emulator::Unlock();}
+ };
+
+ /**
+ A structure which handles current thread by taking in or out of the emulator scheduling model.
+ */
+ struct TEscape
+ {
+
+ /**
+ Constructor which calls the Emulator::Escape() function.
+
+ @see Emulator::Escape().
+ */
+ inline TEscape()
+ {Emulator::Escape();}
+
+ /**
+ Destructor which calls the Emulator::Reenter() function.
+
+ @see Emulator::Reenter().
+ */
+ inline ~TEscape()
+ {Emulator::Reenter();}
+ };
+#define __LOCK_HOST Emulator::TLock __lock
+#define __ESCAPE_HOST Emulator::TEscape __escape
+public:
+
+ IMPORT_C static void Init(const SInit& aInit);
+//
+ IMPORT_C static void Lock();
+ IMPORT_C static void Unlock();
+ IMPORT_C static void Escape();
+ IMPORT_C static void Reenter();
+//
+ IMPORT_C static DWORD Win32SEHException(EXCEPTION_RECORD* aException, CONTEXT* aContext);
+//
+ IMPORT_C static TInt LastError();
+ IMPORT_C static BOOL CreateDirectory(LPCTSTR, LPSECURITY_ATTRIBUTES);
+ IMPORT_C static BOOL CreateAllDirectories(LPCSTR);
+ IMPORT_C static HANDLE CreateFile(LPCTSTR ,DWORD ,DWORD ,LPSECURITY_ATTRIBUTES ,DWORD ,DWORD ,HANDLE);
+ IMPORT_C static BOOL DeleteFile(LPCTSTR);
+ IMPORT_C static HANDLE FindFirstFile(LPCTSTR ,LPWIN32_FIND_DATA);
+ IMPORT_C static BOOL FindNextFile(HANDLE ,LPWIN32_FIND_DATA);
+ IMPORT_C static BOOL GetDiskFreeSpace(LPCTSTR ,LPDWORD ,LPDWORD ,LPDWORD ,LPDWORD);
+ IMPORT_C static DWORD GetFileAttributes(LPCTSTR);
+ IMPORT_C static HMODULE GetModuleHandle(LPCTSTR);
+ IMPORT_C static DWORD GetCurrentDirectory(DWORD ,LPTSTR);
+ IMPORT_C static DWORD GetTempPath(DWORD ,LPTSTR);
+ IMPORT_C static BOOL GetVolumeInformation(LPCTSTR ,LPTSTR ,DWORD ,LPDWORD ,LPDWORD ,LPDWORD ,LPTSTR,DWORD);
+ IMPORT_C static HMODULE LoadLibrary(LPCTSTR);
+ IMPORT_C static BOOL FreeLibrary(HMODULE);
+ IMPORT_C static BOOL MoveFile(LPCTSTR ,LPCTSTR);
+ IMPORT_C static BOOL CopyFile(LPCTSTR ,LPCTSTR, BOOL);
+ IMPORT_C static VOID OutputDebugString(LPCTSTR);
+ IMPORT_C static BOOL RemoveDirectory(LPCTSTR);
+ IMPORT_C static BOOL SetFileAttributes(LPCTSTR ,DWORD);
+ IMPORT_C static BOOL SetVolumeLabel(LPCTSTR ,LPCTSTR);
+ IMPORT_C static FARPROC GetProcAddress(HMODULE, LPCSTR);
+ IMPORT_C static DWORD GetModuleFileName(HMODULE hModule, LPWSTR lpFilename);
+public:
+
+ /**
+ A class which holds a loaded module of the file system.
+ */
+ class TModule
+ {
+ public:
+
+ /**
+ Constructor which sets the handles of loaded module to current instance of the application.
+
+ @param aModule A handle to the current instance of the application.
+ */
+ inline TModule(HINSTANCE aModule)
+ :iModule(aModule), iBase(aModule)
+ {}
+
+ IMPORT_C TModule(LPCSTR aModuleName);
+
+ /**
+ Checks the validity of the loaded module.
+
+ @return TRUE, if the function succeeds
+ FALSE, if the function fails
+ */
+ inline TBool IsValid() const
+ {return iBase!=NULL;}
+
+ /**
+ Relocates the address of the loaded module by appending aRawVirtualAddress to the handle of loaded module.
+
+ @param aRawVirtualAddress Contains the address of the first byte of the section when loaded into
+ memory, relative to the image base. For object files, this is the
+ address of the first byte before relocation is applied.
+
+ @return Returns the actual address of the handle.
+ */
+ inline const TAny* Translate(TInt32 aRawVirtualAddress) const
+ {return (const TUint8*)iBase + aRawVirtualAddress;}
+
+
+ IMPORT_C void GetUids(TUidType& aType) const;
+ IMPORT_C void GetInfo(TProcessCreateInfo& aInfo) const;
+ public:
+
+ /**
+ Default constructor which sets the handles of loaded module or mapped file image to the default handle.
+ */
+ inline TModule()
+ :iModule(0), iBase(0)
+ {}
+
+ /**
+ Checks whether the current module is a loaded module, or just a mapped file image.
+
+ @return TRUE, if the current module is a loaded module
+ FALSE, if the current module is a mapped image
+ */
+ TBool IsLoaded() const // Is this a loaded module, or just a mapped file image.
+ {return iModule != 0;}
+
+ IMPORT_C const IMAGE_NT_HEADERS32* NtHeader() const;
+
+ /**
+ Passes the handle of a loaded module to the calling module.
+
+ @return Returns a handle of a loaded module.
+ */
+ const TAny* Base() const
+ {return iBase;}
+
+ IMPORT_C const IMAGE_SECTION_HEADER* SectionHeader(const BYTE aSection[]) const;
+ IMPORT_C const TAny* Section(const BYTE aSection[]) const;
+ IMPORT_C const IMAGE_IMPORT_DESCRIPTOR* Imports() const;
+ public:
+
+ /**
+ A handle to a loaded module.
+ */
+ HMODULE iModule;
+
+ /**
+ A handle to a loaded module for the mapped view.
+ */
+ const TAny* iBase;
+ };
+
+ /**
+ A class which holds a mapped image of the file system.
+ */
+ class RImageFile : public TModule
+ {
+ public:
+
+ /**
+ Constructor which sets the handle of the mapped image file to default handle.
+ */
+ inline RImageFile()
+ : iMapping(0)
+ {}
+
+ IMPORT_C TInt Open(LPCTSTR aImageFile);
+ IMPORT_C void Close();
+ private:
+
+ /**
+ A handle to the mapped image file.
+ */
+ HANDLE iMapping;
+ };
+ };
+
+
+#endif