diff -r 000000000000 -r a41df078684a kernel/eka/include/emulator.h --- /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 +#define WIN32_LEAN_AND_MEAN +#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union +#include +#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