userlibandfileserver/fileserver/sfile/sf_std.h
changeset 0 a41df078684a
child 2 4122176ea935
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/sfile/sf_std.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,1924 @@
+// 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:
+// f32\sfile\sf_std.h
+// 
+//
+ 
+
+#ifndef SF_STD_H
+#define SF_STD_H
+
+#include "common.h"
+#include "message.h"
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <f32dbg.h>
+#include <e32svr.h>
+#include <e32hal.h>
+#include <e32uid.h>
+#include <e32std_private.h>
+#include <e32def_private.h>
+#include <e32const_private.h>
+#include "sf_plugin.h"
+#include "sf_func.h"
+#include <F32plugin.h>
+#include "f32trace.h"
+#include <utraceefile.h>
+
+#define __PRINT1TEMP_ALWAYS(t,a) {{TBuf<KMaxFileName>temp(a);RDebug::Print(t,&temp);}}
+#define __PRINT2TEMP_ALWAYS(t,a,b) {{TBuf<KMaxFileName>temp(b);RDebug::Print(t,a,&temp);}}
+#define __PRINT3TEMP_ALWAYS(t,a,b,c) {{TBuf<KMaxFileName>temp(c);RDebug::Print(t,a,b,&temp);}}
+#define __PRINT4TEMP_ALWAYS(t,a,b,c,d) {{TBuf<KMaxFileName>temp(d);RDebug::Print(t,a,b,c,&temp);}}
+
+#define _THRD_BUF() (_L("thread id 0x"));buf.AppendNum(RThread().Id(),EHex);buf.Append(_L(" "))
+#define __THRD_PRINT_ALWAYS(t) {{TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf);}}
+#define __THRD_PRINT1_ALWAYS(t,a) {{TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a);}}
+#define __THRD_PRINT2_ALWAYS(t,a,b) {{TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b);}}
+#define __THRD_PRINT3_ALWAYS(t,a,b,c) {{TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b,c);}}
+#define __THRD_PRINT4_ALWAYS(t,a,b,c,d) {{TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b,c,d);}}
+
+
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+#define __PRINT(t) {if (DebugReg&KFSERV) RDebug::Print(t);}
+#define __PRINT1(t,a) {if (DebugReg&KFSERV) RDebug::Print(t,a);}
+#define __PRINT2(t,a,b) {if (DebugReg&KFSERV) RDebug::Print(t,a,b);}
+#define __PRINT3(t,a,b,c) {if (DebugReg&KFSERV) RDebug::Print(t,a,b,c);}
+#define __PRINT4(t,a,b,c,d) {if (DebugReg&KFSERV) RDebug::Print(t,a,b,c,d);}
+#define __IF_DEBUG(t) {if (DebugReg&KFLDR) RDebug::t;}
+#define __LDRTRACE(t) {if (DebugReg&KFLDR) t;}
+#define __PRINTALLOC(t,a,b,c) {if (DebugReg&KALLOC) RDebug::Print(t,a,b,c);}
+#define __PRINT1TEMP(t,a) {if (DebugReg&KFSERV) {TBuf<KMaxFileName>temp(a);RDebug::Print(t,&temp);}}
+#define __PRINT2TEMP(t,a,b) {if (DebugReg&KFSERV) {TBuf<KMaxFileName>temp(b);RDebug::Print(t,a,&temp);}}
+#define __PRINT3TEMP(t,a,b,c) {if (DebugReg&KFSERV) {TBuf<KMaxFileName>temp(c);RDebug::Print(t,a,b,&temp);}}
+#define __PRINT4TEMP(t,a,b,c,d) {if (DebugReg&KFSERV) {TBuf<KMaxFileName>temp(d);RDebug::Print(t,a,b,c,&temp);}}
+#define __CALL(t) {t;}
+
+#define __THRD_PRINT(t) {if (DebugReg&KTHRD) {TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf);}}
+#define __THRD_PRINT1(t,a) {if (DebugReg&KTHRD) {TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a);}}
+#define __THRD_PRINT2(t,a,b) {if (DebugReg&KTHRD) {TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b);}}
+#define __THRD_PRINT3(t,a,b,c) {if (DebugReg&KTHRD) {TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b,c);}}
+#define __THRD_PRINT4(t,a,b,c,d) {if (DebugReg&KTHRD) {TBuf<KMaxFileName> buf=_THRD_BUF();buf.Append(t);RDebug::Print(buf,a,b,c,d);}}
+
+#define __CACHE_PRINT(t) {if (DebugReg&KCACHE) RDebug::Print(t);}
+#define __CACHE_PRINT1(t,a) {if (DebugReg&KCACHE) RDebug::Print(t,a);}
+#define __CACHE_PRINT2(t,a,b) {if (DebugReg&KCACHE) RDebug::Print(t,a,b);}
+#define __CACHE_PRINT3(t,a,b,c) {if (DebugReg&KCACHE) RDebug::Print(t,a,b,c);}
+#define __CACHE_PRINT4(t,a,b,c,d) {if (DebugReg&KCACHE) RDebug::Print(t,a,b,c,d);}
+#define __CACHE_PRINT5(t,a,b,c,d,e) {if (DebugReg&KCACHE) RDebug::Print(t,a,b,c,d,e);}
+#define __CACHE_PRINT6(t,a,b,c,d,e,f) {if (DebugReg&KCACHE) RDebug::Print(t,a,b,c,d,e,f);}
+#define __CACHE_PRINT7(t,a,b,c,d,e,f,g) {if (DebugReg&KCACHE) RDebug::Print(t,a,b,c,d,e,f,g);}
+#define __PLUGIN_PRINT(t) {if (DebugReg&KPLUGIN) RDebug::Print(t);}
+#define __PLUGIN_PRINT1(t,a) {if (DebugReg&KPLUGIN) RDebug::Print(t,a);}
+#define __PLUGIN_PRINT2(t,a,b) {if (DebugReg&KPLUGIN) RDebug::Print(t,a,b);}
+#define __PLUGIN_PRINT3(t,a,b,c) {if (DebugReg&KPLUGIN) RDebug::Print(t,a,b,c);}
+#else
+#define __PRINT(t)
+#define __PRINT1(t,a)
+#define __PRINT2(t,a,b)
+#define __PRINT3(t,a,b,c)
+#define __PRINT4(t,a,b,c,d)
+#define __IF_DEBUG(t)
+#define __LDRTRACE(t)
+#define __PRINTALLOC(t,a,b,c) {if (DebugReg&KALLOC) RDebug::Print(t,a,b,c);}
+#define __PRINT1TEMP(t,a)
+#define __PRINT2TEMP(t,a,b)
+#define __PRINT3TEMP(t,a,b,c)
+#define __PRINT4TEMP(t,a,b,c,d)
+#define __CALL(t)
+#define __THRD_PRINT(t)
+#define __THRD_PRINT1(t,a)
+#define __THRD_PRINT2(t,a,b)
+#define __THRD_PRINT3(t,a,b,c)
+#define __THRD_PRINT4(t,a,b,c,d)
+#define __CACHE_PRINT(t)
+#define __CACHE_PRINT1(t,a)
+#define __CACHE_PRINT2(t,a,b)
+#define __CACHE_PRINT3(t,a,b,c)
+#define __CACHE_PRINT4(t,a,b,c,d)
+#define __CACHE_PRINT5(t,a,b,c,d,e)
+#define __CACHE_PRINT6(t,a,b,c,d,e,f)
+#define __CACHE_PRINT7(t,a,b,c,d,e,f,g)
+#define __PLUGIN_PRINT(t)
+#define __PLUGIN_PRINT1(t,a)
+#define __PLUGIN_PRINT2(t,a,b)
+#define __PLUGIN_PRINT3(t,a,b,c)
+#endif
+
+const TInt KMaxTotalDriveReserved	=0x100000;
+const TInt KMaxSessionDriveReserved	=0x10000;
+
+// If TFsFileDuplciate::DoRequestL() is called a new sub-session is created and 
+// the new sub-session handle is returned, mangled by KSubSessionMangleBit - 
+// this is to discourage use of the duplicated handle.
+// If TFsFileAdopt::DoRequestL() is called then the passed sub-session handle is 
+// assumed to be already mangled by KSubSessionMangleBit and the same sub-session 
+// handle is returned de-mangled.
+const TInt KSubSessionMangleBit = 0x4000;
+
+
+#define __CHECK_DRIVETHREAD(d) {__ASSERT_DEBUG(FsThreadManager::IsDriveThread(d,ETrue),Fault(EFsDriveThreadError));}
+#define __CHECK_MAINTHREAD() {__ASSERT_DEBUG(FsThreadManager::IsMainThread(),Fault(EFsMainThreadError));}
+
+#define __LAZY_DLL_UNLOAD
+
+const TInt KMaxTempNameAttempts=50;
+const TInt KHeapMinSize=0x1000;
+const TInt KHeapMaxSize=0x400000;
+const TInt KLoaderStackSize=0x8000;
+
+//-- maximum file size that was supported before introducing File Server 64-bit addressing support.
+//-- It is 2G-1. Used in legacy code that does not understand RFile64
+const TUint64 KMaxLegacyFileSize    = 0x7fffffff;
+
+//-- absolute maximum file size that file server supports
+const TUint64 KMaxSupportedFileSize = KMaxTUint64;
+
+//__DATA_CAGING__
+const TUint SHA1_LBLOCK=16;
+const TUint SHA1_HASH=20;
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+
+class TCorruptNameRec;
+class TCorruptLogRec
+	{
+public:
+	TCorruptLogRec();
+	~TCorruptLogRec();
+	TInt Construct(TCorruptNameRec* aNameRec, TPtrC* aProcessName, TCorruptLogRec* aChain);
+	inline TPtrC ProcessName(){return iProcessName->Des();};
+	static TInt GetLogRecord(TFsDebugCorruptLogRecordBuf& aLogRecord,TInt aLogRecNum);
+	static void DestroyList();
+private:
+	HBufC* iProcessName;
+	TCorruptNameRec* iNameRec;
+	TCorruptLogRec* iNext;
+	};
+
+TInt OutputTraceInfo(TCorruptNameRec* aNameRec, CFsRequest* aRequest);
+
+class TText8FileReader
+	{
+	enum {EMaxLine=1024};
+public:
+	TText8FileReader();
+	~TText8FileReader();
+	TInt Set(RFile& aFile);
+	TInt Read(TPtr& aPtr);	
+public:
+	RFile iFile;
+	TBuf8<EMaxLine> iBuf;
+	TInt iBufPos;
+	TText* iFileDataBuf;
+	TInt iFileSize;	
+	};	
+
+class TCorruptNameRec
+	{
+public:
+	TCorruptNameRec();
+	TInt Construct(TPtr* aName,TInt aReturnCode, TBool aUseOnce, TCorruptNameRec* aChain);
+	static void ResetListConsumed();
+	inline TPtrC Name(){return iName->Des();};
+	inline TInt ReturnCode(){return iReturnCode;};
+	inline TBool Consumed(){return iConsumed;};
+	inline void SetConsumed(){iConsumed=iUseOnce;};
+	inline TCorruptNameRec* Next(){return iNext;};
+private:
+	HBufC*	iName;
+	TInt	iReturnCode;
+	TBool	iUseOnce;
+	TBool	iConsumed;
+	TCorruptNameRec* iNext;
+	};
+#endif
+//
+
+//
+_LIT(KFsClient,"FSCLIENT");
+
+NONSHARABLE_CLASS(CSHA1) : public CBase
+	{
+public:
+	static CSHA1* NewL(void);
+	void Update(const TDesC8& aMessage);
+	TPtrC8 Final(void);
+	~CSHA1(void);
+	void Reset(void);
+private:
+	CSHA1(void);
+	TUint iA;
+	TUint iB;
+	TUint iC;
+	TUint iD;
+	TUint iE;
+	TBuf8<SHA1_HASH> iHash;
+	TUint iNl;
+	TUint iNh;
+	TUint iData[SHA1_LBLOCK*5];
+	void DoUpdate(const TUint8* aData,TUint aLength);
+	void DoFinal(void);
+	void Block();
+	void ConstructL(void);
+	TUint8* iTempData;
+	};
+
+enum TFsPanic
+	{
+	ELdrImportedOrdinalDoesNotExist
+	};
+//
+enum TFsFault
+	{
+	EDrvIllegalShareValue,			//0
+	EMainCreateScheduler,
+	EMainCreateServer,
+	EMainStartServer,
+	EMainCreateResources1,
+	EMainGetLocalFileSystem,
+	EMainGetLocalDefaultPath,
+	EInitConnectLocalDrive,
+	EMainCreateStartupThread1,
+	EInitDriveMappingDriveInfo,
+	EInitCreateDriveName,			//10
+	EMainStartupNoEStart,
+	ESesPathBadDrive,
+	EFileDuplicateLock,
+	ESysDefaultPathNotSupported,
+	ESysAddLocalFileSystem,
+	ESvrBadSessionIndex,
+	EGetLocalDrive1,
+	EGetLocalDrive2,
+	ELdrRestartInit,
+	ELdrRestartSemaphore,			//20
+	EStripBackSlashBadName,
+	EIsSubDirBadDes,
+	ERawDiskBadAccessCount2,
+	ERawDiskBadAccessCount1,
+	ERawDiskBadAccessCount,
+	EDriveNoDiskMounted,
+	ESvrNotifierIsNULL,
+	EMainCreateResources5,
+	EMainCreateStartupThread2,
+	EMainCreateStartupThread3,		//30
+	EMainCreateStartupThread4,
+	EMainStartupWriteToDiskSemaphore,	
+	EMainCreateResources6,
+	EMainScanMediaDriversMem1,
+	EMainScanMediaDriversLocation,
+	EMainScanMediaDriversMem2,
+	EMainScanMediaDriverConnect,
+	EMainScanMediaDriverDirOpen,
+	EMainScanMediaDriverDirRead,
+	EMainLoadMediaDriver,			//40
+	EInitCreateMediaChangeNotifier,
+	ELdrCleanupCreate,
+	ELdrSchedulerCreate,
+	ELdrServerCreate,
+	ELdrFsConnect,
+	ELdrFsSetPath,
+	ELdrCacheInit,
+	ELdrSchedulerStopped,
+	ESvrFormatOpenFailed,
+	ESvrRawDiskOpenFailed,			//50
+	EProxyDriveConstruction,
+	ELocDrvInitLocalDrive,
+	ELocDrvDismountedLocalDrive,
+	EBaseExtConstruction,
+	ECreateProxyDriveL,
+	EExtensionInfoCount0,
+	EExtensionInfoCount1,
+	EExtensionInfoCount2,
+	EStdChangeRequestType,
+	EExtChangeNameLength,			//60
+	EDiskSpaceThreshold,
+	EDebugChangeType,
+	EBaseQueConstruction,
+	EChangeQueType,
+	EDiskSpaceQueType1,
+	EDiskSpaceQueType2,
+	EBaseQueCancel,
+	EDebugQueType,
+	EBaseRequestSrc,
+	EBaseRequestDest,			//70
+	EBaseRequestDrive,
+	EBaseRequestSubstedDrive,
+	EBaseRequestSetDrive,
+	EBaseRequestSetSubstedDrive,
+	EBaseRequestMessage,
+	EBaseRequestSet1,
+	EBaseRequestSet2,
+	EDiskSpaceQueDrive,
+	ENotifyInfoDestructor,
+	EChangeBadIndex,			//80
+	EBadDiskNotifyType,
+	EBadDebugNotifyType,
+	EDiskChangeDrive,
+	EBadChangeNotifyType,
+	EDiskBadIndex1,
+	EDiskBadIndex2,
+	EDiskBadIndex3,
+	ESvrFreeDiskSpace,
+	EFsThreadBadDrvNum,
+	EFsThreadConstructor,			//90
+	EFsThreadDriveClose1,
+	EFsThreadDriveClose2,
+	EFsThreadGetThread,
+	EMainInitialiseRomFs,
+	EFsDriveThreadError,
+	EFsMainThreadError,
+	ETFsSetSubstNotNull,
+	EMountFileSystemFSys,
+	EDisMountFileSystemFSys,
+	EIsValidDriveMapping,			//100
+	EInitDriveMappingSocketNo,
+	ECompleteNotifSocketNo,
+	EObjRemoveContainerNotFound,
+	EObjDestructorAccessCount,
+	EObjDestructorContainer,
+	EObjRemoveBadHandle,
+	EArrayIndexOutOfRange,
+	EObjFindBadHandle,
+	EObjRemoveObjectNotFound,
+	EObjFindIndexOutOfRange,			//110
+	ESubOpenBadHandle,
+	EMainDisconnectThread,
+	EInternalRequestProcess,
+	EInternalRequestComplete1,
+	EInternalRequestComplete2,
+	EInternalRequestComplete3,
+	ERequestThreadDestructor,
+	EThreadManagerInitDrive,
+	EDriveCurrentWriteFunction,
+	EDriveGetNotifyUser,				//120
+	EDriveThreadWriteable,
+	EDriveThreadNotifyUser1,
+	EDriveThreadNotifyUser2,
+	ERequestDestructorFree,
+	ESessionDisconnectThread1,
+	ESessionDisconnectThread2,
+	EDismountFsDriveThread,
+	EDisconnectRequestDispatch1,
+	EDisconnectRequestDispatch2,
+	EDisonncectRequestProcess,			//130
+	EDispatchObjectDispatch,
+	EDispatchObjectThread,
+	EInternalRequestDispatch1,
+	EInternalRequestDispatch2,
+	EInternalRequestDispatch3,
+	EFsObjectIxDestructor,
+	EDisconnectRequestComplete,
+	EMountExtensionFSys,
+	EObjectConDestructor,
+	EParseSubstSession,					//140
+	ELdrGetKernelInfoFailed,
+	EObjectIxMainThread,
+	ESwapFileSystemNull,
+	ESwapFileSystemMount,
+	ESwapFileSystemRom,
+	EReserveSpaceArithmetic,
+	ECloseSubBadMessage,
+	EFsCacheLockFailure,
+	EFsPluginThreadError,				
+	EBadDismountNotifyType,				//150
+	ENotifyDismount,
+	EAllowDismount,
+	ENotifyDismountCancel,
+	EFileDuplicateAsyncReadRequest,
+	EFileFailedToServiceAsyncReadRequest,
+	ELdrCsIdWrap,
+	EFileShareBadPromoteCount,
+	EInternalRequestDispatchCancelPlugin,
+	EMainCreateStartupThread0,
+	ERequestAllocatorOpenSubFailed,		//160
+	ETParsePoolGet,
+	EInvalidDrive,
+	ELocDrvInvalidLocalDrive,
+	ELdrReaperCreate,
+	ELdrReaperCleanupTimerCreate,
+	EFsParsePoolLockFailure,
+	ELdrReaperCantGetDriveList,
+	EFileCacheCreateFailed,
+	EBadOperationIndex,
+	EBadOperationCompletionCode,		//170
+	EReadOffsetNonZero,
+	ETooManyOperations,
+	EInvalidOperationIndex,
+	EInvalidReadLength,
+	EInvalidWriteLength,
+	ERequestThreadNotInitialised,
+	EMemoryInfoFailed,
+	EMsgRestartBadFunction,
+	EPushOpNoCallback,
+	EFreeingMsgWithMsgOp,				//180
+	ENotUnused,
+	ELdrFileDataAllocInit,
+	ELdrFileDataAllocError,
+	EDismountLocked,
+	EInvalidMsgState,
+	EGetProxyDriveMapping1,
+	EGetProxyDriveMapping2,
+	EExtProxyDriveCaps,
+	EIsProxyDrive,
+	EClearProxyDriveMapping1,			//190
+	EClearProxyDriveMapping2,
+	ERequestQueueNotEmpty,
+	ESetupMediaChange,
+	ECancelNotifyChange,
+	EPluginOpError,
+	EBadMessageSlotIndex,
+	EInvalidCompletionFlags,
+	ECacheMemoryManagerCreateFailed,
+	EFileBodyIsNull,
+	ETraceLddLoadFailure,				//200
+	ETooManyDrivesPerSocket,
+	ENotificationFault
+	};
+
+
+NONSHARABLE_CLASS(CFsObjectConIx) : public CBase
+	{
+public:
+	static CFsObjectConIx* NewL();
+	~CFsObjectConIx();
+	CFsObjectCon* CreateL();
+	void Remove(CFsObjectCon* aCon);
+protected:
+	CFsObjectConIx();
+	void CreateContainerL(CFsObjectCon*& anObject);
+private:
+	TInt iCount;
+	TInt iAllocated;
+	TInt iNextUniqueID;
+	CFsObjectCon** iContainers;
+	};
+
+struct SFsObjectIxRec
+	{
+	TInt16 instance;
+	TInt16 uniqueID;
+	CFsObject* obj;
+	};
+
+NONSHARABLE_CLASS(CFsObjectIx) : public CBase
+	{
+public:
+	static CFsObjectIx* NewL();
+	~CFsObjectIx();
+	TInt AddL(CFsObject* anObj,TBool aLock);
+	void Remove(TInt aHandle,TBool aLock);
+	CFsObject* At(TInt aHandle,TInt aUniqueID,TBool aLock);	
+	CFsObject* At(TInt aHandle,TBool aLock);
+	TInt At(const CFsObject* anObj,TBool aLock);
+	CFsObject* operator[](TInt anIndex);
+	void CloseMainThreadObjects();
+	inline TInt Count() const;
+	inline TInt ActiveCount() const;
+	inline void Lock();
+	inline void Unlock();
+protected:
+	CFsObjectIx();
+private:
+	TInt iNumEntries;		// number of actual entries in the index
+	TInt iHighWaterMark;	// 1+highest active index
+	TInt iAllocated;		// max entries before realloc needed
+	TInt iNextInstance;
+	SFsObjectIxRec *iObjects;
+	RFastLock iLock;
+	};
+
+NONSHARABLE_CLASS(CFsObjectCon) : public CBase
+	{
+protected:
+	enum {ENotOwnerID};
+public:
+	static CFsObjectCon* NewL();
+	~CFsObjectCon();
+	void AddL(CFsObject* anObj,TBool aLock);
+	void Remove(CFsObject* anObj,TBool aLock);
+	CFsObject* operator[](TInt anIndex);
+	CFsObject* At(TInt aFindHandle) const;
+	CFsObject* AtL(TInt aFindHandle) const;	
+	TInt FindByName(TInt& aFindHandle,const TDesC& aMatch) const;
+	inline void Lock();
+	inline void Unlock();
+	inline TInt UniqueID() const;
+	inline TInt Count() const;
+protected:
+	CFsObjectCon(TInt aUniqueID);
+	TInt CheckUniqueName(const CFsObject* anObject) const;
+	TBool NamesMatch(const TName& anObjectName, const CFsObject* aCurrentObject) const;
+public:
+	TInt iUniqueID;
+	TInt iCount;
+	TInt iAllocated;
+	CFsObject** iObjects;
+	RFastLock iLock;
+friend class CFsObjectConIx;
+friend class CFsObject;
+	};
+
+
+NONSHARABLE_CLASS(CFsSyncMessageScheduler) : public CActive
+	{
+public:
+	static CFsSyncMessageScheduler* NewL();
+	void DoCancel();
+	void RunL();
+	void Dispatch(CFsRequest* aRequest);
+	void CompleteSessionRequests(CSessionFs* aSession, TInt aValue);
+private:
+	CFsSyncMessageScheduler();
+	void ConstructL();
+private:
+	RThread iThread;
+	RFastLock iLock;
+	TDblQue<CFsRequest> iList;
+	TBool iSignalled;
+	};
+
+
+NONSHARABLE_CLASS(CNotifyMediaChange) : public CActive
+	{
+public:
+	CNotifyMediaChange(RLocalDrive* aDrive,TInt aSocketNo);
+	void DoCancel() {};
+	void RunL();
+private:
+	RLocalDrive* iDrive;
+	TInt iSocket;
+	};
+
+
+const TInt KMaxDrivesPerSocket=16;
+
+class LocalDrives
+	{
+public:
+	static void Initialise();
+	static TBusLocalDrive& GetLocalDrive(TInt aDriveNumber);
+	static CExtProxyDrive* GetProxyDrive(TInt aDrive);
+	static TInt InitProxyDrive(CFsRequest* aRequest);
+	static TInt MountProxyDrive(CFsRequest* aRequest);
+	static TInt DismountProxyDrive(TInt iDriveNumber);
+	static TBool IsValidDriveMapping(TInt aDrvNumber);
+	static TInt DriveNumberToLocalDriveNumber(TInt aDrvNumber);
+	static TInt SetDriveMappingL(CFsRequest* aRequest);
+	static void CompleteNotifications(TInt aSocket);
+	static void CompleteDriveNotifications(TInt aDriveNumber);
+	static TInt GetLocalSocket(TInt aControllerRelativeSocket, TMediaDevice aMediaType);
+	static TInt GetDriveFromLocalDrive(TInt aLocDrv);
+	static TInt GetLocalDriveNumber(TBusLocalDrive* aLocDrv);
+	static TBool IsProxyDrive(TInt aDrive);
+	static void ClearProxyDriveMapping(TInt aDrive);
+	static TBool IsProxyDriveInUse(CExtProxyDriveFactory* aDevice);
+	static TInt SetupMediaChange(TInt aDrive);
+	static void NotifyChangeCancel(TInt aDrive);
+private:
+	static void InitDriveMapping();
+	static TInt SwapDriveMapping(TInt aFirstDrive,TInt aSecondDrive);
+private:
+	class TSocketDesc
+		{
+	public:
+		TInt iDriveNumbers[KMaxDrivesPerSocket];	// drive numbers assigned to this socket
+		CNotifyMediaChange* iMediaChanges;
+		TMediaDevice iMediaType;
+		TInt iControllerRelativeSocket;
+		};
+	static TSocketDesc iSocketDescs[KMaxPBusSockets];
+	static TBusLocalDrive iLocalDrives[KMaxLocalDrives];			
+	static TInt iMapping[KMaxDrives];		// maps drive to local drive
+	static TBool iMappingSet;
+	static TInt iReverseMapping[KMaxLocalDrives];// opposite mapping of iMapping. local drive to drive (1 to [potentially] many)
+	// i.e. LocalDrive1 -> DriveX
+	//		LocalDrive2 -> DriveX
+	static TBool iIsMultiSlotDrive[KMaxDrives]; // index is drive number
+	static CExtProxyDrive* iProxyDriveMapping[KMaxProxyDrives];
+	
+	friend void TFsAddCompositeMount::AddFsToCompositeMountL(TInt aDriveNumber, CFileSystem& aFileSystem, TInt aLocalDriveNumber);
+	friend void TDrive::MultiSlotDriveCheck(); // for dual/multi slot drive map swapping. (iMapping/iReverseMapping)
+	};
+
+NONSHARABLE_CLASS(CLogon) : public CActive
+	{
+public:
+	enum {EPriority=3000};
+public:
+	static CLogon* NewL();
+	TInt Logon(RThread aThread);
+	virtual void DoCancel();
+	virtual void RunL();
+protected:
+	CLogon(TInt aPriority);
+private:
+	RThread iThread;
+	};
+
+#ifdef __LAZY_DLL_UNLOAD
+NONSHARABLE_CLASS(CLazyUnloadTimer): public CTimer
+	{
+public:
+	CLazyUnloadTimer();
+	~CLazyUnloadTimer();
+	static void New();
+	static void Finish();
+private:
+	void RunL();
+	void Start();
+	};
+#endif
+
+NONSHARABLE_CLASS(CSessionLoader) : public CSession2
+	{
+private:
+	virtual void ServiceL(const RMessage2& aMessage);
+	TInt DeleteExecutable(const TDesC& aName);
+	};
+
+NONSHARABLE_CLASS(CServerLoader) : public CServer2
+	{
+public:
+	enum {EPriority=2000};
+public:
+	static CServerLoader* New();
+	virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
+	virtual TInt RunError(TInt aError);
+private:
+	CServerLoader(TInt aPriority);
+	};
+
+class RLoaderMsg : public RMessage2
+	{
+public:
+	TInt GetString(HBufC8*& aBuf, TInt aParam, TInt aMaxLen, TInt aHeadroom, TBool aReduce) const;
+	TInt GetLdrInfo(TLdrInfo& aInfo) const;
+	TInt UpdateLdrInfo(const TLdrInfo& aInfo) const;
+	};
+
+ void Fault(TFsFault aFault);
+
+class CSessionFs;
+class TOperation;
+class CRequestThread;
+
+typedef TInt (*TFsRequestFunc)(CFsRequest*);
+
+class TThreadTimer
+	{
+public:
+	TThreadTimer(TInt (*aCallBackFunction)(TAny* aPtr),TAny* aPtr);
+
+	void Start(CRequestThread* aRequestThread, TTimeIntervalMicroSeconds32 aTime);
+	void Stop();
+
+private:
+	TTickCountQueLink iLink;
+	TCallBack iCallBack;
+	CRequestThread* iRequestThread;	// the thread the timer is running on, NULL if timer not running
+
+	friend class CFsDeltaTimer;
+	};
+
+// Class adapted from CDeltaTimer (but unlike CDeltaTimer, not derived from CActive).
+// Used to support multiple timer events in drive threads.
+NONSHARABLE_CLASS(CFsDeltaTimer) : public CBase
+	{
+public:
+	static CFsDeltaTimer* New(CRequestThread& aRequestThread, TInt aPriority);
+	~CFsDeltaTimer();
+
+	void Start(TThreadTimer& aEntry, TTimeIntervalMicroSeconds32 aTime);
+	void Stop(TThreadTimer& aEntry);
+
+	void RunL();
+private:
+	CFsDeltaTimer(CRequestThread& aRequestThread, TInt aPriority, TInt aTickPeriod);
+	void Cancel();
+	void Activate();
+	TInt QueueLong(TTimeIntervalMicroSeconds aTimeInMicroSeconds, TThreadTimer& aEntry);
+private:	
+	CRequestThread& iRequestThread;
+	TThreadId iThreadId;
+	RTimer iTimer;
+	TTickCountQue iQueue;
+	const TInt iTickPeriod;
+	TBool iQueueBusy;
+	RFastLock iLock;
+	TBool iRestartNeeded;	// timer needs to be restarted as it was scheduled from a different thread
+public:
+	TRequestStatus iStatus;
+	};
+
+
+NONSHARABLE_CLASS(CRequestThread) : public CBase
+	{
+public:
+	TInt ThreadFunction();
+	void DeliverBack(CFsRequest* aRequest, TBool aLowPriority = EFalse);
+	void DeliverFront(CFsRequest* aRequests);
+
+	~CRequestThread();
+
+	CFsDeltaTimer* Timer();
+
+	void CompleteAllRequests(TInt aValue);
+protected:
+	CRequestThread();
+	TInt DoStart(RThread& aThread);
+	inline TInt Initialise();
+	void Deliver(CFsRequest* aRequest,TBool aIsFront, TBool aLowPriority = EFalse);
+	void Receive();
+	virtual TInt DoThreadInitialise();
+protected:
+	CFsRequest* iRequest;
+	TDblQue<CFsRequest> iList;
+	RFastLock iListLock;
+	TBool iIsWaiting;
+	TBool iExit;
+	RThread iThread;
+	CFsDeltaTimer* iTimer;
+	TBool iLowPriority;		// if true, drive thread's priority has been (temporarily) reduced
+	friend class CFsDeltaTimer;
+	};
+
+
+
+
+NONSHARABLE_CLASS(CDriveThread) : public CRequestThread
+	{
+public:
+	void CompleteReadWriteRequests();
+	void CompleteSessionRequests(CSessionFs* aSession, TInt aValue);
+	void CompleteClientRequests(TInt aValue);
+	TBool IsRequestWriteable();
+	TBool IsSessionNotifyUser();
+private:
+	CDriveThread();
+	static CDriveThread* NewL();
+	TUint StartL(TInt aDrvNumber);
+	TInt DoThreadInitialise();
+
+	void StartFinalisationTimer();
+	void StopFinalisationTimer();
+
+	static TInt FinaliseTimerEvent(TAny* aFileCache);
+private:
+	TInt iDriveNumber;
+	TThreadTimer iFinaliseTimer;
+
+friend class FsThreadManager;
+	};
+
+class CFsInternalRequest;
+
+NONSHARABLE_CLASS(CDisconnectThread) : public CRequestThread
+	{
+public:
+	inline CFsInternalRequest* GetRequest();
+private:
+	static CDisconnectThread* NewL();
+	TUint StartL();
+	~CDisconnectThread();	
+private:
+	CFsInternalRequest* iRequest;
+friend class FsThreadManager;
+	};
+
+class CFsPlugin;
+NONSHARABLE_CLASS(CPluginThread) : public CRequestThread
+	{
+public:
+	CPluginThread(CFsPlugin& aPlugin);
+	void CompleteSessionRequests(CSessionFs* aSession, TInt aValue);
+
+	/** @prototype */
+	void OperationLockWait();
+
+	/** @prototype */
+	void OperationLockSignal();
+
+private:
+	static CPluginThread* NewL(CFsPlugin& aPlugin);
+	TUint StartL();
+	virtual TInt DoThreadInitialise();
+private:
+	CFsPlugin& iPlugin;
+
+	/** @prototype */
+	RSemaphore iOperationLock;
+
+friend class FsPluginManager;
+	};
+
+class TFsDriveThread
+	{
+public:
+	TFsDriveThread();
+public:
+	RMutex iFSLock;
+	TBool iIsAvailable;
+	TBool iIsSync;
+	CDriveThread* iThread;
+	TUint iId;
+	TBool iIsHung;				// drive is hung waiting for a critical notifier
+	TBool iMediaChangePending;	// media change is pending while hung
+	};
+
+
+class FsThreadManager
+	{
+public:
+	static TInt CreateDisconnectThread();
+	static inline CDisconnectThread* GetDisconnectThread() {return(iDisconnectThread);}
+	static TBool IsDisconnectThread();
+//
+	static void SetMainThreadId();
+	static TBool IsMainThread();
+//
+	static TInt InitDrive(TInt aDrvNumber,TBool aIsSync);
+	static TInt ChangeSync(TInt aDrvNumber,TBool aIsSync);
+
+	static TInt GetDriveThread(TInt aDrvNumber, CDriveThread** aDrvThread);
+	static void CloseDrive(TInt aDrvNumber);
+	static TBool IsDriveThread(TInt aDrvNumber,TBool aLock);
+	static TBool IsDriveSync(TInt aDrvNumber,TBool aLock);
+	static TBool IsDriveAvailable(TInt aDrvNumber,TBool aLock);
+	static void LockDrive(TInt aDrvNumber);
+	static void UnlockDrive(TInt aDrvNumber);			
+	static void SetDriveHung(TInt aDrvNumber, TBool aIsHung);
+	static TBool IsDriveHung(TInt aDrvNumber);
+	static void SetMediaChangePending(TInt aDrvNumber);
+	static void StartFinalisationTimer(TInt aDriveNumber);
+	static void StopFinalisationTimer(TInt aDriveNumber);
+private:
+	inline static TFsDriveThread& GetFsDriveThread(TInt aDrvNumber) {return(iFsThreads[aDrvNumber]);}
+private:
+	static TFsDriveThread iFsThreads[KMaxDrives];
+	static TUint iMainId;
+	static CDisconnectThread* iDisconnectThread;
+	static TUint iDisconnectThreadId;
+	};
+
+
+const TInt KReservedDriveAccessArrayGranularity = 2;
+
+class TReservedDriveAccess
+	{
+public:
+	inline TReservedDriveAccess(TInt aDriveNumber);
+	inline TReservedDriveAccess(TInt aDriveNumber, TInt aReservedSpace);
+private:
+	TReservedDriveAccess();
+public:
+	TInt iDriveNumber;
+	TInt iReservedSpace;
+	TInt iReservedAccess;
+	};
+
+
+class CFsMessageRequest;
+NONSHARABLE_CLASS(CSessionFs) : public CSession2
+	{
+public:
+	static CSessionFs* NewL();
+	~CSessionFs();
+	virtual void CreateL();
+	TInt CurrentDrive();
+	void ServiceL(const RMessage2& aMessage);
+	TInt CountResources();
+	void ResourceCountMarkStart();
+	void ResourceCountMarkEnd(const RMessage2& aMessage);
+	TBool GetNotifyUser();
+	void SetNotifyUser(TBool aNotification);
+	TBool IsChangeNotify();
+	void SetSessionFlags(TUint32 aBitsToSet, TUint32 aBitsToClear);
+	TBool TestSessionFlags(TUint32 aFlags);
+	void CloseRequestCountInc();
+	void CloseRequestCountDec();
+	
+	//
+	virtual void Disconnect(const RMessage2& aMessage);
+	//
+	inline void IncResourceCount();
+	inline void DecResourceCount();
+	inline CFsObjectIx& Handles();
+	inline HBufC& Path();
+	inline void SetPath(HBufC* aPath);
+	inline TThreadId& ThreadId();
+	inline void SetThreadId(const TThreadId& aId);
+	//
+	TUint Reserved(TInt aDriveNumber) const;
+	TInt SetReserved(const TInt aDriveNumber, const TInt aReservedValue);
+	TBool ReservedAccess(TInt aDriveNumber) const;
+	void SetReservedAccess(const TInt aDriveNumber, const TBool aReservedAccess);
+private:
+	CSessionFs();
+
+private:
+	TInt iResourceCountMark;
+	TInt iResourceCount;
+	TInt iSessionFlags;
+	RFastLock iSessionFlagsLock;
+	CFsObjectIx* iHandles;
+	HBufC* iPath;
+	CFsMessageRequest* iDisconnectRequest;
+	RArray<TReservedDriveAccess> iReservedDriveAccess;
+	TThreadId iId;
+	TInt iCloseRequestCount;	// number of close requests owned by this sessions on the RequestAllocator close queue
+friend class CFsDisconnectRequest;
+	};
+
+NONSHARABLE_CLASS(CServerFs) : public CServer2
+	{
+public:
+	enum {EPriority=1000};
+public:
+	virtual ~CServerFs();
+	static void New();
+	virtual CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const;
+	CSessionFs* operator[](TInt anIndex);
+	inline void SessionQueueLockWait();
+	inline void SessionQueueLockSignal();
+protected:
+	// from CServerFs
+	void RunL();
+
+private:
+	CServerFs(TInt aPriority);
+	// lock to protect iSessionQ
+	RFastLock iSessionQueueLock;
+	};
+
+NONSHARABLE_CLASS(CActiveSchedulerFs) : public CActiveScheduler
+	{
+public:
+	static void New();
+	virtual void Error(TInt anError) const;
+	};
+
+NONSHARABLE_CLASS(CActiveSchedulerLoader) : public CActiveScheduler
+	{
+public:
+	static CActiveSchedulerLoader* New();
+	virtual void Error(TInt anError) const;
+	};
+
+
+class TNameChecker
+	{
+public:
+	TNameChecker(const TDesC& aPathName): iName(aPathName){};
+	TBool IsIllegalChar(TText& aChar);
+	TBool IsIllegalName();
+	TBool IsIllegalName(TText& aChar);
+	TBool IsIllegalPath();
+	TBool IsIllegalPath(TText& aChar);
+	void SetName(const TDesC& aName){iName=aName;};
+private:
+	TBool IsIllegal(TText& aChar) const;
+private:
+	TFileName iName;
+	TParse iParse;
+	};
+
+enum TOperationFlags
+		{
+		ESync = 0x01, 
+		EInternalRequest = 0x02,	// NB Not really used!
+		EParseSrc = 0x04, 
+		EParseDst = 0x08,
+		EFileShare = 0x10,			// Operates on an open file share
+		};
+
+class TOperation
+	{
+public:
+	TBool IsChangeNotify() const;
+	TBool IsDiskSpaceNotify() const;
+	TBool IsWrite() const;
+	TUint NotifyType() const;
+	TBool IsCompleted() const;
+	TBool IsOpenSubSess() const; //used to allocate for close as well as open task for subsessions
+	TBool IsCloseSubSess() const;
+
+	inline TBool IsSync() const;
+	inline TInt Function();
+	inline TInt Initialise(CFsRequest* aRequest);
+	inline TInt PostInitialise(CFsRequest* aRequest);
+	inline TInt DoRequestL(CFsRequest* aRequest);
+	inline TFsPluginRequest::TF32ArgType Arg(TUint aIndex);
+	
+public:
+	TInt iFunction;
+	TUint iFlags;
+	TFsRequestFunc iInitialise;
+	// optional processing step. Runs initially in context of main file server thread
+	// but may be executed again in drive thread context if request is postponed
+	TFsRequestFunc iPostInitialise;
+	TFsRequestFunc iDoRequestL;
+	TUint32 iArgs;
+	};
+
+class TMsgOperation
+	{
+public:
+	inline void Set(TInt64 aPos, TInt aLength, TUint8* aData, TInt aOffset = 0, TInt aNextState = 0);
+	inline void Set(TInt64 aPos, TInt aLength, TDesC8* aData, TInt aOffset = 0, TInt aNextState = 0);
+public:
+	
+	typedef struct
+		{
+		TAny* iData;	// pointer to local buffer (TUint8*) or remote client decriptor (TDesC8*)
+		TInt iTotalLength;
+		TInt64 iPos;
+		TInt iLength;	// length of current fair-scheduled read/write 
+		TInt iOffset;	// offset into iData
+		} SReadWriteArgs;
+
+	union
+		{
+		TInt iArgs[KMaxMessageArguments];
+		SReadWriteArgs iReadWriteArgs;
+		};
+
+	TInt iFunction;				// the current function (usually, but not always the same as TOperation.iFunction
+	TFsRequestFunc iComplete;	// function to call when CFsMessageRequest::Complete() is called
+	CFsPlugin* iCurrentPlugin;	// The current plugin at the stage this Operation was pushed
+
+	TBool iClientRequest;		// The current request originated through RFile/RFilePlugin, so uses a descriptor buffer: 
+								// An EFSRV client request 		non-local handle	non-local buffer	descriptor
+								// A plugin request				local handle		local buffer		descriptor
+								// An internal (cache) request	local handle		local buffer		raw pointer
+	TInt iState;
+	TMsgOperation* iNext;
+	TMsgOperation* iPrev;
+	TBool iIsAllocated;
+	TAny* iScratchValue0;
+	TAny* iScratchValue1;
+	TInt64 iClientPosition;
+	};
+
+
+
+NONSHARABLE_CLASS(CFsRequest) : public CBase
+	{
+public:
+	/** Request states - these indicate a message's current stage of processing 
+	*/
+	enum TReqStates
+		{
+		/** Need to call iOperation.iInitialise() */
+		EReqStateInitialise,
+		/** Need to call PostInitialise() */
+		EReqStatePostInitialise,
+		/** Need to call iOperation.iDoRequestL */
+		EReqStateDoRequest,
+		};
+
+
+	/** 
+	Request actions - these indicate what further processing is required 
+	and may be returned by any of:	
+
+		CFsRequest::iOperation->Initialise()
+		CFsPlugin::DoRequestL()
+		CFsMessageRequest::iOperation->iPostInitialise()
+		CFsRequest::iOperation->DoRequestL()
+		CFsMessageRequest::iCurrentOperation->iComplete()
+
+	The last 3 bits of each return code are used in CFsMessageRequest::Complete() 
+	as an array look up to determine what action to take
+	 */
+	enum TReqActions 
+		{
+		/** 
+		Continue with processing, dispatching to drive thread if necessary
+		NB same value as KErrNone to maintain compatibility with existing code
+		*/
+		EReqActionContinue = KErrNone,			// 0x00000000, last 3 bits = 0
+
+		/** 
+		Complete and free the message 
+		*/
+		EReqActionComplete = KErrCompletion,		// 0xFFFFFFEF, last 3 bits = 7
+		
+		/** 
+		A resource is in use, so dispatch message again to back of drive thread's request queue
+		If returned by Initialise(), then Initialse() will be called again
+		If returned by Complete(), then iPostInitialise() will be called again
+		*/
+		EReqActionBusy = -0x1002,				// 0xFFFFEFFE, last 3 bits = 6
+		
+		/** 
+		Neither dispatch nor complete the message - 
+		a plugin thread has taken ownership of the message
+		*/
+		EReqActionOwnedByPlugin = -0x1003,		// 0xFFFFEFFD, last 3 bits = 5
+
+		/**
+		The request cannot be processed because there is already an active read/write request 
+		for the associated file share. This request has been linked to the currently active
+		request and will be dispatched to the the drive thread when the current request has completed.
+		@see CFileShare::RequestStart() & CFileShare::RequestEnd()
+		*/
+		EReqActionPending = EReqActionOwnedByPlugin,
+		};
+public:
+	~CFsRequest();
+
+	void ReadL(const TInt aMsgNum,TDes8& aDes);
+	void ReadL(const TInt aMsgNum,TDes8& aDes,TInt anOffset);
+	void ReadL(const TInt aMsgNum,TDes16& aDes);
+	void ReadL(const TInt aMsgNum,TDes16& aDes,TInt anOffset);
+
+	void WriteL(const TInt aMsgNum,const TDesC8& aDes);
+	void WriteL(const TInt aMsgNum,const TDesC8& aDes,TInt anOffset);
+	void WriteL(const TInt aMsgNum,const TDesC16& aDes);
+	void WriteL(const TInt aMsgNum,const TDesC16& aDes,TInt anOffset);
+
+	TInt Read(const TInt aMsgNum,TDes8& aDes);
+	TInt Read(const TInt aMsgNum,TDes8& aDes,TInt anOffset);
+	TInt Read(const TInt aMsgNum,TDes16& aDes);
+	TInt Read(const TInt aMsgNum,TDes16& aDes,TInt anOffset);
+
+	TInt Write(const TInt aMsgNum,const TDesC8& aDes);
+	TInt Write(const TInt aMsgNum,const TDesC8& aDes,TInt anOffset);
+	TInt Write(const TInt aMsgNum,const TDesC16& aDes);
+	TInt Write(const TInt aMsgNum,const TDesC16& aDes,TInt anOffset);
+
+	TInt GetDesLength(const TInt aMsgNum);
+
+	inline void Kill(TInt aReason);
+	inline void Terminate(TInt aReason);
+	inline void Panic(const TDesC &aCategory,TInt aReason);
+	inline TBool ErrorPlugin(TInt aReason);
+
+	TInt Read(TFsPluginRequest::TF32ArgType aType, TInt& aVal);
+	TInt Read(TFsPluginRequest::TF32ArgType aType, TUint& aVal);
+	TInt Read(TFsPluginRequest::TF32ArgType aType, TInt64& aVal);
+	//
+	TInt Read(TFsPluginRequest::TF32ArgType aType, TDes8& aDes,  TInt aOffset = 0);
+	TInt Read(TFsPluginRequest::TF32ArgType aType, TDes16& aDes, TInt aOffset = 0);
+	//
+	TInt Write(TFsPluginRequest::TF32ArgType aType, const TDesC8& aDes,  TInt aOffset = 0);
+	TInt Write(TFsPluginRequest::TF32ArgType aType, const TDesC16& aDes, TInt aOffset = 0);
+
+	inline TInt Initialise(){return iOperation->Initialise(this);};
+	virtual void Process()=0;
+	virtual void Complete(TInt aError)=0;
+	virtual void Dispatch()=0;
+	virtual void Free()=0;
+	//
+	virtual TParse& Src();
+	virtual TParse& Dest();
+	virtual TDrive* Drive();
+	virtual TDrive* SubstedDrive();
+	virtual void SetDrive(TDrive* aDrive);
+	virtual void SetSubstedDrive(TDrive* aDrive);
+	virtual const RMessage2& Message();
+	//
+	inline TOperation* Operation();
+	inline CSessionFs* Session();
+	inline void SetSession(CSessionFs* aSession);
+	inline TInt DriveNumber();
+	inline void SetDriveNumber(TInt aDriveNumber);
+	inline TBool IsCompleted();
+	inline void SetCompleted(TBool aIsCompleted);
+	inline TUint ScratchValue();
+	inline void SetScratchValue(const TUint aValue);
+	inline TInt64 ScratchValue64();
+	inline void SetScratchValue64(const TInt64& aValue);
+	inline TBool IsSeparateThread();
+	inline TBool IsPostOperation() const;
+	inline TBool IsPluginSpecific() const;
+	inline TBool IsExpectedResult(TInt err) const;
+	inline TBool IsChangeNotify() const;
+	inline void SetState(TReqStates aReqState);
+	inline TBool DirectToDrive();
+	inline TBool IsDescData(TInt aMsgNum);
+	inline TInt FsFunction();
+
+public:
+	CFsRequest();
+protected:
+	inline void Set(const TOperation& aOperation,CSessionFs* aSession);
+	inline void Set(CSessionFs* aSession);
+	inline void SetError(TInt aError);
+	inline TInt GetError() const;
+	inline void SetPostOperation(TBool aSet);
+
+	inline TBool IsFsObjectOpen();
+	inline void SetFsObjectOpen(TBool aSet);
+	void SetAndOpenScratchValue(const TInt64& aValue);
+
+private:
+	TInt GetSlot(TFsPluginRequest::TF32ArgType aType);
+public:
+	TDblQueLink iLink;
+	CFsPlugin* iCurrentPlugin;
+	CFsPlugin* iOwnerPlugin;	// the plugin which originated this request
+	TThreadId iClientThreadId;
+	TBool iDirectToDrive;
+protected:
+	CSessionFs* iSession;
+	TOperation* iOperation;
+	TInt iDriveNumber;
+	TBool iIsCompleted;
+	TInt64 iScratchValue;
+	
+	TReqStates iReqState;
+
+	/** defines for iFlags
+	*/
+	enum TFsRequestFlags
+		{
+		EIsAllocated			= 0x01,
+		EFreeChanged			= 0x02,		// valid only for EFsFileWrite
+		EPostInterceptEnabled	= 0x04,
+		EPostOperation			= 0x08,
+		EFsObjectOpen			= 0x10,
+		};
+	TUint iFlags;
+
+	TInt iError;
+	};
+
+const TInt KOperationFunctionUnaltered = -1;
+
+NONSHARABLE_CLASS(CFsMessageRequest) : public CFsRequest
+	{
+public:
+	void Set(const RMessage2& aMessage,CSessionFs* aSession);
+	void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession);
+	void Set(const TOperation& aOperation);
+	inline void SetPostInitialise(TFsRequestFunc aCacheFunction);
+	//
+	inline void SetMessage(RMessage2& aMessage);
+	//
+	virtual void Process();
+	virtual void Complete(TInt aError);
+
+	virtual void Dispatch();
+	virtual void Free();
+	virtual TDrive* Drive();
+	virtual TDrive* SubstedDrive();
+	virtual void SetDrive(TDrive* aDrive);
+	virtual void SetSubstedDrive(TDrive* aDrive);
+	virtual const RMessage2& Message();
+
+	inline TBool IsFreeChanged();
+	inline void SetFreeChanged(TBool aChanged);
+
+	inline TBool PostInterceptEnabled();
+	inline void EnablePostIntercept(TBool aEnable);
+
+	inline TBool IsAllocated();
+	inline void SetAllocated();
+	inline CFsMessageRequest();
+	
+	TInt PushOperation(TInt64 aPos, TInt aLength, TUint8* aData, TInt aOffset = 0, TFsRequestFunc aCallback = NULL, TInt aNextState = 0, TInt aFunction = KOperationFunctionUnaltered);
+	TInt PushOperation(TInt64 aPos, TInt aLength, TDesC8* aData, TInt aOffset = 0, TFsRequestFunc aCallback = NULL, TInt aNextState = 0, TInt aFunction = KOperationFunctionUnaltered);
+	TInt PushOperation(TFsRequestFunc aCallback = NULL, TInt aNextState = 0, TInt aFunction = KOperationFunctionUnaltered);
+	void PopOperation();
+	void SetOperationFunc(TInt aFunction);
+	TMsgOperation& CurrentOperation();
+	inline TMsgOperation* CurrentOperationPtr();
+	void Dispatch(TBool aInitialise, TBool aLowPriority = EFalse, TBool aDispatchToFront = EFalse);
+
+	inline TInt& LastError();
+	inline void SetLastError(TInt aLastError);
+	inline void Init();
+	void ReStart();
+	TBool IsPluginRequest();
+	
+   // UID of the process to touching the file. (To be used in notification framework).
+   // TUid iUID;
+private:
+	void DoNotify(TInt aError);
+	TInt DoInitialise();
+	TInt PostInitialise();
+	TBool DispatchToPlugin();
+	void ProcessPostOperation();
+	void ProcessPreOperation();
+	void ProcessDriveOperation();
+	TBool CurrentPluginWaiting();
+	inline TInt DispatchToDrive(TBool aLowPriority, TBool aDispatchToFront);
+	TBool IsNotifierSpecific() const;
+	TBool IsNotifierSupported() const;
+protected:
+	RMessage2 iMessage;
+	TDrive* iDrive;
+	TDrive* iSubstedDrive;
+private:
+	TMsgOperation* iCurrentOperation;
+	TInt iLastError;
+	};
+
+
+NONSHARABLE_CLASS(TParsePool)
+	{
+private:
+	enum {KEBlockSize = 4};
+
+public:
+	static TInt			Init();
+	static TParsePool*	Get();
+	static void			Release(TParsePool* aObject);
+	TParsePool ();
+	TParse& GetObject() {return   iObject;};
+
+private:
+	TParsePool*        iNext;
+	TParsePool*        iPrev;
+
+	TBool              iFree;
+	TParse             iObject;
+	static TParsePool* iFreeHead;
+	static TParsePool* iClosedHead;
+	static TInt        iCountFree;
+	static RFastLock   iLock;
+	};
+
+	
+NONSHARABLE_CLASS(CFsClientMessageRequest) : public CFsMessageRequest
+	{
+public:
+    CFsClientMessageRequest();
+	virtual TParse& Src();
+	virtual TParse& Dest();
+	virtual void Free();
+	TInt AllocParseObjects(const TOperation& aOperation);
+public:
+	CFsClientMessageRequest* iNext;
+protected:
+	TParsePool* iPoolSrc;
+	TParsePool* iPoolDest;
+	};
+
+NONSHARABLE_CLASS(CFsDisconnectRequest) : public CFsMessageRequest
+	{
+public:
+	virtual void Process();
+	virtual void Dispatch();
+	virtual void Complete(TInt aError);
+	};
+
+NONSHARABLE_CLASS(CFsInternalRequest) : public CFsRequest
+	{
+public:
+	CFsInternalRequest();
+	void Set(const TOperation& aOperation,CSessionFs* aSession);
+	//
+	inline void SetThreadHandle(TInt aThreadHandle);
+	inline TInt ThreadHandle();
+	inline TRequestStatus& Status();
+	inline TBool IsAllocated();
+	inline void SetAllocated();
+	//
+	virtual void Process();
+	virtual void Complete(TInt aError);
+	virtual void Dispatch();
+	virtual void Free();
+private:
+	TUint iThreadHandle;
+	TRequestStatus iStatus;
+	TBool iIsAllocated;
+	};
+const TInt KMaxRequestAllocated		= 45;
+const TInt KMaxOperationAllocated	= KMaxRequestAllocated * 2;
+const TInt KAllocReqBlock=15;
+
+class TParseCon
+	{
+public:
+	TParse iParse;
+	TParseCon* iNext;
+	};
+
+
+class RequestAllocator
+	{
+public:
+	static TInt GetMessageRequest(const TOperation& aOperation,const RMessage2& aMessage,CFsClientMessageRequest* &aRequest);
+	static void FreeRequest(CFsClientMessageRequest* aRequest); // Use the one from cache
+	static void OpenSubFailed(CSessionFs* aSession); 
+	static TInt AllocRequest(TInt aNum);
+
+	static TInt AllocOperation();
+	static TInt GetOperation(TMsgOperation* &aOperation);
+	static void FreeOperation(TMsgOperation* aOperation);
+
+
+	static void Initialise();
+#if defined(_USE_CONTROLIO) || defined(_DEBUG) || defined(_DEBUG_RELEASE)
+	inline static TInt TotalCount();
+	static TInt CloseCount();
+	static TInt FreeCount();
+	inline static TInt AllocatedCount();
+private:
+	static TInt iAllocated;
+#endif
+public:
+	static RFastLock iCacheLock;
+private:
+	static TInt iAllocNum;
+	static CFsClientMessageRequest* iFreeHead;				
+	static CFsClientMessageRequest* iCloseHead;
+
+	static TInt iAllocNumOperation;
+	static TMsgOperation* iFreeHeadSupOp;
+	};
+
+
+NONSHARABLE_CLASS(CNotifyInfo) : public CBase
+	{
+public:
+	
+    enum TInfoType {EDiskSpace,EStdChange,EExtChange,EDebugChange,EDismount};
+
+public:
+	~CNotifyInfo();
+	void Initialise(TInfoType aType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
+	void Complete(TInt aError);
+	//
+	inline CSessionFs* Session();
+	inline TRequestStatus* Status();
+	inline TInfoType Type() const {return(iType);}
+public:
+	TDblQueLink iLink;
+protected:
+	TInfoType iType;
+	TRequestStatus* iStatus;
+	RMessagePtr2 iMessage;
+	CSessionFs* iSession;
+	};
+
+
+NONSHARABLE_CLASS(CStdChangeInfo) : public CNotifyInfo
+	{
+public:
+	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
+	TUint RequestNotifyType(CFsRequest* aRequest);
+	TBool IsMatching(CFsRequest* aRequest);
+protected:
+	TNotifyType iChangeType;
+	};
+
+NONSHARABLE_CLASS(CExtChangeInfo) : public CStdChangeInfo
+	{
+public:
+	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession,const TDesC& aName);
+	TBool IsMatching(CFsRequest* aRequest);
+private:
+	TFileName iName;
+	};
+
+NONSHARABLE_CLASS(CDiskSpaceInfo) : public CNotifyInfo
+	{
+public:
+	void Initialise(TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession,TInt64 aThreshold);
+	TBool IsMatching(TInt64& aBefore,TInt64& aAfter);
+private:
+	TInt64 iThreshold;
+	};
+
+NONSHARABLE_CLASS(CDebugChangeInfo) : public CNotifyInfo
+	{
+public:
+	void Initialise(TUint aDebugType,TRequestStatus* iStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
+	TBool IsMatching(TUint aChange);
+private:
+	TUint iDebugType;
+	};
+
+NONSHARABLE_CLASS(CDismountNotifyInfo) : public CNotifyInfo
+	{
+public:
+	~CDismountNotifyInfo();
+	void Initialise(TNotifyDismountMode aMode, TInt aDriveNumber,TRequestStatus* iStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
+	TBool IsMatching(TNotifyDismountMode aMode, TInt aDriveNumber, CSessionFs* aSession);
+private:
+	TNotifyDismountMode iMode;
+	TInt iDriveNumber;
+	};
+
+const TInt KMaxNotifyQues=KMaxDrives+1;
+const TInt KMaxDiskQues=KMaxDrives;	
+
+class TBaseQue
+	{
+protected:
+	TBaseQue();
+	~TBaseQue();
+	void DoAddNotify(CNotifyInfo* aInfo);
+	TBool DoCancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
+	void DoCancelAll(TInt aCompletionCode);
+	TBool IsEmpty();
+protected:
+	TDblQue<CNotifyInfo> iHeader;
+	RFastLock iQLock;
+	};
+
+class TChangeQue :public TBaseQue
+	{
+public:
+	TInt AddNotify(CNotifyInfo* aInfo);
+	TBool CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
+	void CancelAll(TInt aCompletionCode);
+	void CheckChange(CFsRequest* aRequest);
+	TBool IsEmpty();
+	};
+
+class TDiskSpaceQue : public TBaseQue
+	{
+public:
+	inline void SetDriveNumber(TInt aDriveNumber) {iDriveNumber=aDriveNumber;}
+	TInt AddNotify(CNotifyInfo* aInfo);
+	TInt CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
+	void CancelAll(TInt aCompletionCode);
+	void CheckDiskSpace();
+	void CheckDiskSpace(TInt64& aFreeDiskSpace);
+	TBool IsEmpty();
+private:
+	TInt GetFreeDiskSpace(TInt64& aFreeDiskSpace);
+private:
+	TInt64 iFreeDiskSpace;
+	TInt iDriveNumber;
+	TInt64 iReservedDiskSpace;
+	};
+
+class TDebugQue : public TBaseQue
+	{
+public:
+	TInt AddNotify(CNotifyInfo* aInfo);
+	TInt CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
+	void CancelAll(TInt aCompletionCode);
+	void CheckDebug(TUint aDebugChange);
+	};
+
+class TDismountNotifyQue : public TBaseQue
+	{
+public:
+	TInt AddNotify(CNotifyInfo* aInfo);
+	TInt CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
+	void CancelAll(TInt aCompletionCode);
+	void CheckDismount(TNotifyDismountMode aMode, TInt aDrive, TBool aRemove, TInt aError);
+	TBool HandlePendingDismount(CSessionFs* aSession, TInt aDrive);
+	};
+
+class FsNotify
+	{
+public:
+	static void Initialise();
+	static TInt AddChange(CNotifyInfo* aInfo,TInt aDrive);
+	static TInt AddDiskSpace(CNotifyInfo* aDiskInfo,TInt aDrive);
+	static TInt AddDebug(CNotifyInfo* aDebugInfo);
+	static TInt AddDismountNotify(CNotifyInfo* aDismountNotifyInfo);
+	static void DiskChange(TInt aDrive);
+	static void HandleChange(CFsRequest* aRequest,TInt aDrive);
+	static void HandleDiskSpace(CFsRequest* aRequest,TInt aDrive);
+	static void HandleDiskSpace(TInt aDrive, TInt64& aFreeSpace);
+	static void HandleDebug(TUint aFunction);
+	static void HandleDismount(TNotifyDismountMode aMode, TInt aDrive, TBool aRemove, TInt err);
+	static void CancelChangeSession(CSessionFs* aSession,TRequestStatus* aStatus=NULL);
+	static void CancelDiskSpaceSession(CSessionFs* aSession,TRequestStatus* aStatus=NULL);
+	static void CancelDebugSession(CSessionFs* aSession, TRequestStatus* aStatus=NULL);
+	static void CancelDismountNotifySession(CSessionFs* aSession, TRequestStatus* aStatus=NULL);
+	static void CancelSession(CSessionFs* aSession);
+	static TBool HandlePendingDismount(CSessionFs* aSession, TInt aDriveNumber);
+	static TBool IsChangeQueEmpty(TInt aDrive);
+	static TBool IsDiskSpaceQueEmpty(TInt aDrive);
+private:
+	static TInt ChangeIndex(TInt aDrive);
+private:
+	static TChangeQue iChangeQues[KMaxNotifyQues];
+	static TDiskSpaceQue iDiskSpaceQues[KMaxDiskQues];
+	static TDebugQue iDebugQue;
+	static TDismountNotifyQue iDismountNotifyQue;
+	};
+
+class CObjPromotion : public CFsObject
+	{
+public:
+	TInt UniqueID() const {return(CFsObject::UniqueID());}
+	};	
+
+NONSHARABLE_CLASS(CKernEventNotifier) : public CActive
+     {
+public:
+     static CKernEventNotifier* New(TInt aPriority=EPriorityStandard);
+     ~CKernEventNotifier();
+     void Start();
+     inline TInt Change() const {return iChange;}
+private:
+     CKernEventNotifier(TInt aPriority) : CActive(aPriority) {}
+     void RunL();
+     void DoCancel();
+private:
+     static TInt LocaleChangeCallback(TAny* aPtr=NULL);
+     TInt FreeMemoryChangeCallback();
+private:
+     TInt iChange;
+     RChangeNotifier iChangeNotifier;
+     };
+
+#if defined(_LOCKABLE_MEDIA)
+
+class TDelayedWriterInit
+	{
+public:
+	const TDesC *iFileName;
+	const TDesC8 *iData;
+	const TDesC *iSemName;
+	};
+
+
+class TDelayedWriter
+	{
+public:
+	TDelayedWriter();
+	~TDelayedWriter();
+
+	static TDelayedWriter *NewL(const TDelayedWriterInit *dwi);
+	void ConstructL(const TDelayedWriterInit *dwi);
+
+	HBufC *iFileName;
+	HBufC8 *iData;
+	};
+
+#endif
+
+extern CFsObjectConIx* TheContainer;
+extern CFsObjectCon* FileSystems;
+extern CFsObjectCon* Files;
+extern CFsObjectCon* FileShares;
+extern CFsObjectCon* Dirs;
+extern CFsObjectCon* Formats;
+extern CFsObjectCon* RawDisks;
+extern CFsObjectCon* Extensions;
+extern CFsObjectCon* ProxyDrives;
+
+extern CKernEventNotifier* TheKernEventNotifier;
+
+extern RThread TheServerThread;
+extern RAllocator* ServerThreadAllocator;
+
+extern CServerFs* TheFileServer;
+
+extern HBufC* TheDriveNames[];
+extern TDrive TheDrives[KMaxDrives];
+extern TFileName TheDefaultPath;
+extern RFTrace TheFtrace;
+
+extern SCapabilitySet AllCapabilities;
+extern SCapabilitySet DisabledCapabilities;
+
+const TInt KDispatchObjectClose=KMaxTInt-1;
+const TInt KSessionDisconnect=KMaxTInt-2;
+const TInt KCancelSession=KMaxTInt-3;
+const TInt KCancelPlugin=KMaxTInt-4;
+const TInt KFileShareClose=KMaxTInt-5;
+const TInt KFlushDirtyData=KMaxTInt-6;
+
+const TOperation DispatchObjectCloseOp=	{KDispatchObjectClose,	EInternalRequest,	&TFsCloseObject::Initialise,		NULL,	&TFsCloseObject::DoRequestL			};
+const TOperation SessionDisconnectOp=	{KSessionDisconnect,	EInternalRequest,	&TFsSessionDisconnect::Initialise,	NULL,	&TFsSessionDisconnect::DoRequestL	};
+const TOperation CancelSessionOp=		{KCancelSession,		EInternalRequest,	&TFsCancelSession::Initialise,		NULL,	&TFsCancelSession::DoRequestL		};
+const TOperation CancelPluginOp=		{KCancelPlugin,			EInternalRequest,	&TFsCancelPlugin::Initialise,		NULL,	&TFsCancelPlugin::DoRequestL		};
+const TOperation FileShareCloseOp=		{KFileShareClose,		EInternalRequest,	&TFsCloseFileShare::Initialise,		NULL,	&TFsCloseFileShare::DoRequestL		};
+const TOperation FlushDirtyDataOp=		{KFlushDirtyData,		EInternalRequest,	&TFsFlushDirtyData::Initialise,		NULL,	&TFsFlushDirtyData::DoRequestL		};
+
+extern TBool OpenOnDriveZOnly;
+extern TBool LocalFileSystemInitialized;
+extern TBool StartupInitCompleted;
+extern TBool RefreshZDriveCache;
+extern TBool CompFsMounted;
+extern TBool CompFsSync;
+
+ TInt InitializeLocalFileSystem(const TDesC& aName);
+ void InstallRomFileSystemL();
+ void InstallFatFileSystemL();
+ TInt InstallFileSystem(CFileSystem* aSys,RLibrary aLib);
+
+ TInt LoadFileSystem(const TDesC& aName);
+
+ CFsObject* SessionObjectFromHandle(TInt aHandle,TInt aUniqueID, CSessionFs* aSession);
+ CFileShare* GetShareFromHandle(CSessionFs* aSession, TInt aHandle);
+
+ TInt  ValidateDrive(TInt aDriveNumber,CFsRequest* aRequest);
+ TInt  ValidateDriveDoSubst(TInt aDriveNumber,CFsRequest* aRequest);
+ void  ValidateAtts(TUint anEntryAtt,TUint& aSetAttMask,TUint& aClearAttMask);
+ TInt  ParseSubstPtr0(CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
+ TInt  ParseNoWildSubstPtr0(CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
+ TInt  ParseNoWildSubstPtr1(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParseNoWildSubstCheckPtr0(CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
+ TInt  ParseNoWildSubstCheckPtr1(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParseNoWildSubstFileCheckPtr1(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParseNoWildSubstCheckPathPtr0(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParseNoWildSubstCheckPathPtr1(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParsePathPtr0(CFsRequest* aRequest,TParse& aParse);
+ TInt  ParseNotificationPath(CFsRequest* aRequest, TParse& aParse, TDes& aNotifyPath);
+ TBool IsIllegalFullName(const TDesC& aName);
+ TBool IsIllegalFullName(const TParse& aParse);
+ void  AddResource(CMountCB& aMount);
+ void  RemoveResource(CMountCB& aMount);
+ void  AddDiskAccess(CMountCB& aMount);
+ void  RemoveDiskAccess(CMountCB& aMount);
+ void  NextInPath(const TDesC& aPath,TPtrC& anEntry,TInt& aPos);
+ TBool PowerOk();
+ void  Get16BitDllName(TDes& aFileName, const TDesC8& aDllName);
+ void  Get8BitDllName(TDes8& aDllName, const TDesC& aFileName);
+ TInt  MatchUidType(const TUidType &aMatch, const TUidType &aType);
+ TBool IsWriteFunction(TInt aFunction);
+ TInt  InitLoader();
+ TInt  CheckDiskSpace(TInt64 aThreshold, CFsRequest* aRequest);
+ void  CheckForLeaveAfterOpenL(TInt leaveError, CFsRequest* aRequest, TInt aHandle);
+ TInt  ParseSubst(const TInt aP, CFsRequest* aRequest,TParse& aParse, TBool aUseSessionPath = ETrue);
+
+//#ifdef __DATA_CAGING__
+
+ TBool CompareResource(const TDesC & aThePath);
+
+#ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag);
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag);
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed = EFalse);
+#else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag);
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); 
+ TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, OnlyCreateWithNull aDiag, TBool aExactMatchAllowed = EFalse);
+#endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
+
+ TBool ComparePrivate(const TDesC & aThePath);
+ TBool CompareSystem(const TDesC & aThePath);
+ TBool SIDCheck(CFsRequest* aRequest, const TDesC& aThePath);
+ TBool ComparePaths(const TDesC& aPath1,const TDesC& aPath2);
+ TUint32 CalcNameHash(const TDesC& aName);
+
+const TInt KResourceLength			=	9;
+const TInt KSystemLength			=	4;
+const TInt KPrivateLength			=	8;
+const TInt KPrivateLengthCheck		=	17;
+const TInt KSIDLength				=	8;
+const TInt KSIDPathOffset			=	9;
+
+_LIT(KSlash, "\\");
+_LIT(KPrivate,"\\Private");
+_LIT(KPrivateSlash,"\\Private\\");
+_LIT(KSysHash,"?:\\Sys\\Hash\\");
+const TInt KBSlash='\\';
+const TInt KHashFileReadSize = 1024*8;
+
+
+const TInt KMsgPtr0	= 0;
+const TInt KMsgPtr1	= 1;
+const TInt KMsgPtr2	= 2;
+const TInt KMsgPtr3	= 3;
+
+const TInt KIpcFunctionMask = 0x0000ffff;
+const TInt KIpcFlagMask     = 0xffff0000;
+const TInt KIpcFlagOffset   = 16;
+
+#if defined(_DEBUG) || defined(_DEBUG_RELEASE)
+ void  PrintStartUpReason(TMachineStartupType aReason);
+ TPtrC GetFunctionName(TInt aFunction);
+ void  SimulateAllocFailure(TInt aFunctionReturnValue,TInt aFunction);
+
+extern TInt ErrorCondition;
+extern TInt ErrorCount;
+extern TUint32 DebugReg;
+extern TInt UserHeapAllocFailCount;
+extern TInt KernHeapAllocFailCount;
+extern TInt MessageCount;
+
+void PrintHeapSize(const TDesC& aMessage);
+
+extern TCorruptNameRec* gCorruptFileNameList;
+extern TCorruptLogRec* gCorruptLogRecordList;
+extern TInt gNumberOfCorruptHits;
+extern HBufC* gCorruptFileNamesListFile;
+#endif
+
+typedef TPckgBuf<TMediaPswdReplyNotifyInfoV1> TMediaPswdReplyNotifyInfoV1Buf;
+
+#if defined(__WINS__)
+ TInt MapWindowsFileName(TDes& aBuffer,const TDesC& aFileName);
+#endif
+
+enum TDllFindMethod {EFindInPath, EFindInSystemLibs, EFindInSystemBin, EFindExhausted};
+
+//---------------------------------------------------------------------------------------------------------------------
+
+NONSHARABLE_CLASS(CFileBody) : public CBase, public CFileCB::MExtendedFileInterface
+	{
+protected:
+	~CFileBody();
+	CFileBody(CFileCB* aFileCB, CFileCB::MExtendedFileInterface* aExtendedFileInterface);
+	void InitL();
+
+	TBool ExtendedFileInterfaceSupported();
+
+	// from MExtendedFileInterface	
+	virtual void ReadL(TInt64 aPos,TInt& aLength,TDes8* aDes,const RMessagePtr2& aMessage, TInt aOffset = 0);
+	virtual void WriteL(TInt64 aPos,TInt& aLength,const TDesC8* aDes,const RMessagePtr2& aMessage, TInt aOffset = 0);
+	virtual void SetSizeL(TInt64 aSize);
+
+
+private:
+	CFileCB* iFileCB;
+	CFileCB::MExtendedFileInterface* iExtendedFileInterface;
+	TInt iFairSchedulingLen;
+	TBool iNotifyAsyncReadersPending;
+	TBool iDeleteOnClose;
+
+protected:
+	TInt iPromotedShares;
+	RArray<TAsyncReadRequest>* iAsyncReadRequests;
+	CFileCache* iFileCache;	// pointer to owner CFileCache 
+	TBool iLocalBufferSupport;
+
+    /** 
+    maximum file size supported by the filesystem that instantiates the CFileCB, associated with this object.
+    For example, FAT32 supports files not larger than 4GB-1. Other file systems can support larger files. 
+    This member allows file server to know maximum allowed position in the file.
+    The default value is KMaxTUint64
+    */
+    TUint64 iMaxSupportedFileSize; 
+
+public:
+	// Provides support for large file size ( file size > 4GB - 1)
+	// Upper / High 32 bit word of the file size is saved here.
+	// This can be non-zero only if the CFileShare::iMode is ORed with EFileBigFile
+	// and the file size is > 4GB - 1.
+	// This shall be queried by CFileCB::Size64() from file systems or by direct access from file server
+	// This shall be updated by CFileCB::SetSize64() from file systems or by direct access from file server. 
+	TUint iSizeHigh;
+	
+protected:
+friend class CFileCB;
+friend class CFileCache;
+	};
+
+//---------------------------------------------------------------------------------------------------------------------
+
+NONSHARABLE_CLASS(CMountBody) : public CBase, public CMountCB::MFileAccessor, public CMountCB::MFileExtendedInterface
+	{
+protected:
+	CMountBody(CMountCB* aMountCB, CMountCB::MFileAccessor* aFileAccessor = NULL, CMountCB::MFileExtendedInterface* aFileInterface = NULL);
+	~CMountBody();
+
+	// Clamping support
+	TInt ClampFile(const TInt aDriveNo,const TDesC& aName,TAny* aHandle);
+	TInt UnclampFile(RFileClamp* aHandle);
+	TInt IsFileClamped(const TInt64 aUniqueId);
+	TInt NoOfClamps();
+
+	// Internal support clamping
+	static TInt CompareClampsByIdAndCount(const RFileClamp& aClampA, const RFileClamp& aClampB);
+	static TInt CompareClampsById(const RFileClamp& aClampA, const RFileClamp& aClampB);
+	static TInt FindClampByIdAndCount(const RFileClamp& aClampA, const RFileClamp& aClampB);
+	static TInt FindClampById(const RFileClamp& aClampA, const RFileClamp& aClampB);
+
+	// from MFileAccessor
+	virtual TInt GetFileUniqueId(const TDesC& aName, TInt64& aUniqueId);
+	virtual TInt Spare3(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+	virtual TInt Spare2(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+	virtual TInt Spare1(TInt aVal, TAny* aPtr1, TAny* aPtr2);
+	
+	// From MFileExtendedInterface
+	virtual void ReadSection64L(const TDesC& aName, TInt64 aPos, TAny* aTrg, TInt aLength, const RMessagePtr2& aMessage);
+
+	void SetProxyDriveDismounted();
+	TBool ProxyDriveDismounted();
+	
+
+    inline CFileSystem* GetFileSystem() const;
+    inline void SetFileSystem(CFileSystem* aFsys);
+
+private:
+	CMountCB* iMountCB;
+	RArray<RFileClamp> iClampIdentifiers;
+	TInt32 iClampCount;
+	CMountCB::MFileAccessor* iFileAccessor;
+	CMountCB::MFileExtendedInterface* iFileExtendedInterface;
+	TBool iProxyDriveDismounted;
+	CFileSystem* iFSys;  ///< link to the FileSystem object that has produced the mount (iMountCB)
+friend class CMountCB;
+	};
+
+
+#include "sf_ops.h"
+#include "sf_std.inl"
+
+
+#endif //SF_STD_H