--- a/kernel/eka/include/e32ldr.h Wed Dec 23 11:43:31 2009 +0000
+++ b/kernel/eka/include/e32ldr.h Thu Jan 07 13:38:45 2010 +0200
@@ -28,122 +28,26 @@
#include <e32cmn.h>
-const TInt KMaxLibraryEntryPoints=0x100;
-
-//
-// Loader version number.
-//
-const TInt KLoaderMajorVersionNumber=1;
-const TInt KLoaderMinorVersionNumber=0;
-
-//
-// IPC messages to the loader
-//
-enum TLoaderMsg
- {
- ELoadProcess=1,
- ELoadLibrary=2,
- ELoadLogicalDevice=3,
- ELoadPhysicalDevice=4,
- ELoadLocale=5,
- ELoadFileSystem=6,
- EGetInfo=7,
- ELoaderDebugFunction=8,
- ELoadFSExtension=9,
- EGetInfoFromHeader=10,
- ELoadFSPlugin=11,
- ELoaderCancelLazyDllUnload=12,
- ELdrDelete=13,
- ECheckLibraryHash=14,
- ELoadFSProxyDrive=15,
- ELoadCodePage=16,
- EMaxLoaderMsg
- };
-//
-// Loader message arguments:
-// 0 = TLdrInfo
-// 1 = Filename
-// 2 = Command line (process) or path (library)
-//
-class TLdrInfo
- {
-public:
- IMPORT_C TLdrInfo(); // for BC
-public:
- TUidType iRequestedUids;
- TOwnerType iOwnerType;
- TInt iHandle;
- TUint32 iSecureId;
- TUint32 iRequestedVersion;
- TInt iMinStackSize; // Size of new process stack
- };
-
+/**
+ @internalTechnology
-#ifndef __KERNEL_MODE__
-#include <e32std.h>
-//
-// Loader client class
-//
-class RLoader : public RSessionBase
- {
-public:
- IMPORT_C TInt Connect();
- TVersion Version() const;
- TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TOwnerType aType);
- IMPORT_C TInt LoadLibrary(TInt& aHandle, const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
- IMPORT_C TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
- TInt LoadDeviceDriver(const TDesC& aFileName, TInt aDeviceType);
- IMPORT_C TInt DebugFunction(TInt aFunction, TInt a1, TInt a2, TInt a3);
- TInt LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
- TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
- IMPORT_C TInt CancelLazyDllUnload();
- IMPORT_C TInt Delete(const TDesC& aFileName);
- IMPORT_C TInt CheckLibraryHash(const TDesC& aFileName, TBool aValidateHash=EFalse);
- TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TInt aMinStackSize, TOwnerType aType);
-public:
-#ifdef __ARMCC__
- // workaround for possible EDG bug (!!)
- inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
- { return RSessionBase::SendReceive(aFunction, aArgs); }
-#else
- using RSessionBase::SendReceive;
-#endif
- };
-#endif
-
-//
-// Information required to create a new code segment
-//
-enum TCodeSegAttributes
- {
- ECodeSegAttKernel =0x00000001,
- ECodeSegAttGlobal =0x00000002,
- ECodeSegAttFixed =0x00000004,
- ECodeSegAttABIMask =0x00000018, // same values as in image header
- ECodeSegAttCodePaged =0x00000200, // the code seg is demand paged
- ECodeSegAttDataPaged =0x00002000, // the code seg static data is demand paged
- ECodeSegAttHDll =(TInt)0x80000000,// Emulator host file type: 1=DLL, 0=EXE
- ECodeSegAttExpVer =0x40000000, // Filename is explicitly versioned
- ECodeSegAttNmdExpData =0x20000000, // Named symbol export data in code seg
- ECodeSegAttSMPSafe =0x10000000, // code seg and its static dependencies are SMP safe
- ECodeSegAttAddrNotUnique =0x08000000, // run address not globally unique (may overlap other codesegs)
- };
-
-class TBlockMapEntryBase
-/**
Where sections of a file are located on the media.
The kernel uses this to load in parts of a demand paged file.
*/
+class TBlockMapEntryBase
{
public:
TUint iNumberOfBlocks; // Number of contiguous blocks in map.
TUint iStartBlock; // Number for first block in the map.
};
-struct SBlockMapInfoBase
+
/**
+ @internalTechnology
+
Describes context for TBlockMapEntryBase objects.
*/
+struct SBlockMapInfoBase
{
TUint iBlockGranularity; // Size of a block in bytes.
TUint iBlockStartOffset; // Offset to start of the file or requested file position within a block.
@@ -151,275 +55,10 @@
TInt iLocalDriveNumber; // Local drive number of where the file lies on.
};
-// forward declarations from file server
-class RFile;
-class RFs;
-/**
-A Handle used to identify a file on storage media.
-@internalTechnology
-*/
-class RFileClamp
- {
-public:
- inline RFileClamp()
- {
- iCookie[0] = 0;
- iCookie[1] = 0;
- }
- IMPORT_C TInt Clamp(RFile& aFile);
- IMPORT_C TInt Close(RFs& aFs);
-
-public:
- TInt64 iCookie[2];
- };
-
-
-class TCodeSegCreateInfo
- {
-public:
- TBuf8<KMaxFileName> iFileName; // not including {MMMMmmmm} version info
- TUidType iUids; // uid1 indicates EXE or DLL
- TUint32 iAttr;
- TInt iCodeSize;
- TInt iTextSize;
- TInt iDataSize;
- TInt iBssSize;
- TInt iTotalDataSize;
- TUint32 iEntryPtVeneer; // address of first instruction to be called
- TUint32 iFileEntryPoint; // address of entry point within this code segment
- TInt iDepCount;
- TUint32 iExportDir;
- TInt iExportDirCount;
- TUint32 iCodeLoadAddress; // 0 for RAM loaded code, else pointer to TRomImageHeader
- TUint32 iCodeRunAddress;
- TUint32 iDataLoadAddress;
- TUint32 iDataRunAddress;
- TUint32 iExceptionDescriptor;
- TInt iRootNameOffset;
- TInt iRootNameLength;
- TInt iExtOffset;
- TUint32 iModuleVersion;
- SSecurityInfo iS;
- TAny* iHandle; // pointer to kernel-side DCodeSeg object
- TInt iClientProcessHandle; // handle to client process for user DLL loads
- /** Code relocation information stored on loader heap. */
- TUint32* iCodeRelocTable;
- /** Size of code relocation table in bytes. */
- TInt iCodeRelocTableSize;
- /** Import fixup information stored on loader heap. */
- TUint32* iImportFixupTable;
- /** Size of import fixup table in bytes. */
- TInt iImportFixupTableSize;
- /** Offset to apply to each code address in the image when it is fixed up. */
- TUint32 iCodeDelta;
- /** Offset to apply to each data address in the image when it is fixed up. */
- TUint32 iDataDelta;
- /**
- Whether the code is paged. If this is set, then
- TCodeSegCreateInfo::iCodeRelocTable[Size] and
- TCodeSegCreateInfo::iImportFixupTable[Size] contain fixup information
- which the kernel uses to fix up each page.
- (They may be null if the binary has no imports or no code section.)
- */
- TBool iUseCodePaging;
- /** The UID of the compression scheme in use. */
- TUint32 iCompressionType;
- /**
- Start of compressed pages within the file. The kernel uses
- this to load compressed pages from byte-pair files when demand
- paging.
- */
- TInt32* iCodePageOffsets;
- /** Where (possibly compressed) object code starts in iFile. */
- TInt iCodeStartInFile;
- /** Length of (possibly compressed) object code in iFile. */
- TInt iCodeLengthInFile;
- /** Information about block map entries in iCodeBlockMapEntries. */
- SBlockMapInfoBase iCodeBlockMapCommon;
- /** Where object code is located on the media. */
- TBlockMapEntryBase* iCodeBlockMapEntries;
- /** Size of block map entry array in bytes. */
- TInt iCodeBlockMapEntriesSize;
- /**
- File clamp cookie, used to delete the file when the
- codeseg is destroyed.
- */
- RFileClamp iFileClamp;
-public:
- IMPORT_C TPtrC8 RootName() const;
- };
-
-//
-// Information required to create a new process
-//
-class TProcessCreateInfo : public TCodeSegCreateInfo
- {
-public:
- enum TDebugAttributes // must be the same as RLibrary::TInfoV2::TDebugAttributes
- {
- EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
- ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
- };
- /**
- The flags for process's creation. Will be set by the loader from the images
- header flags ready for the kernel to use.
- */
- enum TProcessCreateFlags
- {
- EDataPagingUnspecified = 0x00000000, ///< Use the global data paging default.
- EDataPaged = 0x00000001, ///< Page the process's data by default.
- EDataUnpaged = 0x00000002, ///< Don't page the process's data by default.
- EDataPagingMask = 0x00000003, ///< Bit mask ofr data paging flags.
- };
-
- /** Default constructor that ensures flags are clear. */
- TProcessCreateInfo() : iFlags(0) {};
-
- TInt iHeapSizeMin;
- TInt iHeapSizeMax;
- TInt iStackSize;
- TInt iClientHandle; // handle to loader's client
- TInt iProcessHandle; // handle to new DProcess
- TInt iFinalHandle; // handle from loader client to new process
- TOwnerType iOwnerType;
- TProcessPriority iPriority;
- TUint iSecurityZone;
- TUint iDebugAttributes; ///< Set with values from TDebugAttributes.
- TRequestStatus* iDestructStat;
- TUint iFlags; ///< Flags for process creation, should set from TProcessCreateFlags.
- };
-
-const TUint KSecurityZoneUnique = 0u;
-const TUint KSecurityZoneLegacyCode = ~0u;
-
-//
-// Information required to attach a code segment to a process
-// in the form of a library.
-//
-class TLibraryCreateInfo
- {
-public:
- TAny* iCodeSegHandle; // pointer to kernel-side DCodeSeg object
- TInt iClientHandle; // handle to loader's client
- TInt iLibraryHandle; // handle to new DLibrary
- TOwnerType iOwnerType;
- };
-
-//
-// Information required to find an existing code segment
-//
-class TFindCodeSeg
- {
-public:
- TUidType iUids; // required UIDs
- const TAny* iRomImgHdr; // ROM image header if ROM code required, NULL otherwise
- TUint32 iAttrMask; // mask for attributes
- TUint32 iAttrVal; // required value for masked attributes
- TInt iProcess; // handle to process in which code is required to operate
- // not used if kernel only specified
- SSecurityInfo iS; // required capabilities/SID
- TUint32 iModuleVersion; // required version
- TBuf8<KMaxLibraryName> iName; // name to look for - zero length means any
- };
-
-//
-// Information required to by the reaper from the codeseg.
-//
-struct TCodeSegLoaderCookie
- {
- RFileClamp iFileClamp;
- TInt64 iStartAddress;
- TInt iDriveNumber;
- };
-
-//
-// Loader magic executive functions
-//
-class E32Loader
- {
-public:
- // used by loader only
- IMPORT_C static TInt CodeSegCreate(TCodeSegCreateInfo& aInfo);
- IMPORT_C static TInt CodeSegLoaded(TCodeSegCreateInfo& aInfo);
- IMPORT_C static TInt LibraryCreate(TLibraryCreateInfo& aInfo);
- IMPORT_C static TInt CodeSegOpen(TAny* aHandle, TInt aClientProcessHandle);
- IMPORT_C static void CodeSegClose(TAny* aHandle);
- IMPORT_C static void CodeSegNext(TAny*& aHandle, const TFindCodeSeg& aFind);
- IMPORT_C static void CodeSegInfo(TAny* aHandle, TCodeSegCreateInfo& aInfo);
- IMPORT_C static TInt CodeSegAddDependency(TAny* aImporter, TAny* aExporter);
- IMPORT_C static void CodeSegDeferDeletes();
- IMPORT_C static void CodeSegEndDeferDeletes();
- IMPORT_C static TInt ProcessCreate(TProcessCreateInfo& aInfo, const TDesC8* aCommandLine);
- IMPORT_C static TInt ProcessLoaded(TProcessCreateInfo& aInfo);
- IMPORT_C static TInt CheckClientState(TInt aClientHandle);
- IMPORT_C static TInt DeviceLoad(TAny* aHandle, TInt aType);
- IMPORT_C static TAny* ThreadProcessCodeSeg(TInt aHandle);
- IMPORT_C static void ReadExportDir(TAny* aHandle, TUint32* aDest);
- IMPORT_C static TInt LocaleExports(TAny* aHandle, TLibraryFunction* aExportsList);
-
-#ifdef __MARM__
- IMPORT_C static void GetV7StubAddresses(TLinAddr& aExe, TLinAddr& aDll);
- static TInt V7ExeEntryStub();
- static TInt V7DllEntryStub(TInt aReason);
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <e32ldr_private.h>
#endif
- IMPORT_C static TUint32 PagingPolicy();
-
- IMPORT_C static TInt NotifyIfCodeSegDestroyed(TRequestStatus& aStatus);
- IMPORT_C static TInt GetDestroyedCodeSegInfo(TCodeSegLoaderCookie& aCookie);
-
-public:
- // used by client side
- static TInt WaitDllLock();
- static TInt ReleaseDllLock();
- static TInt LibraryAttach(TInt aHandle, TInt& aNumEps, TLinAddr* aEpList);
- static TInt LibraryAttached(TInt aHandle);
- static TInt StaticCallList(TInt& aNumEps, TLinAddr* aEpList);
- static TInt LibraryDetach(TInt& aNumEps, TLinAddr* aEpList);
- static TInt LibraryDetached();
- };
-
-typedef TInt (*TSupervisorFunction)(TAny*);
+#endif // __E32LDR_H__
-// Relocation types
-/**
-@internalTechnology
-@released
-*/
-const TUint16 KReservedRelocType = (TUint16)0x0000;
-/**
-@internalTechnology
-@released
-*/
-const TUint16 KTextRelocType = (TUint16)0x1000;
-/**
-@internalTechnology
-@released
-*/
-const TUint16 KDataRelocType = (TUint16)0x2000;
-/**
-@internalTechnology
-@released
-*/
-const TUint16 KInferredRelocType = (TUint16)0x3000;
-
-// Compression types
-
-/**
-@internalTechnology
-@released
-*/
-const TUint KFormatNotCompressed=0;
-/**
-@internalTechnology
-@released
-*/
-const TUint KUidCompressionDeflate=0x101F7AFC;
-
-
-const TUint KUidCompressionBytePair=0x102822AA;
-
-
-#endif
-