201043_04
authorhgs
Mon, 01 Nov 2010 20:11:36 +0000
changeset 299 b5a01337d018
parent 297 b2826f67641f
201043_04
kernel/eka/drivers/locmedia/locmedia.cpp
kerneltest/f32test/group/bld.inf
kerneltest/f32test/group/t_tfsys_notify.mmp
kerneltest/f32test/server/t_notifier.cpp
kerneltest/f32test/server/t_notify.cpp
kerneltest/f32test/testfsys/t_tfsys_notify.cpp
kerneltest/f32test/testfsys/t_tfsys_notify.h
userlibandfileserver/fileserver/bmarm/efileu.def
userlibandfileserver/fileserver/bmarm/efsrvu.def
userlibandfileserver/fileserver/bwins/efileu.def
userlibandfileserver/fileserver/bwins/efsrvu.def
userlibandfileserver/fileserver/bx86/efileu.def
userlibandfileserver/fileserver/bx86/efsrvu.def
userlibandfileserver/fileserver/eabi/efileu.def
userlibandfileserver/fileserver/eabi/efsrvu.def
userlibandfileserver/fileserver/group/release.txt
userlibandfileserver/fileserver/inc/f32fsys.h
userlibandfileserver/fileserver/inc/f32notification.h
userlibandfileserver/fileserver/inc/f32ver.h
userlibandfileserver/fileserver/sfile/efile.mmh
userlibandfileserver/fileserver/sfile/sf_dat.cpp
userlibandfileserver/fileserver/sfile/sf_dir.cpp
userlibandfileserver/fileserver/sfile/sf_file.cpp
userlibandfileserver/fileserver/sfile/sf_file_cache.cpp
userlibandfileserver/fileserver/sfile/sf_file_cache.h
userlibandfileserver/fileserver/sfile/sf_local.cpp
userlibandfileserver/fileserver/sfile/sf_main.cpp
userlibandfileserver/fileserver/sfile/sf_mnt.cpp
userlibandfileserver/fileserver/sfile/sf_nbs.cpp
userlibandfileserver/fileserver/sfile/sf_notifier.cpp
userlibandfileserver/fileserver/sfile/sf_notifier.h
userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp
userlibandfileserver/fileserver/sfile/sf_notify.cpp
userlibandfileserver/fileserver/sfile/sf_ops.cpp
userlibandfileserver/fileserver/sfile/sf_ops.h
userlibandfileserver/fileserver/sfile/sf_pool.cpp
userlibandfileserver/fileserver/sfile/sf_pool.h
userlibandfileserver/fileserver/sfile/sf_request.cpp
userlibandfileserver/fileserver/sfile/sf_ses.cpp
userlibandfileserver/fileserver/sfile/sf_std.h
userlibandfileserver/fileserver/sfile/sf_svr.cpp
userlibandfileserver/fileserver/sfile/sf_utl.cpp
userlibandfileserver/fileserver/sfsrv/cl_notification.cpp
userlibandfileserver/fileserver/sfsrv/cl_notification.h
--- a/kernel/eka/drivers/locmedia/locmedia.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/kernel/eka/drivers/locmedia/locmedia.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -553,6 +553,26 @@
 #endif
 
 /*
+Acquires ownership of the (already opened) client thread object stored in TheCurrentThread::iExtTempObj
+by retrieving and then clearing iExtTempObj
+
+On exit TheCurrentThread::iExtTempObj should be NULL
+
+@see EControlSetMountInfo
+*/
+DThread* AcquireRemoteThread()
+	{
+	NKern::ThreadEnterCS();
+
+	DThread& t = Kern::CurrentThread();
+	DThread* remoteThread = (DThread*)__e32_atomic_swp_ord_ptr(&t.iExtTempObj, 0);
+
+	NKern::ThreadLeaveCS();
+	
+	return remoteThread;
+	}
+
+/*
  * Requests are passed in message as follows:
  * iValue	= request ID
  * iArg[0,1]= Position
@@ -744,6 +764,11 @@
 			if(!pM || r!=KErrNone)
 				break;
 
+#ifdef __DEMAND_PAGING__
+			// Clear existing mount info
+			UnlockMountInfo(*pM);
+#endif
+			
 			if (pM->iMountInfo.iThread)
 				{
 				NKern::ThreadEnterCS();
@@ -758,17 +783,11 @@
 						break;
 #endif
 					pM->iMountInfo.iInfo=(TDesC8*)m.RemoteDes();
-					pM->iMountInfo.iThread=m.RemoteThread();
+					pM->iMountInfo.iThread = AcquireRemoteThread();
 					}
 				else
 					{
-					//Clear existing mount info and close setting thread
-
-#ifdef __DEMAND_PAGING__
-					// unlock the mount info if this is a data paging media
-					UnlockMountInfo(*pM);
-#endif
-
+					// Close setting thread
 					pM->iMountInfo.iInfo=NULL;
 					pM->iMountInfo.iThread=NULL;
 					m.CloseRemoteThread();
@@ -794,7 +813,8 @@
 #endif
 
 				pM->iMountInfo.iInfo=(TDesC8*)m.RemoteDes();
-				pM->iMountInfo.iThread=m.RemoteThread();
+				pM->iMountInfo.iThread = AcquireRemoteThread();
+
 				NKern::ThreadLeaveCS();
 				r=KErrNone;
 				}
--- a/kerneltest/f32test/group/bld.inf	Tue Oct 26 12:49:20 2010 +0100
+++ b/kerneltest/f32test/group/bld.inf	Mon Nov 01 20:11:36 2010 +0000
@@ -99,6 +99,7 @@
 t_misc      
 t_nmbs      
 t_notify    
+t_tfsys_notify support
 t_dspace        
 t_open      
 t_parse     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/group/t_tfsys_notify.mmp	Mon Nov 01 20:11:36 2010 +0000
@@ -0,0 +1,40 @@
+// Copyright (c) 1997-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:
+// f32test/group/t_tfsys.mmp
+// 
+//
+
+TARGET			t_tfsys_notify.fsy
+TARGETTYPE		fsy
+
+SOURCEPATH	../testfsys
+SOURCE			t_tfsys_notify.cpp
+
+USERINCLUDE		../../../userlibandfileserver/fileserver/inc	    // assumes f32test and f32 components in same directory
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+LIBRARY			euser.lib efile.lib
+
+
+START WINS
+BASEADDRESS		0x61000000
+END
+
+
+UID		0x100039df 0x10000CEE
+VENDORID 0x70000001
+
+#include "../../../userlibandfileserver/fileserver/group/f32caps.mmh"  // Capabilities of File Server process
+
+SMPSAFE
--- a/kerneltest/f32test/server/t_notifier.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/kerneltest/f32test/server/t_notifier.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -23,6 +23,7 @@
 #include "t_server.h"
 #include "t_chlffs.h"
 #include "t_notify_plugin.h"
+#include "f32_test_utils.h"
 
 const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint));
 const TInt KMinNotificationBufferSize = 2*KNotificationHeaderSize + 2*KMaxFileName;
@@ -31,6 +32,9 @@
 RTest test(_L("T_NOTIFIER"));
 const TInt KMaxHeapSize = 0x800000;
 TInt globalDriveNum;
+TBuf<50> filesystem; //storing original file system name
+_LIT(KTestNotifyFileSystemExeName,"t_tfsys_notify.fsy");
+_LIT(KNotifyTestFileSystem,"CNotifyTestFileSystem");
 
 void DismountPlugin()
 	{
@@ -38,6 +42,24 @@
 	TheFs.RemovePlugin(KNotifyPluginFileName);
 	}
 
+void RemountOriginalFileSystem()
+    {
+    //Replace old FS.
+    TheFs.DismountFileSystem(KNotifyTestFileSystem,globalDriveNum);
+    TheFs.MountFileSystem(filesystem,globalDriveNum);
+    TheFs.RemoveFileSystem(KNotifyTestFileSystem);
+    }
+
+inline void safe_external_test(RTest& aTest, TInt aError, TInt aLine, TText* aName)
+    {
+    if(aError!=KErrNone)
+        {
+        test.Printf(_L(": ERROR : %d received on line %d\n"),aError,aLine);
+        RemountOriginalFileSystem();
+        aTest.operator()(aError==KErrNone,aLine,(TText*)aName);
+        }
+    }
+
 inline void safe_test(RTest& aTest, TInt aError, TInt aLine, TText* aName)
 	{
 	if(aError!=KErrNone)
@@ -519,7 +541,7 @@
 	if(_path.Match(fullname)!=KErrNone)
 		safe_test(simpleTestWatcher,KErrBadName,__LINE__,(TText*)Expand("t_notifier.cpp"));
 	
-	/*
+	
 	TInt driveNumber = 0;
 	TInt gDriveNum = -1;
 	notification->DriveNumber(driveNumber);
@@ -528,11 +550,11 @@
 		safe_test(simpleTestWatcher,KErrBadHandle,__LINE__,(TText*)Expand("t_notifier.cpp"));
 	
 	TUid uid;
-	TUint32 realUID = 0x76543210;
+	TInt32 realUID = 0x76543210;
 	r = notification->UID(uid);
 	safe_test(simpleTestWatcher,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
-	safe_test(simpleTestWatcher,(realUID == uid.iUid)==1,__LINE__,(TText*)Expand("t_notifier.cpp"));
-	*/
+	safe_test(simpleTestWatcher,((realUID == uid.iUid)?KErrNone:KErrNotFound),__LINE__,(TText*)Expand("t_notifier.cpp"));
+	
 	delete notify;
 	fs.Close();
 	simpleTestWatcher.End();
@@ -3621,6 +3643,138 @@
 	return KErrNone;
 	}
 
+_LIT(KPhantomExtendedReplace,"?:\\PhantomExtended_Replaced.txt");
+_LIT(KPhantomExtendedRenamed,"?:\\PhantomExtended_Renamed.txt");
+_LIT(KPhantomExtendedRenameMe,"?:\\PhantomExtended_RenameMe.txt");
+
+TInt DoTestExternalNotificationL()
+    {
+    TRequestStatus statusN, statusT;
+    RTimer timer1;
+    TTimeIntervalMicroSeconds32 time = 10000000;    
+    
+    test.Printf(_L("DoTestExternalNotification"));
+    CFsNotify* notify = CFsNotify::NewL(TheFs,1024);
+    TInt r = notify->AddNotification(TFsNotification::ECreate, _L("?:\\"),_L("PhantomExtended_Replaced.txt"));
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = notify->RequestNotifications(statusN);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    
+    RFile file;
+    r = file.Replace(TheFs,_L("\\Extended_Replaced.txt"),EFileWrite);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    file.Close();    
+    
+    r = timer1.CreateLocal();
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    timer1.After(statusT,time);
+    User::WaitForRequest(statusN,statusT);
+    test_Compare(statusN.Int(),!=,KRequestPending)
+    timer1.Cancel();
+    timer1.Close();
+    User::WaitForRequest(statusT);
+    
+    const TFsNotification* notification = notify->NextNotification();
+    if(!notification)
+        safe_external_test(test,KErrUnderflow,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    
+    //Check Path
+    TPtrC path;
+    r = notification->Path(path);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    
+    if(path.Match(KPhantomExtendedReplace)==KErrNotFound)
+        {
+        safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp"));
+        }
+   
+    //Check NewName
+    TPtrC newName;
+    r = notification->NewName(newName);
+    safe_external_test(test,(r==KErrNotSupported) ? KErrNone : r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    
+    notify->CancelNotifications(statusN);
+    delete notify;
+    
+    //*************************************************************
+    // Rename:
+    //*************************************************************
+    
+    notify = CFsNotify::NewL(TheFs,1024);
+    r = notify->AddNotification(TFsNotification::ERename, _L("?:\\"),_L("PhantomExtended_Renamed.txt"));
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = notify->RequestNotifications(statusN);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+
+    r = file.Replace(TheFs,_L("\\Extended_RenameMe.txt"),EFileWrite);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    file.Close();    
+
+    r = timer1.CreateLocal();
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    timer1.After(statusT,time);
+    User::WaitForRequest(statusN,statusT);
+    test_Compare(statusN.Int(),!=,KRequestPending)
+    timer1.Cancel();
+    timer1.Close();
+    User::WaitForRequest(statusT);
+
+    notification = notify->NextNotification();
+    if(!notification)
+        safe_external_test(test,KErrUnderflow,__LINE__,(TText*)Expand("t_notifier.cpp"));
+
+    r = notification->Path(path);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+
+    if(path.Match(KPhantomExtendedRenameMe)==KErrNotFound)
+        {
+        safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp"));
+        }
+    
+    //Check NewName
+    r = notification->NewName(newName);
+    if(newName.Match(KPhantomExtendedRenamed)==KErrNotFound)
+        {
+        safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp"));
+        }
+
+    notify->CancelNotifications(statusN);
+    delete notify;
+        
+    return KErrNone;
+    }
+
+void TestExternalNotifications()
+    {
+    test.Printf(_L("Test External Notifications (Load test file system)"));
+
+    if(F32_Test_Utils::Is_SimulatedSystemDrive(TheFs,globalDriveNum))
+        {
+        test.Printf(_L("Not testing External Notifications on SimulatedSystemDrive"));
+        return;
+        }
+
+    TInt r = TheFs.FileSystemName(filesystem,globalDriveNum);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = TheFs.DismountFileSystem(filesystem,globalDriveNum);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = TheFs.AddFileSystem(KTestNotifyFileSystemExeName);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = TheFs.MountFileSystem(KNotifyTestFileSystem,globalDriveNum);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    
+    TRAP(r,DoTestExternalNotificationL());
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+        
+    //Replace old FS.
+    r = TheFs.DismountFileSystem(KNotifyTestFileSystem,globalDriveNum);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = TheFs.MountFileSystem(filesystem,globalDriveNum);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    r = TheFs.RemoveFileSystem(KNotifyTestFileSystem);
+    safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp"));
+    }
+
 /*
  * This test is testing the use cases
  * and for negative testing of SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
@@ -4515,6 +4669,10 @@
 	test_KErrNone(r);
 	test.Printf(_L("------- End of Data-Caging Tests -------------------------------------\n"));
 	
+	PrintLine();
+	test.Next(_L("Test TestExternalNotifications()"));
+	TestExternalNotifications();
+	test.Printf(_L("------- End of TestExternalNotifications Tests -------------------------------------\n"));
 	
 	test.End();
 	test.Close();
--- a/kerneltest/f32test/server/t_notify.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/kerneltest/f32test/server/t_notify.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -31,6 +31,8 @@
 const TInt KNotifyChangeAfter=100000;
 const TInt KMediaRemountForceMediaChange = 0x00000001;
 
+TInt gDriveNum = -1;
+
 RTest test(_L("T_NOTIFY"));
 RSemaphore gSleepThread;
 TInt gSocketNumber=0;
@@ -4233,7 +4235,212 @@
 
 }
 
-
+_LIT(KTestNotifyFileSystemExeName,"t_tfsys_notify.fsy");
+_LIT(KNotifyTestFileSystem,"CNotifyTestFileSystem");
+
+TInt TestExternalNotificationsWellformedness()
+    {
+    //Do Something to cause a notification:
+ 
+    //********************************************
+    //
+    // Opening(Replacing) \\Wellformed_functionWrite, 
+    //             will issue a create notification on file \PhantomFile_functionWrite.txt
+    TRequestStatus status1, status2;
+    TheFs.NotifyChange(ENotifyFile,status1,_L("\\PhantomFile_functionReplace.txt"));
+    RFile file;
+    TInt r = file.Replace(TheFs,_L("\\Wellformed_functionReplace.txt"),EFileWrite);
+    test_KErrNone(r);
+
+    
+    RTimer timer1;
+    r = timer1.CreateLocal();
+    test_KErrNone(r);
+    TTimeIntervalMicroSeconds32 time = 10000000;
+    timer1.After(status2,time);
+    User::WaitForRequest(status1,status2);
+    test_Compare(status1.Int(),!=,KRequestPending)
+    timer1.Cancel();
+    timer1.Close();
+    User::WaitForRequest(status2);
+    
+    //********************************************
+    //
+    // Rename \Wellformed_functionWrite.txt --> \Wellformed_functionRename.txt, 
+    // will issue a rename notification on  \PhantomFile_functionWrite.txt --> \PhantomFile_functionRename.txt
+    TheFs.NotifyChange(ENotifyEntry,status1,_L("\\PhantomFile_functionRename.txt"));
+    r = file.Rename(_L("\\Wellformed_functionWrite.txt"));
+    test_KErrNone(r);
+
+    r = timer1.CreateLocal();
+    test_KErrNone(r);
+    timer1.After(status2,time);
+    User::WaitForRequest(status1,status2);
+    test_Compare(status1.Int(),!=,KRequestPending);
+    timer1.Cancel();
+    timer1.Close();
+    User::WaitForRequest(status2);
+    file.Close();
+    
+    //********************************************
+    //
+    // SetAttributes
+    //
+    TheFs.NotifyChange(ENotifyAttributes,status1,_L("\\PhantomFile_functionAttributes.txt"));
+    r = file.Open(TheFs,_L("\\Wellformed_functionAttributes.txt"),EFileWrite);
+    test_KErrNone(r);
+    r = file.SetAtt(KEntryAttHidden,KEntryAttSystem);
+    test_KErrNone(r);
+    
+    {
+        r = timer1.CreateLocal();
+        test_KErrNone(r);
+        timer1.After(status2,time);
+        User::WaitForRequest(status1,status2);
+        test_Compare(status1.Int(),!=,KRequestPending);
+        timer1.Cancel();
+        timer1.Close();
+        User::WaitForRequest(status2);
+    }
+    file.Close();
+    
+    //********************************************
+    //
+    // File Write
+    // \\Wellformed_functionWrite.txt -> \\PhantomFile_functionWrite.txt
+    //
+    TheFs.NotifyChange(ENotifyWrite,status1,_L("\\PhantomFile_functionWrite.txt"));
+    r = file.Replace(TheFs,_L("\\Wellformed_functionWrite.txt"),EFileWrite);
+    test_KErrNone(r);
+    TBuf8<4> blah;
+    blah.Append(_L("Blah"));
+    r = file.Write(blah);
+    test_KErrNone(r);
+    {
+        r = timer1.CreateLocal();
+        test_KErrNone(r);
+        timer1.After(status2,time);
+        User::WaitForRequest(status1,status2);
+        test_Compare(status1.Int(),!=,KRequestPending);
+        timer1.Cancel();
+        timer1.Close();
+        User::WaitForRequest(status2);
+    }
+    
+    file.Close();
+    return KErrNone;
+    }
+
+TInt TestExternalNotificationsMalformed()
+    {
+
+    TRequestStatus status1, status2;
+    RTimer timer1;
+    TInt r = timer1.CreateLocal();
+    test_KErrNone(r);
+    TTimeIntervalMicroSeconds32 time = 5000000;
+    
+    //********************************************
+    //
+    // Don't set file size
+    //
+    TheFs.NotifyChange(ENotifyWrite,status1,_L("\\PhantomFileMalformed_functionWrite.txt"));
+    RFile file;
+    r = file.Open(TheFs,_L("\\Malformed_functionWrite.txt"),EFileWrite);
+    test_KErrNone(r);
+    r = file.Write(_L8("abcd"));
+    test_Value(KErrArgument,r);
+    {
+        r = timer1.CreateLocal();
+        test_KErrNone(r);
+        timer1.After(status2,time);
+        test.Printf(_L("Wait for timeout.."));
+        User::WaitForRequest(status1,status2);
+        test_Compare(status1.Int(),==,KRequestPending);
+        timer1.Cancel();
+        timer1.Close();
+        TheFs.NotifyChangeCancel(status1);
+        User::WaitForRequest(status1);
+    }
+    
+    //********************************************
+    //
+    // Set new name incorrectly
+    //
+     TheFs.NotifyChange(ENotifyFile,status1,_L("\\PhantomFileMalformed_functionRename.txt"));
+     r = file.Rename(_L("\\Malformed_functionRename.txt"));
+     test_Value(KErrArgument,r);
+     {
+         r = timer1.CreateLocal();
+         test_KErrNone(r);
+         timer1.After(status2,time);
+         test.Printf(_L("Wait for timeout.."));
+         User::WaitForRequest(status1,status2);
+         test_Compare(status1.Int(),==,KRequestPending)
+         timer1.Cancel();
+         timer1.Close();
+         TheFs.NotifyChangeCancel(status1);
+         User::WaitForRequest(status1);
+     }
+    
+    
+    file.Close();
+    return KErrNone;
+    }
+
+void TestExternalNotifications()
+    {
+    test.Printf(_L("Test External Notifications (Load test file system)"));
+    
+    if(F32_Test_Utils::Is_SimulatedSystemDrive(TheFs,gDriveNum))
+        {
+        test.Printf(_L("Not testing External Notifications on SimulatedSystemDrive"));
+        return;
+        }
+    
+    test.Printf(_L("Test External Notifications (get file system name)"));
+    TBuf<50> filesystem;
+    TInt r = TheFs.FileSystemName(filesystem,gDriveNum);
+    test_KErrNone(r);
+    test.Printf(_L("Test External Notifications (add new file system)"));
+    r = TheFs.AddFileSystem(KTestNotifyFileSystemExeName);
+    if(r != KErrNone && r!=KErrAlreadyExists)
+        {
+        test_KErrNone(r);
+        }
+    test.Printf(_L("Test External Notifications (dismount existing file system)"));
+    r = TheFs.DismountFileSystem(filesystem,gDriveNum);
+    test_KErrNone(r);
+    test.Printf(_L("Test External Notifications (mount new file system)"));
+    r = TheFs.MountFileSystem(KNotifyTestFileSystem,gDriveNum);
+    test_KErrNone(r);
+    
+    CHECK_NO_PENDING_REQUESTS;
+    
+    test.Printf(_L("Test External Notifications (Perform tests)"));
+    r = TestExternalNotificationsWellformedness();
+    test_KErrNone(r); 
+    
+    CHECK_NO_PENDING_REQUESTS;
+    
+// only test this in UREL
+// as in DEBUG it PANICS.
+#if !defined _DEBUG
+    test.Printf(_L("Test External Notifications (Perform malformed tests (UREL only))"));
+    r = TestExternalNotificationsMalformed();
+    test_KErrNone(r); 
+    CHECK_NO_PENDING_REQUESTS;
+#endif
+    
+    test.Printf(_L("Test External Notifications (Replace FS)"));
+    //Replace old FS.
+    r = TheFs.DismountFileSystem(KNotifyTestFileSystem,gDriveNum);
+    test_KErrNone(r);
+    r = TheFs.MountFileSystem(filesystem,gDriveNum);
+    test_KErrNone(r);
+    r = TheFs.RemoveFileSystem(KNotifyTestFileSystem);
+    test_KErrNone(r);
+    }
 
 //-----------------------------------------------------------------------
 
@@ -4242,7 +4449,9 @@
 //
 GLDEF_C void CallTestsL()
 	{
-
+    TInt nRes=TheFs.CharToDrive(gDriveToTest, gDriveNum);
+    test_KErrNone(nRes);
+            
 	CreateTestDirectory(_L("\\F32-TST\\NOTIFY\\"));
 
 //	Test RFs::NotifyChange()
@@ -4358,4 +4567,6 @@
 	CHECK_NO_PENDING_REQUESTS;
     TestRootDirNotifyChange();
 	CHECK_NO_PENDING_REQUESTS;
+    TestExternalNotifications();
+    CHECK_NO_PENDING_REQUESTS;
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/testfsys/t_tfsys_notify.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -0,0 +1,310 @@
+// Copyright (c) 1997-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:
+// f32test\testfsys\t_tfsys.cpp
+// 
+//
+
+#include "t_tfsys_notify.h"
+
+
+const TInt KMajorVersionNumber=1;
+const TInt KMinorVersionNumber=0;
+
+void CTestNotificationMountCB::FileOpenL(const TDesC& aName,TUint /*aMode*/,TFileOpen /*anOpen*/,CFileCB* /*aFile*/)
+    {
+    RDebug::Print(_L("CTestMountCB::FileOpenL - aName = %S"),&aName);
+    
+    if(aName.Match(_L("\\Wellformed_functionReplace.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt
+        {
+        CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsFileReplace);
+        TBuf<KMaxFileName> phantomName;
+        phantomName.Append(_L("\\"));
+        phantomName.Append(_L("PhantomFile_functionReplace.txt"));
+        TInt r = notificationInfo->SetSourceName(phantomName);
+        User::LeaveIfError(r);
+        r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+        User::LeaveIfError(r);
+        r = IssueNotification(notificationInfo);
+        User::LeaveIfError(r);
+        CFsNotificationInfo::Free(notificationInfo);
+        return;
+        }
+    else if(aName.Match(_L("\\Extended_Replaced.txt"))!= KErrNotFound) //\\Extended_Replaced.txt
+        {
+        CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsFileReplace);
+        TBuf<KMaxFileName> phantomName;
+        phantomName.Append(_L("\\"));
+        phantomName.Append(_L("PhantomExtended_Replaced.txt"));
+        TInt r = notificationInfo->SetSourceName(phantomName);
+        User::LeaveIfError(r);
+        r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+        User::LeaveIfError(r);
+        r = IssueNotification(notificationInfo);
+        User::LeaveIfError(r);
+        CFsNotificationInfo::Free(notificationInfo);
+        return;       
+        }
+    else if(aName.Match(_L("\\Extended_RenameMe.txt"))!= KErrNotFound) //\\PhantomExtended_Renamed.txt
+        {
+        CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsRename);
+        TBuf<KMaxFileName> phantomName;
+        phantomName.Append(_L("\\"));
+        phantomName.Append(_L("PhantomExtended_RenameMe.txt"));
+        TInt r = notificationInfo->SetSourceName(phantomName);
+        User::LeaveIfError(r);
+        TBuf<KMaxFileName> phantomRename;
+        phantomRename.Append(_L("\\"));
+        phantomRename.Append(_L("PhantomExtended_Renamed.txt"));
+        r = notificationInfo->SetNewName(phantomRename);
+        User::LeaveIfError(r);
+        r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+        User::LeaveIfError(r);
+        r = IssueNotification(notificationInfo);
+        User::LeaveIfError(r);
+        CFsNotificationInfo::Free(notificationInfo);
+        return;       
+        }
+    
+ 
+    }
+
+void CTestNotificationFileCB::RenameL(const TDesC& /*aNewName*/)
+    {
+    RDebug::Print(_L("CTestNotificationFileCB::RenameL - aName = %S"),iFileName);
+    
+    if(iFileName->Match(_L("\\Wellformed_functionReplace.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt
+         {
+         CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileRename);
+         TBuf<KMaxFileName> phantomName;
+         phantomName.Append(_L("\\"));
+         phantomName.Append(_L("PhantomFile_functionReplace.txt"));
+         TInt r = notificationInfo->SetSourceName(phantomName);
+         User::LeaveIfError(r);
+         TBuf<KMaxFileName> phantomNewName;
+         phantomNewName.Append(_L("\\"));
+         phantomNewName.Append(_L("PhantomFile_functionRename.txt"));
+         r = notificationInfo->SetNewName(phantomNewName);
+         User::LeaveIfError(r);
+         r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+         User::LeaveIfError(r);
+         r = Mount().IssueNotification(notificationInfo);
+         User::LeaveIfError(r);
+         CFsNotificationInfo::Free(notificationInfo);
+         return;
+         }
+    
+    //MALFORMED
+    if(iFileName->Match(_L("\\Malformed_functionWrite.txt"))!=KErrNotFound)
+        {
+        CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileRename);
+        TBuf<KMaxFileName> phantomName;
+        phantomName.Append(_L("\\"));
+        phantomName.Append(_L("Malformed_functionWrite.txt"));
+        TInt r = notificationInfo->SetSourceName(phantomName);
+        User::LeaveIfError(r);
+        // Don't set NewName - Should cause error.
+        //      SetNewName(phantomNewName);
+        r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+        User::LeaveIfError(r);
+        r = Mount().IssueNotification(notificationInfo);
+        User::LeaveIfError(r);
+        CFsNotificationInfo::Free(notificationInfo);
+        return;
+        }
+    }
+
+void CTestNotificationFileCB::WriteL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/)
+    {
+    if(iFileName->Match(_L("\\Wellformed_functionWrite.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt
+         {
+         RDebug::Printf("CTestNotificationFileCB::WriteL - wellformed_functionWrite.txt");
+         CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileWrite);
+         TBuf<KMaxFileName> phantomName;
+         phantomName.Append(_L("\\"));
+         phantomName.Append(_L("PhantomFile_functionWrite.txt"));
+         TInt r = notificationInfo->SetSourceName(phantomName);
+         User::LeaveIfError(r);
+         r = notificationInfo->SetFilesize((TInt64)4);
+         User::LeaveIfError(r);
+         r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+         User::LeaveIfError(r);
+         r = Mount().IssueNotification(notificationInfo);
+         User::LeaveIfError(r);
+         CFsNotificationInfo::Free(notificationInfo);
+         return;
+         }
+    
+    //MALFORMED
+    if(iFileName->Match(_L("\\Malformed_functionWrite.txt"))!=KErrNotFound)
+        {
+        RDebug::Printf("CTestNotificationFileCB::WriteL - malformed_functionWrite.txt");
+        CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileWrite);
+        TBuf<KMaxFileName> phantomName;
+        phantomName.Append(_L("\\"));
+        phantomName.Append(_L("PhantomFileMalformed_functionWrite.txt"));
+        TInt r = notificationInfo->SetSourceName(phantomName);
+        User::LeaveIfError(r);
+        //We won't set filesize - which should result in an error.
+        //  SetFilesize((TInt64)4);
+        //
+        r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+        User::LeaveIfError(r);
+        r = Mount().IssueNotification(notificationInfo);
+        User::LeaveIfError(r);
+        CFsNotificationInfo::Free(notificationInfo);
+        return;
+        }
+            
+    }
+
+void CTestNotificationFileCB::SetEntryL(const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/)
+    {
+    if(iFileName->Match(_L("\\Wellformed_functionAttributes.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt
+         {
+         CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileSetAtt);
+         TBuf<KMaxFileName> phantomName;
+         phantomName.Append(_L("\\"));
+         phantomName.Append(_L("PhantomFile_functionAttributes.txt"));
+         TInt r = notificationInfo->SetSourceName(phantomName);
+         User::LeaveIfError(r);
+         r = notificationInfo->SetAttributes(KEntryAttSystem,KEntryAttHidden);
+         User::LeaveIfError(r);
+         r = notificationInfo->SetUid(TUid::Uid(KErrUnknown));
+         User::LeaveIfError(r);
+         r = Mount().IssueNotification(notificationInfo);
+         User::LeaveIfError(r);
+         CFsNotificationInfo::Free(notificationInfo);
+         return;
+         }
+    }
+
+CTestFileSystem::CTestFileSystem()
+//
+// Constructor
+//
+	{
+	__DECLARE_NAME(_S("CNotifyTestFileSystem"));
+	}
+
+CTestFileSystem::~CTestFileSystem()
+//
+// Destructor
+//
+	{}
+
+TInt CTestFileSystem::Install()
+//
+// Install the file system
+//
+	{
+	iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KF32BuildVersionNumber);
+	TPtrC name=_L("CNotifyTestFileSystem");
+	return(SetName(&name));
+	}
+
+CMountCB* CTestFileSystem::NewMountL() const
+//
+// Create a new mount control block
+//
+	{
+	return (new(ELeave) CTestNotificationMountCB);
+	}
+
+CFileCB* CTestFileSystem::NewFileL() const
+//
+// Create a new file
+//
+	{
+	return (new(ELeave) CTestNotificationFileCB);
+	}
+
+CDirCB* CTestFileSystem::NewDirL() const
+//
+// create a new directory lister
+//
+	{
+	return (new(ELeave) CTestDirCB);
+	}
+
+CFormatCB* CTestFileSystem::NewFormatL() const
+//
+// Create a new media formatter
+//
+	{
+	return (new(ELeave) CTestFormatCB);
+	}
+
+TInt CTestFileSystem::DefaultPath(TDes& aPath) const
+//
+// Return the intial default path
+//
+	{
+	aPath=_L("C:\\");
+	return (KErrNone);
+	}
+
+
+/**
+Reports whether the specified interface is supported - if it is,
+the supplied interface object is modified to it
+
+@param aInterfaceId     The interface of interest
+@param aInterface       The interface object
+@return                 KErrNone if the interface is supported, otherwise KErrNotFound 
+
+@see CFileSystem::GetInterface()
+*/
+TInt CTestFileSystem::GetInterface(TInt aInterfaceId, TAny*& aInterface,TAny* aInput)
+    {
+    switch(aInterfaceId)
+        {
+        case CFileSystem::EProxyDriveSupport: // The FAT Filesystem supports proxy drives
+			return KErrNone;
+
+        default:
+            return(CFileSystem::GetInterface(aInterfaceId, aInterface, aInput));
+        }
+    }
+
+CFileSystem* CTestFileSystem::NewL()
+//
+//
+//
+	{
+	CFileSystem* testFSys = new(ELeave) CTestFileSystem;
+	return testFSys;
+	}
+
+
+CTestNotificationMountCB::CTestNotificationMountCB(){};
+CTestNotificationMountCB::~CTestNotificationMountCB(){};
+CTestDirCB::CTestDirCB(){};
+CTestDirCB::~CTestDirCB(){};
+CTestNotificationFileCB::CTestNotificationFileCB(){};
+CTestNotificationFileCB::~CTestNotificationFileCB(){};
+CTestFormatCB::CTestFormatCB(){};
+CTestFormatCB::~CTestFormatCB(){};
+
+
+extern "C" {
+
+EXPORT_C CFileSystem* CreateFileSystem()
+//
+// Create a new file system
+//
+	{
+	return(CTestFileSystem::NewL());
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/testfsys/t_tfsys_notify.h	Mon Nov 01 20:11:36 2010 +0000
@@ -0,0 +1,110 @@
+// Copyright (c) 1997-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:
+// f32test\testfsys\t_tfsys.h
+// 
+//
+
+#include <f32file.h>
+#include "common.h"
+#include <f32fsys.h>
+#include <f32ver.h>
+#include <f32dbg.h>
+#include <e32svr.h>
+#include <f32plugin.h>
+
+class CTestNotificationMountCB : public CMountCB
+	{
+public:
+	CTestNotificationMountCB();
+	~CTestNotificationMountCB();
+	void MountL(TBool /*aForceMount*/){
+	    iUniqueID=0;
+	    iSize=(TUint)2 << 30; //2GB
+	    SetVolumeName(_L("TestNotificationFS").AllocL());
+	}
+	TInt ReMount(){return KErrNone;}
+	void Dismounted(){}
+	void VolumeL(TVolumeInfo& aVolume) const{
+	    aVolume.iFree = 1 << 30;
+	}
+	void SetVolumeL(TDes& /*aName*/){ }
+	void MkDirL(const TDesC& /*aName*/){}
+	void RmDirL(const TDesC& /*aName*/){}
+	void DeleteL(const TDesC& /*aName*/){}
+	void RenameL(const TDesC& /*aName*/,const TDesC& /*aNewName*/){}
+	void ReplaceL(const TDesC& /*anOldName*/,const TDesC& /*anNewName*/){}
+	void EntryL(const TDesC& /*aName*/,TEntry& /*anEntry*/) const{}
+	void SetEntryL(const TDesC& /*aName*/,const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/){}
+	void FileOpenL(const TDesC& /*aName*/,TUint /*aMode*/,TFileOpen /*anOpen*/,CFileCB* /*aFile*/);
+	void DirOpenL(const TDesC& /*aName*/,CDirCB* /*aDir*/){}
+	void RawReadL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aTrg*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/) const{}
+	void RawWriteL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aSrc*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/){}
+	void ReadUidL(const TDesC& /*aName*/,TEntry& /*anEntry*/) const{}
+	void GetShortNameL(const TDesC& /*aLongName*/,TDes& /*aShortName*/){}
+	void GetLongNameL(const TDesC& /*aShortName*/,TDes& /*aLongName*/){}
+	void IsFileInRom(const TDesC& /*aFileName*/,TUint8*& /*aFileStart*/){}
+	void ReadSectionL(const TDesC& /*aName*/,TInt /*aPos*/,TAny* /*aTrg*/,TInt /*aLength*/,const RMessagePtr2& /*aMessage*/){}
+	};
+
+
+
+class CTestNotificationFileCB : public CFileCB
+	{
+public:
+	CTestNotificationFileCB();
+	~CTestNotificationFileCB();
+	void RenameL(const TDesC& /*aNewName*/);
+	void ReadL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/){}
+	void WriteL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/);
+	TInt Address(TInt& /*aPos*/) const{return 0;}
+	void SetSizeL(TInt /*aSize*/){}
+	void SetEntryL(const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/);
+	void FlushDataL(){}
+	void FlushAllL(){}
+	void CheckPos(TInt /*aPos*/){}
+	};
+
+class CTestDirCB : public CDirCB
+	{
+public:
+	CTestDirCB();
+	~CTestDirCB();
+	void ReadL(TEntry& /*anEntry*/){}
+	};
+
+class CTestFormatCB : public CFormatCB
+	{
+public:
+	CTestFormatCB();
+	~CTestFormatCB();
+	void DoFormatStepL(){}
+	};
+
+class CTestFileSystem : public CFileSystem
+	{
+public:
+	CTestFileSystem();
+	~CTestFileSystem();
+	TInt Install();
+	TInt DefaultPath(TDes& aPath) const;
+	TBusLocalDrive& DriveNumberToLocalDrive(TInt aDriveNumber);
+	TInt GetInterface(TInt aInterfaceId, TAny*& aInterface,TAny* aInput);
+private:
+	CMountCB* NewMountL() const;
+	CFileCB* NewFileL() const;
+	CDirCB* NewDirL() const;
+	CFormatCB* NewFormatL() const;
+public:
+	static CFileSystem* NewL();
+	};
--- a/userlibandfileserver/fileserver/bmarm/efileu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bmarm/efileu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -242,3 +242,12 @@
 	Volume__C9RFsPluginR11TVolumeInfoi @ 241 NONAME R3UNUSED ; RFsPlugin::Volume(TVolumeInfo &, int) const
 	IsSequentialMode__C7CFileCB @ 242 NONAME R3UNUSED ; CFileCB::IsSequentialMode(void) const
 	DirectIOMode__7CFileCBRC12RMessagePtr2 @ 243 NONAME R3UNUSED ; CFileCB::DirectIOMode(RMessagePtr2 const &)
+	Allocate__19CFsNotificationInfoRC8CMountCBi @ 244 NONAME R3UNUSED ; CFsNotificationInfo::Allocate(CMountCB const &, int)
+	Free__19CFsNotificationInfoRP19CFsNotificationInfo @ 245 NONAME R3UNUSED ; CFsNotificationInfo::Free(CFsNotificationInfo *&)
+	IssueNotification__8CMountCBP19CFsNotificationInfo @ 246 NONAME R3UNUSED ; CMountCB::IssueNotification(CFsNotificationInfo *)
+	SetAttributes__19CFsNotificationInfoUiUi @ 247 NONAME R3UNUSED ; CFsNotificationInfo::SetAttributes(unsigned int, unsigned int)
+	SetFilesize__19CFsNotificationInfox @ 248 NONAME ; CFsNotificationInfo::SetFilesize(long long)
+	SetNewName__19CFsNotificationInfoRC7TDesC16 @ 249 NONAME R3UNUSED ; CFsNotificationInfo::SetNewName(TDesC16 const &)
+	SetSourceName__19CFsNotificationInfoRC7TDesC16 @ 250 NONAME R3UNUSED ; CFsNotificationInfo::SetSourceName(TDesC16 const &)
+	SetUid__19CFsNotificationInfoRC4TUid @ 251 NONAME R3UNUSED ; CFsNotificationInfo::SetUid(TUid const &)
+
--- a/userlibandfileserver/fileserver/bmarm/efsrvu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bmarm/efsrvu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -375,4 +375,6 @@
 	MountFileSystem__C14CFsMountHelper @ 374 NONAME R3UNUSED ; CFsMountHelper::MountFileSystem(void) const
 	New__14CFsMountHelperR3RFsi @ 375 NONAME R3UNUSED ; CFsMountHelper::New(RFs &, int)
 	"_._14CFsMountHelper" @ 376 NONAME R3UNUSED ; CFsMountHelper::~CFsMountHelper(void)
+	DriveNumber__C15TFsNotificationRi @ 377 NONAME R3UNUSED ; TFsNotification::DriveNumber(int &) const
+	UID__C15TFsNotificationR4TUid @ 378 NONAME R3UNUSED ; TFsNotification::UID(TUid &) const
 
--- a/userlibandfileserver/fileserver/bwins/efileu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bwins/efileu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -243,3 +243,12 @@
 	?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; int RFsPlugin::Volume(class TVolumeInfo &, int) const
 	?IsSequentialMode@CFileCB@@QBEHXZ @ 243 NONAME ; int CFileCB::IsSequentialMode(void) const
 	?DirectIOMode@CFileCB@@QAEHABVRMessagePtr2@@@Z @ 244 NONAME ; int CFileCB::DirectIOMode(class RMessagePtr2 const &)
+	?Allocate@CFsNotificationInfo@@SAPAV1@ABVCMountCB@@H@Z @ 245 NONAME ; class CFsNotificationInfo * CFsNotificationInfo::Allocate(class CMountCB const &, int)
+	?SetNewName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 246 NONAME ; int CFsNotificationInfo::SetNewName(class TDesC16 const &)
+	?IssueNotification@CMountCB@@QAEHPAVCFsNotificationInfo@@@Z @ 247 NONAME ; int CMountCB::IssueNotification(class CFsNotificationInfo *)
+	?SetUid@CFsNotificationInfo@@QAEHABVTUid@@@Z @ 248 NONAME ; int CFsNotificationInfo::SetUid(class TUid const &)
+	?Free@CFsNotificationInfo@@SAXAAPAV1@@Z @ 249 NONAME ; void CFsNotificationInfo::Free(class CFsNotificationInfo * &)
+	?SetFilesize@CFsNotificationInfo@@QAEH_J@Z @ 250 NONAME ; int CFsNotificationInfo::SetFilesize(long long)
+	?SetSourceName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 251 NONAME ; int CFsNotificationInfo::SetSourceName(class TDesC16 const &)
+	?SetAttributes@CFsNotificationInfo@@QAEHII@Z @ 252 NONAME ; int CFsNotificationInfo::SetAttributes(unsigned int, unsigned int)
+
--- a/userlibandfileserver/fileserver/bwins/efsrvu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bwins/efsrvu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -375,4 +375,6 @@
 	?GetMountProperties@CFsMountHelper@@QAEHXZ @ 374 NONAME ; public: int __thiscall CFsMountHelper::GetMountProperties(void)
 	?MountFileSystem@CFsMountHelper@@QBEHXZ @ 375 NONAME ; public: int __thiscall CFsMountHelper::MountFileSystem(void)const 
 	?New@CFsMountHelper@@SAPAV1@AAVRFs@@H@Z @ 376 NONAME ; public: static class CFsMountHelper * __cdecl CFsMountHelper::New(class RFs &,int)
+	?DriveNumber@TFsNotification@@QBEHAAH@Z @ 377 NONAME ; int TFsNotification::DriveNumber(int &) const
+	?UID@TFsNotification@@QBEHAAVTUid@@@Z @ 378 NONAME ; int TFsNotification::UID(class TUid &) const
 
--- a/userlibandfileserver/fileserver/bx86/efileu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bx86/efileu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -243,4 +243,12 @@
 	?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; public: int __thiscall RFsPlugin::Volume(class TVolumeInfo &,int)const 
 	?IsSequentialMode@CFileCB@@QBEHXZ @ 243 NONAME ; public: int __thiscall CFileCB::IsSequentialMode(void)const 
 	?DirectIOMode@CFileCB@@QAEHABVRMessagePtr2@@@Z @ 244 NONAME ; int CFileCB::DirectIOMode(class RMessagePtr2 const &)
+	?Allocate@CFsNotificationInfo@@SAPAV1@ABVCMountCB@@H@Z @ 245 NONAME ; public: static class CFsNotificationInfo * __cdecl CFsNotificationInfo::Allocate(class CMountCB const &,int)
+	?Free@CFsNotificationInfo@@SAXAAPAV1@@Z @ 246 NONAME ; public: static void __cdecl CFsNotificationInfo::Free(class CFsNotificationInfo * &)
+	?IssueNotification@CMountCB@@QAEHPAVCFsNotificationInfo@@@Z @ 247 NONAME ; public: int __thiscall CMountCB::IssueNotification(class CFsNotificationInfo *)
+	?SetAttributes@CFsNotificationInfo@@QAEHII@Z @ 248 NONAME ; public: int __thiscall CFsNotificationInfo::SetAttributes(unsigned int,unsigned int)
+	?SetFilesize@CFsNotificationInfo@@QAEH_J@Z @ 249 NONAME ; public: int __thiscall CFsNotificationInfo::SetFilesize(__int64)
+	?SetNewName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 250 NONAME ; public: int __thiscall CFsNotificationInfo::SetNewName(class TDesC16 const &)
+	?SetSourceName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 251 NONAME ; public: int __thiscall CFsNotificationInfo::SetSourceName(class TDesC16 const &)
+	?SetUid@CFsNotificationInfo@@QAEHABVTUid@@@Z @ 252 NONAME ; public: int __thiscall CFsNotificationInfo::SetUid(class TUid const &)
 
--- a/userlibandfileserver/fileserver/bx86/efsrvu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/bx86/efsrvu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -1,378 +1,380 @@
 EXPORTS
-    ??0CDir@@IAE@XZ @ 1 NONAME ; protected: __thiscall CDir::CDir(void)
-    ??0CFileBase@@IAE@AAVRFs@@@Z @ 2 NONAME ; protected: __thiscall CFileBase::CFileBase(class RFs &)
-    ??0TDriveUnit@@QAE@ABVTDesC16@@@Z @ 3 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(class TDesC16 const &)
-    ??0TDriveUnit@@QAE@H@Z @ 4 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(int)
-    ??0TEntryArray@@QAE@XZ @ 5 NONAME ; public: __thiscall TEntryArray::TEntryArray(void)
-    ??0TFileText@@QAE@XZ @ 6 NONAME ; public: __thiscall TFileText::TFileText(void)
-    ??0TFindFile@@QAE@AAVRFs@@@Z @ 7 NONAME ; public: __thiscall TFindFile::TFindFile(class RFs &)
-    ??0TOpenFileScan@@QAE@AAVRFs@@@Z @ 8 NONAME ; public: __thiscall TOpenFileScan::TOpenFileScan(class RFs &)
-    ??0TParseBase@@QAE@XZ @ 9 NONAME ; public: __thiscall TParseBase::TParseBase(void)
-    ??0TParsePtr@@QAE@AAVTDes16@@@Z @ 10 NONAME ; public: __thiscall TParsePtr::TParsePtr(class TDes16 &)
-    ??0TParsePtrC@@QAE@ABVTDesC16@@@Z @ 11 NONAME ; public: __thiscall TParsePtrC::TParsePtrC(class TDesC16 const &)
-    ??0TVolumeInfo@@QAE@XZ @ 12 NONAME ; public: __thiscall TVolumeInfo::TVolumeInfo(void)
-    ??1CDir@@UAE@XZ @ 13 NONAME ; public: virtual __thiscall CDir::~CDir(void)
-    ??1CDirScan@@UAE@XZ @ 14 NONAME ; public: virtual __thiscall CDirScan::~CDirScan(void)
-    ??1CFileBase@@MAE@XZ @ 15 NONAME ; protected: virtual __thiscall CFileBase::~CFileBase(void)
-    ??4TDriveUnit@@QAEAAV0@ABVTDesC16@@@Z @ 16 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(class TDesC16 const &)
-    ??4TDriveUnit@@QAEAAV0@H@Z @ 17 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(int)
-    ??ACDir@@QBEABVTEntry@@H@Z @ 18 NONAME ; public: class TEntry const & __thiscall CDir::operator[](int)const 
-    ??ATEntryArray@@QBEABVTEntry@@H@Z @ 19 NONAME ; public: class TEntry const & __thiscall TEntryArray::operator[](int)const 
-    ?AbbreviatedPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 20 NONAME ; public: class TPtrC16  __thiscall CDirScan::AbbreviatedPath(void)
-    ?AbbreviatedPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 21 NONAME ; public: class TPtrC16  __thiscall CFileBase::AbbreviatedPath(void)
-    ?AddDir@TParseBase@@QAEHABVTDesC16@@@Z @ 22 NONAME ; public: int __thiscall TParseBase::AddDir(class TDesC16 const &)
-    ?AddFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 23 NONAME ; public: int __thiscall RFs::AddFileSystem(class TDesC16 const &)const 
-    ?AddL@CDir@@IAEXABVTEntry@@@Z @ 24 NONAME ; protected: void __thiscall CDir::AddL(class TEntry const &)
-    ?Att@RFile@@QBEHAAI@Z @ 25 NONAME ; public: int __thiscall RFile::Att(unsigned int &)const 
-    ?Att@RFs@@QBEHABVTDesC16@@AAI@Z @ 26 NONAME ; public: int __thiscall RFs::Att(class TDesC16 const &,unsigned int &)const 
-    ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@I@Z @ 27 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int)
-    ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@IAAVTRequestStatus@@@Z @ 28 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int,class TRequestStatus &)
-    ?BytesTransferredByCopyStep@CFileMan@@QAEHXZ @ 29 NONAME ; public: int __thiscall CFileMan::BytesTransferredByCopyStep(void)
-    ?ChangeMode@RFile@@QAEHW4TFileMode@@@Z @ 30 NONAME ; public: int __thiscall RFile::ChangeMode(enum TFileMode)
-    ?CharToDrive@RFs@@SAHVTChar@@AAH@Z @ 31 NONAME ; public: static int __cdecl RFs::CharToDrive(class TChar,int &)
-    ?CheckDisk@RFs@@QBEHABVTDesC16@@@Z @ 32 NONAME ; public: int __thiscall RFs::CheckDisk(class TDesC16 const &)const 
-    ?ClearPassword@RFs@@QAEHHABV?$TBuf8@$0BA@@@@Z @ 33 NONAME ; public: int __thiscall RFs::ClearPassword(int,class TBuf8<16> const &)
-    ?Duplicate@RFile@@QAEHABV1@W4TOwnerType@@@Z @ 34 NONAME ; public: int __thiscall RFile::Duplicate(class RFile const &,enum TOwnerType)
-    ?Close@RRawDisk@@QAEXXZ @ 35 NONAME ; public: void __thiscall RRawDisk::Close(void)
-    ?Compress@CDir@@IAEXXZ @ 36 NONAME ; protected: void __thiscall CDir::Compress(void)
-    ?Connect@RFs@@QAEHH@Z @ 37 NONAME ; public: int __thiscall RFs::Connect(int)
-    ?ConstructL@CFileBase@@IAEXXZ @ 38 NONAME ; protected: void __thiscall CFileBase::ConstructL(void)
-    ?ControlIo@RFs@@QAEHHHPAX0@Z @ 39 NONAME ; public: int __thiscall RFs::ControlIo(int,int,void *,void *)
-    ?Copy@CFileMan@@QAEHABVTDesC16@@0I@Z @ 40 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int)
-    ?Copy@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 41 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
-    ?Count@CDir@@QBEHXZ @ 42 NONAME ; public: int __thiscall CDir::Count(void)const 
-    ?Count@TEntryArray@@QBEHXZ @ 43 NONAME ; public: int __thiscall TEntryArray::Count(void)const 
-    ?Create@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 44 NONAME ; public: int __thiscall RFile::Create(class RFs &,class TDesC16 const &,unsigned int)
-    ?CurrentAction@CFileMan@@QAE?AW4TAction@1@XZ @ 45 NONAME ; public: enum CFileMan::TAction  __thiscall CFileMan::CurrentAction(void)
-    ?CurrentEntry@CFileBase@@QAEABVTEntry@@XZ @ 46 NONAME ; public: class TEntry const & __thiscall CFileBase::CurrentEntry(void)
-    ?DefaultPath@RFs@@QBEHAAVTDes16@@@Z @ 47 NONAME ; public: int __thiscall RFs::DefaultPath(class TDes16 &)const 
-    ?Delete@CFileMan@@QAEHABVTDesC16@@I@Z @ 48 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int)
-    ?Delete@CFileMan@@QAEHABVTDesC16@@IAAVTRequestStatus@@@Z @ 49 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int,class TRequestStatus &)
-    ?Delete@RFs@@QAEHABVTDesC16@@@Z @ 50 NONAME ; public: int __thiscall RFs::Delete(class TDesC16 const &)
-    ?DismountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 51 NONAME ; public: int __thiscall RFs::DismountFileSystem(class TDesC16 const &,int)const 
-    ?Drive@RFs@@QBEHAAVTDriveInfo@@H@Z @ 52 NONAME ; public: int __thiscall RFs::Drive(class TDriveInfo &,int)const 
-    ?Drive@TParseBase@@QBE?AVTPtrC16@@XZ @ 53 NONAME ; public: class TPtrC16  __thiscall TParseBase::Drive(void)const 
-    ?DriveAndPath@TParseBase@@QBE?AVTPtrC16@@XZ @ 54 NONAME ; public: class TPtrC16  __thiscall TParseBase::DriveAndPath(void)const 
-    ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z @ 55 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &)const 
-    ?DrivePresent@TParseBase@@QBEHXZ @ 56 NONAME ; public: int __thiscall TParseBase::DrivePresent(void)const 
-    ?DriveToChar@RFs@@SAHHAAVTChar@@@Z @ 57 NONAME ; public: static int __cdecl RFs::DriveToChar(int,class TChar &)
-    ?Entry@RFs@@QBEHABVTDesC16@@AAVTEntry@@@Z @ 58 NONAME ; public: int __thiscall RFs::Entry(class TDesC16 const &,class TEntry &)const 
-    ?Ext@TParseBase@@QBE?AVTPtrC16@@XZ @ 59 NONAME ; public: class TPtrC16  __thiscall TParseBase::Ext(void)const 
-    ?ExtPresent@TParseBase@@QBEHXZ @ 60 NONAME ; public: int __thiscall TParseBase::ExtPresent(void)const 
-    ?ExtractL@CDir@@IAEXHAAPAV1@@Z @ 61 NONAME ; protected: void __thiscall CDir::ExtractL(int,class CDir * &)
-    ?FileSystemName@RFs@@QBEHAAVTDes16@@H@Z @ 62 NONAME ; public: int __thiscall RFs::FileSystemName(class TDes16 &,int)const 
-    ?Find@TFindFile@@QAEHXZ @ 63 NONAME ; public: int __thiscall TFindFile::Find(void)
-    ?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z @ 64 NONAME ; public: int __thiscall TFindFile::FindByDir(class TDesC16 const &,class TDesC16 const &)
-    ?FindByPath@TFindFile@@QAEHABVTDesC16@@PBV2@@Z @ 65 NONAME ; public: int __thiscall TFindFile::FindByPath(class TDesC16 const &,class TDesC16 const *)
-    ?FindWild@TFindFile@@QAEHAAPAVCDir@@@Z @ 66 NONAME ; public: int __thiscall TFindFile::FindWild(class CDir * &)
-    ?FindWildByDir@TFindFile@@QAEHABVTDesC16@@0AAPAVCDir@@@Z @ 67 NONAME ; public: int __thiscall TFindFile::FindWildByDir(class TDesC16 const &,class TDesC16 const &,class CDir * &)
-    ?FindWildByPath@TFindFile@@QAEHABVTDesC16@@PBV2@AAPAVCDir@@@Z @ 68 NONAME ; public: int __thiscall TFindFile::FindWildByPath(class TDesC16 const &,class TDesC16 const *,class CDir * &)
-    ?Flush@RFile@@QAEHXZ @ 69 NONAME ; public: int __thiscall RFile::Flush(void)
-    ?FullName@TParseBase@@QBEABVTDesC16@@XZ @ 70 NONAME ; public: class TDesC16 const & __thiscall TParseBase::FullName(void)const 
-    ?FullPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 71 NONAME ; public: class TPtrC16  __thiscall CDirScan::FullPath(void)
-    ?FullPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 72 NONAME ; public: class TPtrC16  __thiscall CFileBase::FullPath(void)
-    ?GetCurrentSource@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 73 NONAME ; public: void __thiscall CFileMan::GetCurrentSource(class TBuf<256> &)
-    ?GetCurrentTarget@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 74 NONAME ; public: void __thiscall CFileMan::GetCurrentTarget(class TBuf<256> &)
-    ?GetDir@RFs@@QBEHABVTDesC16@@ABVTUidType@@IAAPAVCDir@@@Z @ 75 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,class TUidType const &,unsigned int,class CDir * &)const 
-    ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@1@Z @ 76 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &,class CDir * &)const 
-    ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@@Z @ 77 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &)const 
-    ?GetDriveName@RFs@@QBEHHAAVTDes16@@@Z @ 78 NONAME ; public: int __thiscall RFs::GetDriveName(int,class TDes16 &)const 
-    ?GetLastError@CFileBase@@QAEHXZ @ 79 NONAME ; public: int __thiscall CFileBase::GetLastError(void)
-    ?GetLongName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 80 NONAME ; public: int __thiscall RFs::GetLongName(class TDesC16 const &,class TDes16 &)const 
-    ?GetMoreInfoAboutError@CFileBase@@QAE?AW4TFileManError@@XZ @ 81 NONAME ; public: enum TFileManError  __thiscall CFileBase::GetMoreInfoAboutError(void)
-    ?GetNotifyUser@RFs@@QAEHXZ @ 82 NONAME ; public: int __thiscall RFs::GetNotifyUser(void)
-    ?GetShortName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 83 NONAME ; public: int __thiscall RFs::GetShortName(class TDesC16 const &,class TDes16 &)const 
-    ?IsArchive@TEntry@@QBEHXZ @ 84 NONAME ; public: int __thiscall TEntry::IsArchive(void)const 
-    ?IsDir@TEntry@@QBEHXZ @ 85 NONAME ; public: int __thiscall TEntry::IsDir(void)const 
-    ?IsExtWild@TParseBase@@QBEHXZ @ 86 NONAME ; public: int __thiscall TParseBase::IsExtWild(void)const 
-    ?IsFileInRom@RFs@@QBEPAEABVTDesC16@@@Z @ 87 NONAME ; public: unsigned char * __thiscall RFs::IsFileInRom(class TDesC16 const &)const 
-    ?IsFileOpen@RFs@@QBEHABVTDesC16@@AAH@Z @ 88 NONAME ; public: int __thiscall RFs::IsFileOpen(class TDesC16 const &,int &)const 
-    ?IsHidden@TEntry@@QBEHXZ @ 89 NONAME ; public: int __thiscall TEntry::IsHidden(void)const 
-    ?IsKMatchAny@TParseBase@@QBEHXZ @ 90 NONAME ; public: int __thiscall TParseBase::IsKMatchAny(void)const 
-    ?IsKMatchOne@TParseBase@@QBEHXZ @ 91 NONAME ; public: int __thiscall TParseBase::IsKMatchOne(void)const 
-    ?IsNameWild@TParseBase@@QBEHXZ @ 92 NONAME ; public: int __thiscall TParseBase::IsNameWild(void)const 
-    ?IsReadOnly@TEntry@@QBEHXZ @ 93 NONAME ; public: int __thiscall TEntry::IsReadOnly(void)const 
-    ?IsRomAddress@RFs@@SAHPAX@Z @ 94 NONAME ; public: static int __cdecl RFs::IsRomAddress(void *)
-    ?IsRoot@TParseBase@@QBEHXZ @ 95 NONAME ; public: int __thiscall TParseBase::IsRoot(void)const 
-    ?IsSystem@TEntry@@QBEHXZ @ 96 NONAME ; public: int __thiscall TEntry::IsSystem(void)const 
-    ?IsValidDrive@RFs@@SAHH@Z @ 97 NONAME ; public: static int __cdecl RFs::IsValidDrive(int)
-    ?IsValidName@RFs@@QBEHABVTDesC16@@@Z @ 98 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &)const 
-    ?IsValidName@RFs@@QBEHABVTDesC16@@AAG@Z @ 99 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,unsigned short &)const 
-    ?IsWild@TParseBase@@QBEHXZ @ 100 NONAME ; public: int __thiscall TParseBase::IsWild(void)const 
-    ?LoaderHeapFunction@RFs@@QAEHHPAX0@Z @ 101 NONAME ; public: int __thiscall RFs::LoaderHeapFunction(int,void *,void *)
-    ?Lock@RFile@@QBEHHH@Z @ 102 NONAME ; public: int __thiscall RFile::Lock(int,int)const 
-    ?LockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@0H@Z @ 103 NONAME ; public: int __thiscall RFs::LockDrive(int,class TBuf8<16> const &,class TBuf8<16> const &,int)
-    ?MkDir@RFs@@QAEHABVTDesC16@@@Z @ 104 NONAME ; public: int __thiscall RFs::MkDir(class TDesC16 const &)
-    ?MkDirAll@RFs@@QAEHABVTDesC16@@@Z @ 105 NONAME ; public: int __thiscall RFs::MkDirAll(class TDesC16 const &)
-    ?Modified@RFile@@QBEHAAVTTime@@@Z @ 106 NONAME ; public: int __thiscall RFile::Modified(class TTime &)const 
-    ?Modified@RFs@@QBEHABVTDesC16@@AAVTTime@@@Z @ 107 NONAME ; public: int __thiscall RFs::Modified(class TDesC16 const &,class TTime &)const 
-    ?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 108 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int)const 
-    ?Move@CFileMan@@QAEHABVTDesC16@@0I@Z @ 109 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int)
-    ?Move@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 110 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
-    ?Name@TDriveUnit@@QBE?AV?$TBuf@$01@@XZ @ 111 NONAME ; public: class TBuf<2>  __thiscall TDriveUnit::Name(void)const 
-    ?Name@TParseBase@@QBE?AVTPtrC16@@XZ @ 112 NONAME ; public: class TPtrC16  __thiscall TParseBase::Name(void)const 
-    ?NameAndExt@TParseBase@@QBE?AVTPtrC16@@XZ @ 113 NONAME ; public: class TPtrC16  __thiscall TParseBase::NameAndExt(void)const 
-    ?NameBuf@TParse@@MAEAAVTDes16@@XZ @ 114 NONAME ; protected: virtual class TDes16 & __thiscall TParse::NameBuf(void)
-    ?NameBuf@TParsePtr@@MAEAAVTDes16@@XZ @ 115 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtr::NameBuf(void)
-    ?NameBuf@TParsePtrC@@MAEAAVTDes16@@XZ @ 116 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtrC::NameBuf(void)
-    ?NameBufC@TParse@@MBEABVTDesC16@@XZ @ 117 NONAME ; protected: virtual class TDesC16 const & __thiscall TParse::NameBufC(void)const 
-    ?NameBufC@TParsePtr@@MBEABVTDesC16@@XZ @ 118 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtr::NameBufC(void)const 
-    ?NameBufC@TParsePtrC@@MBEABVTDesC16@@XZ @ 119 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtrC::NameBufC(void)const 
-    ?NameOrExtPresent@TParseBase@@QBEHXZ @ 120 NONAME ; public: int __thiscall TParseBase::NameOrExtPresent(void)const 
-    ?NamePresent@TParseBase@@QBEHXZ @ 121 NONAME ; public: int __thiscall TParseBase::NamePresent(void)const 
-    ?NewL@CDir@@KAPAV1@XZ @ 122 NONAME ; protected: static class CDir * __cdecl CDir::NewL(void)
-    ?NewL@CDirScan@@SAPAV1@AAVRFs@@@Z @ 123 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewL(class RFs &)
-    ?NewL@CFileMan@@SAPAV1@AAVRFs@@@Z @ 124 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &)
-    ?NewL@CFileMan@@SAPAV1@AAVRFs@@PAVMFileManObserver@@@Z @ 125 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &,class MFileManObserver *)
-    ?NewLC@CDirScan@@SAPAV1@AAVRFs@@@Z @ 126 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewLC(class RFs &)
-    ?Next@RFormat@@QAEHAAH@Z @ 127 NONAME ; public: int __thiscall RFormat::Next(int &)
-    ?Next@RFormat@@QAEXAAV?$TPckgBuf@H@@AAVTRequestStatus@@@Z @ 128 NONAME ; public: void __thiscall RFormat::Next(class TPckgBuf<int> &,class TRequestStatus &)
-    ?NextL@CDirScan@@QAEXAAPAVCDir@@@Z @ 129 NONAME ; public: void __thiscall CDirScan::NextL(class CDir * &)
-    ?NextL@TOpenFileScan@@QAEXAAPAVCDir@@@Z @ 130 NONAME ; public: void __thiscall TOpenFileScan::NextL(class CDir * &)
-    ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@@Z @ 131 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &)
-    ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@ABVTDesC16@@@Z @ 132 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &,class TDesC16 const &)
-    ?NotifyChangeCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 133 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(class TRequestStatus &)
-    ?NotifyChangeCancel@RFs@@QAEXXZ @ 134 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(void)
-    ?NotifyFileManEnded@MFileManObserver@@UAE?AW4TControl@1@XZ @ 135 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManEnded(void)
-    ?NotifyFileManOperation@MFileManObserver@@UAE?AW4TControl@1@XZ @ 136 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManOperation(void)
-    ?NotifyFileManStarted@MFileManObserver@@UAE?AW4TControl@1@XZ @ 137 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManStarted(void)
-    ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@ABVTUidType@@@Z @ 138 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,class TUidType const &)
-    ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 139 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,unsigned int)
-    ?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 140 NONAME ; public: int __thiscall RFile::Open(class RFs &,class TDesC16 const &,unsigned int)
-    ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAH@Z @ 141 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &)
-    ?Open@RRawDisk@@QAEHAAVRFs@@H@Z @ 142 NONAME ; public: int __thiscall RRawDisk::Open(class RFs &,int)
-    ?Parse@RFs@@QBEHABVTDesC16@@0AAVTParse@@@Z @ 143 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TDesC16 const &,class TParse &)const 
-    ?Parse@RFs@@QBEHABVTDesC16@@AAVTParse@@@Z @ 144 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TParse &)const 
-    ?Path@TParseBase@@QBE?AVTPtrC16@@XZ @ 145 NONAME ; public: class TPtrC16  __thiscall TParseBase::Path(void)const 
-    ?PathPresent@TParseBase@@QBEHXZ @ 146 NONAME ; public: int __thiscall TParseBase::PathPresent(void)const 
-    ?PopDir@TParseBase@@QAEHXZ @ 147 NONAME ; public: int __thiscall TParseBase::PopDir(void)
-    ?Read@RDir@@QBEHAAVTEntry@@@Z @ 148 NONAME ; public: int __thiscall RDir::Read(class TEntry &)const 
-    ?Read@RDir@@QBEHAAVTEntryArray@@@Z @ 149 NONAME ; public: int __thiscall RDir::Read(class TEntryArray &)const 
-    ?Read@RDir@@QBEXAAV?$TPckg@VTEntry@@@@AAVTRequestStatus@@@Z @ 150 NONAME ; public: void __thiscall RDir::Read(class TPckg<class TEntry> &,class TRequestStatus &)const 
-    ?Read@RDir@@QBEXAAVTEntryArray@@AAVTRequestStatus@@@Z @ 151 NONAME ; public: void __thiscall RDir::Read(class TEntryArray &,class TRequestStatus &)const 
-    ?Read@RFile@@QBEHAAVTDes8@@@Z @ 152 NONAME ; public: int __thiscall RFile::Read(class TDes8 &)const 
-    ?Read@RFile@@QBEHAAVTDes8@@H@Z @ 153 NONAME ; public: int __thiscall RFile::Read(class TDes8 &,int)const 
-    ?Read@RFile@@QBEHHAAVTDes8@@@Z @ 154 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &)const 
-    ?Read@RFile@@QBEHHAAVTDes8@@H@Z @ 155 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &,int)const 
-    ?Read@RFile@@QBEXAAVTDes8@@AAVTRequestStatus@@@Z @ 156 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,class TRequestStatus &)const 
-    ?Read@RFile@@QBEXAAVTDes8@@HAAVTRequestStatus@@@Z @ 157 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,int,class TRequestStatus &)const 
-    ?Read@RFile@@QBEXHAAVTDes8@@AAVTRequestStatus@@@Z @ 158 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,class TRequestStatus &)const 
-    ?Read@RFile@@QBEXHAAVTDes8@@HAAVTRequestStatus@@@Z @ 159 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,int,class TRequestStatus &)const 
-    ?Read@_RRawDisk@@QAEHHAAVTDes8@@@Z @ 160 NONAME ; public: int __thiscall _RRawDisk::Read(int,class TDes8 &)
-    ?Read@TFileText@@QAEHAAVTDes16@@@Z @ 161 NONAME ; public: int __thiscall TFileText::Read(class TDes16 &)
-    ?ReadFileSection_RESERVED@RFs@@ABEHABVTDesC16@@HAAVTDes8@@H@Z @ 162 NONAME ; public: int __thiscall RFs::ReadFileSection_RESERVED(class TDesC16 const &,int,class TDes8 &,int)const 
-    ?RealName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 163 NONAME ; public: int __thiscall RFs::RealName(class TDesC16 const &,class TDes16 &)const 
-    ?RemoveFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 164 NONAME ; public: int __thiscall RFs::RemoveFileSystem(class TDesC16 const &)const 
-    ?Rename@CFileMan@@QAEHABVTDesC16@@0I@Z @ 165 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int)
-    ?Rename@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 166 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
-    ?Rename@RFile@@QAEHABVTDesC16@@@Z @ 167 NONAME ; public: int __thiscall RFile::Rename(class TDesC16 const &)
-    ?Rename@RFs@@QAEHABVTDesC16@@0@Z @ 168 NONAME ; public: int __thiscall RFs::Rename(class TDesC16 const &,class TDesC16 const &)
-    ?Replace@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 169 NONAME ; public: int __thiscall RFile::Replace(class RFs &,class TDesC16 const &,unsigned int)
-    ?Replace@RFs@@QAEHABVTDesC16@@0@Z @ 170 NONAME ; public: int __thiscall RFs::Replace(class TDesC16 const &,class TDesC16 const &)
-    ?ResourceCount@RFs@@QBEHXZ @ 171 NONAME ; public: int __thiscall RFs::ResourceCount(void)const 
-    ?ResourceCountMarkEnd@RFs@@QBEXXZ @ 172 NONAME ; public: void __thiscall RFs::ResourceCountMarkEnd(void)const 
-    ?ResourceCountMarkStart@RFs@@QBEXXZ @ 173 NONAME ; public: void __thiscall RFs::ResourceCountMarkStart(void)const 
-    ?RmDir@CFileMan@@QAEHABVTDesC16@@@Z @ 174 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &)
-    ?RmDir@CFileMan@@QAEHABVTDesC16@@AAVTRequestStatus@@@Z @ 175 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &,class TRequestStatus &)
-    ?RmDir@RFs@@QAEHABVTDesC16@@@Z @ 176 NONAME ; public: int __thiscall RFs::RmDir(class TDesC16 const &)
-    ?RunInSeparateThreadL@CFileBase@@IAEXP6AHPAX@Z@Z @ 177 NONAME ; protected: void __thiscall CFileBase::RunInSeparateThreadL(int (__cdecl*)(void *))
-    ?RunL@CFileBase@@IAEXXZ @ 178 NONAME ; protected: void __thiscall CFileBase::RunL(void)
-    ?ScanDrive@RFs@@QBEHABVTDesC16@@@Z @ 179 NONAME ; public: int __thiscall RFs::ScanDrive(class TDesC16 const &)const 
-    ?Seek@RFile@@QBEHW4TSeek@@AAH@Z @ 180 NONAME ; public: int __thiscall RFile::Seek(enum TSeek,int &)const 
-    ?Seek@TFileText@@QAEHW4TSeek@@@Z @ 181 NONAME ; public: int __thiscall TFileText::Seek(enum TSeek)
-    ?SessionPath@RFs@@QBEHAAVTDes16@@@Z @ 182 NONAME ; public: int __thiscall RFs::SessionPath(class TDes16 &)const 
-    ?Set@RFile@@QAEHABVTTime@@II@Z @ 183 NONAME ; public: int __thiscall RFile::Set(class TTime const &,unsigned int,unsigned int)
-    ?Set@TFileText@@QAEXAAVRFile@@@Z @ 184 NONAME ; public: void __thiscall TFileText::Set(class RFile &)
-    ?Set@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 185 NONAME ; public: int __thiscall TParse::Set(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *)
-    ?SetAllocFailure@RFs@@QAEHH@Z @ 186 NONAME ; public: int __thiscall RFs::SetAllocFailure(int)
-    ?SetAtt@RFile@@QAEHII@Z @ 187 NONAME ; public: int __thiscall RFile::SetAtt(unsigned int,unsigned int)
-    ?SetAtt@RFs@@QAEHABVTDesC16@@II@Z @ 188 NONAME ; public: int __thiscall RFs::SetAtt(class TDesC16 const &,unsigned int,unsigned int)
-    ?SetDebugRegister@RFs@@QAEHH@Z @ 189 NONAME ; public: int __thiscall RFs::SetDebugRegister(int)
-    ?SetDefaultPath@RFs@@QAEHABVTDesC16@@@Z @ 190 NONAME ; public: int __thiscall RFs::SetDefaultPath(class TDesC16 const &)
-    ?SetDriveName@RFs@@QAEHHABVTDesC16@@@Z @ 191 NONAME ; public: int __thiscall RFs::SetDriveName(int,class TDesC16 const &)
-    ?SetEntry@RFs@@QAEHABVTDesC16@@ABVTTime@@II@Z @ 192 NONAME ; public: int __thiscall RFs::SetEntry(class TDesC16 const &,class TTime const &,unsigned int,unsigned int)
-    ?SetErrorCondition@RFs@@QAEHHH@Z @ 193 NONAME ; public: int __thiscall RFs::SetErrorCondition(int,int)
-    ?SetModified@RFile@@QAEHABVTTime@@@Z @ 194 NONAME ; public: int __thiscall RFile::SetModified(class TTime const &)
-    ?SetModified@RFs@@QAEHABVTDesC16@@ABVTTime@@@Z @ 195 NONAME ; public: int __thiscall RFs::SetModified(class TDesC16 const &,class TTime const &)
-    ?SetNoWild@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 196 NONAME ; public: int __thiscall TParse::SetNoWild(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *)
-    ?SetNotifyUser@RFs@@QAEXH@Z @ 197 NONAME ; public: void __thiscall RFs::SetNotifyUser(int)
-    ?SetObserver@CFileBase@@QAEXPAVMFileManObserver@@@Z @ 198 NONAME ; public: void __thiscall CFileBase::SetObserver(class MFileManObserver *)
-    ?SetScanDataL@CDirScan@@QAEXABVTDesC16@@IIW4TScanDirection@1@@Z @ 199 NONAME ; public: void __thiscall CDirScan::SetScanDataL(class TDesC16 const &,unsigned int,unsigned int,enum CDirScan::TScanDirection)
-    ?SetSessionPath@RFs@@QAEHABVTDesC16@@@Z @ 200 NONAME ; public: int __thiscall RFs::SetSessionPath(class TDesC16 const &)
-    ?SetSize@RFile@@QAEHH@Z @ 201 NONAME ; public: int __thiscall RFile::SetSize(int)
-    ?SetSubst@RFs@@QAEHABVTDesC16@@H@Z @ 202 NONAME ; public: int __thiscall RFs::SetSubst(class TDesC16 const &,int)
-    ?SetVolumeLabel@RFs@@QAEHABVTDesC16@@H@Z @ 203 NONAME ; public: int __thiscall RFs::SetVolumeLabel(class TDesC16 const &,int)
-    ?Size@RFile@@QBEHAAH@Z @ 204 NONAME ; public: int __thiscall RFile::Size(int &)const 
-    ?Sort@CDir@@QAEHI@Z @ 205 NONAME ; public: int __thiscall CDir::Sort(unsigned int)
-    ?Subst@RFs@@QBEHAAVTDes16@@H@Z @ 206 NONAME ; public: int __thiscall RFs::Subst(class TDes16 &,int)const 
-    ?Temp@RFile@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 207 NONAME ; public: int __thiscall RFile::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int)
-    ?ThreadId@TOpenFileScan@@QBE?AVTThreadId@@XZ @ 208 NONAME ; public: class TThreadId  __thiscall TOpenFileScan::ThreadId(void)const 
-    ?UnLock@RFile@@QBEHHH@Z @ 209 NONAME ; public: int __thiscall RFile::UnLock(int,int)const 
-    ?UnlockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@H@Z @ 210 NONAME ; public: int __thiscall RFs::UnlockDrive(int,class TBuf8<16> const &,int)
-    ?Version@RFs@@QBE?AVTVersion@@XZ @ 211 NONAME ; public: class TVersion  __thiscall RFs::Version(void)const 
-    ?Volume@RFs@@QBEHAAVTVolumeInfo@@H@Z @ 212 NONAME ; public: int __thiscall RFs::Volume(class TVolumeInfo &,int)const 
-    ?Write@RFile@@QAEHABVTDesC8@@@Z @ 213 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &)
-    ?Write@RFile@@QAEHABVTDesC8@@H@Z @ 214 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &,int)
-    ?Write@RFile@@QAEHHABVTDesC8@@@Z @ 215 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &)
-    ?Write@RFile@@QAEHHABVTDesC8@@H@Z @ 216 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &,int)
-    ?Write@RFile@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 217 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,class TRequestStatus &)
-    ?Write@RFile@@QAEXABVTDesC8@@HAAVTRequestStatus@@@Z @ 218 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,int,class TRequestStatus &)
-    ?Write@RFile@@QAEXHABVTDesC8@@AAVTRequestStatus@@@Z @ 219 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,class TRequestStatus &)
-    ?Write@RFile@@QAEXHABVTDesC8@@HAAVTRequestStatus@@@Z @ 220 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,int,class TRequestStatus &)
-    ?Write@_RRawDisk@@QAEHHAAVTDesC8@@@Z @ 221 NONAME ; public: int __thiscall _RRawDisk::Write(int,class TDesC8 &)
-    ?Write@TFileText@@QAEHABVTDesC16@@@Z @ 222 NONAME ; public: int __thiscall TFileText::Write(class TDesC16 const &)
-    ?DebugNotify@RFs@@QAEXHIAAVTRequestStatus@@@Z @ 223 NONAME ; public: void __thiscall RFs::DebugNotify(int,unsigned int,class TRequestStatus &)
-    ?NotifyDiskSpace@RFs@@QAEX_JHAAVTRequestStatus@@@Z @ 224 NONAME ; public: void __thiscall RFs::NotifyDiskSpace(__int64,int,class TRequestStatus &)
-    ?NotifyDiskSpaceCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 225 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(class TRequestStatus &)
-    ?NotifyDiskSpaceCancel@RFs@@QAEXXZ @ 226 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(void)
-    ??0TEntry@@QAE@ABV0@@Z @ 227 NONAME ; public: __thiscall TEntry::TEntry(class TEntry const &)
-    ??0TEntry@@QAE@XZ @ 228 NONAME ; public: __thiscall TEntry::TEntry(void)
-    ??4TEntry@@QAEAAV0@ABV0@@Z @ 229 NONAME ; public: class TEntry & __thiscall TEntry::operator=(class TEntry const &)
-    ??0TParse@@QAE@XZ @ 230 NONAME ; public: __thiscall TParse::TParse(void)
-    ?Drive@RFile@@QBEHAAHAAVTDriveInfo@@@Z @ 231 NONAME ; public: int __thiscall RFile::Drive(int &,class TDriveInfo &)const 
-    ?RemountDrive@RFs@@QAEHHPBVTDesC8@@I@Z @ 232 NONAME ; public: int __thiscall RFs::RemountDrive(int,class TDesC8 const *,unsigned int)
-    ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@HAAH@Z @ 233 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,int,int &)const 
-    ?CreatePrivatePath@RFs@@QAEHH@Z @ 234 NONAME ; public: int __thiscall RFs::CreatePrivatePath(int)
-    ?PrivatePath@RFs@@QAEHAAVTDes16@@@Z @ 235 NONAME ; public: int __thiscall RFs::PrivatePath(class TDes16 &)
-    ?SetSessionToPrivate@RFs@@QAEHH@Z @ 236 NONAME ; public: int __thiscall RFs::SetSessionToPrivate(int)
-    ?FileNamesIdentical@@YAHABVTDesC16@@0@Z @ 237 NONAME ; int __cdecl FileNamesIdentical(class TDesC16 const &,class TDesC16 const &)
-    ?AddExtension@RFs@@QAEHABVTDesC16@@@Z @ 238 NONAME ; public: int __thiscall RFs::AddExtension(class TDesC16 const &)
-    ?DismountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 239 NONAME ; public: int __thiscall RFs::DismountExtension(class TDesC16 const &,int)
-    ?ExtensionName@RFs@@QAEHAAVTDes16@@HH@Z @ 240 NONAME ; public: int __thiscall RFs::ExtensionName(class TDes16 &,int,int)
-    ?MountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 241 NONAME ; public: int __thiscall RFs::MountExtension(class TDesC16 const &,int)
-    ?MountFileSystem@RFs@@QAEHABVTDesC16@@0H@Z @ 242 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int)
-    ?RemoveExtension@RFs@@QAEHABVTDesC16@@@Z @ 243 NONAME ; public: int __thiscall RFs::RemoveExtension(class TDesC16 const &)
-    ?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z @ 244 NONAME ; public: void __thiscall RFs::StartupInitComplete(class TRequestStatus &)
-    ?SetLocalDriveMapping@RFs@@QAEHABVTDesC8@@@Z @ 245 NONAME ; public: int __thiscall RFs::SetLocalDriveMapping(class TDesC8 const &)
-    ?ControlIo@RFs@@QAEHHH@Z @ 246 NONAME ; public: int __thiscall RFs::ControlIo(int,int)
-    ?ControlIo@RFs@@QAEHHHAAVTDes8@@@Z @ 247 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&)   ?Adopt@RFile@@QAEHAAVRFs@@AAH@Z @ 246 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int &)
-    ?ControlIo@RFs@@QAEHHHAAVTDes8@@0@Z @ 248 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&,class TDes8&)
-    ?Adopt@RFile@@QAEHAAVRFs@@H@Z @ 249 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int)
-    ?MountFileSystem@RFs@@QAEHABVTDesC16@@0HH@Z @ 250 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int,int)
-    ?MountFileSystem@RFs@@QBEHABVTDesC16@@HH@Z @ 251 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int,int)const 
-    ?Read@RRawDisk@@QAEH_JAAVTDes8@@@Z @ 252 NONAME ; public: int __thiscall RRawDisk::Read(__int64,class TDes8 &)
-    ?Write@RRawDisk@@QAEH_JAAVTDesC8@@@Z @ 253 NONAME ; public: int __thiscall RRawDisk::Write(__int64,class TDesC8 &)
-    ?FinaliseDrives@RFs@@QAEHXZ @ 254 NONAME ; public: int __thiscall RFs::FinaliseDrives(void)
-    ?SwapFileSystem@RFs@@QBEHABVTDesC16@@0H@Z @ 255 NONAME ; public: int __thiscall RFs::SwapFileSystem(class TDesC16 const &,class TDesC16 const &,int)const 
-    ?ErasePassword@RFs@@QAEHH@Z @ 256 NONAME ; public: int __thiscall RFs::ErasePassword(int)
-    ?GetReserveAccess@RFs@@QAEHH@Z @ 257 NONAME ; public: int __thiscall RFs::GetReserveAccess(int)
-    ?ReleaseReserveAccess@RFs@@QAEHH@Z @ 258 NONAME ; public: int __thiscall RFs::ReleaseReserveAccess(int)
-    ?ReserveDriveSpace@RFs@@QAEHHH@Z @ 259 NONAME ; public: int __thiscall RFs::ReserveDriveSpace(int,int)
-    ?AdoptFromClient@RFile@@QAEHABVRMessage2@@HH@Z @ 260 NONAME ; public: int __thiscall RFile::AdoptFromClient(class RMessage2 const &,int,int)
-    ?AdoptFromCreator@RFile@@QAEHHH@Z @ 261 NONAME ; public: int __thiscall RFile::AdoptFromCreator(int,int)
-    ?AdoptFromServer@RFile@@QAEHHH@Z @ 262 NONAME ; public: int __thiscall RFile::AdoptFromServer(int,int)
-    ?TransferToClient@RFile@@QBEHABVRMessage2@@H@Z @ 263 NONAME ; public: int __thiscall RFile::TransferToClient(class RMessage2 const &,int)const 
-    ?TransferToProcess@RFile@@QBEHAAVRProcess@@HH@Z @ 264 NONAME ; public: int __thiscall RFile::TransferToProcess(class RProcess &,int,int)const 
-    ?TransferToServer@RFile@@QBEHAAVTIpcArgs@@HH@Z @ 265 NONAME ; public: int __thiscall RFile::TransferToServer(class TIpcArgs &,int,int)const 
-    ?Name@RFile@@QBEHAAVTDes16@@@Z @ 266 NONAME ; public: int __thiscall RFile::Name(class TDes16 &)const 
-    ?Close@RDir@@QAEXXZ @ 267 NONAME ; public: void __thiscall RDir::Close(void)
-    ?Close@RFile@@QAEXXZ @ 268 NONAME ; public: void __thiscall RFile::Close(void)
-    ?Close@RFormat@@QAEXXZ @ 269 NONAME ; public: void __thiscall RFormat::Close(void)
-    ?GetMediaSerialNumber@RFs@@QAEHAAV?$TBuf8@$0EA@@@H@Z @ 270 NONAME ; public: int __thiscall RFs::GetMediaSerialNumber(class TBuf8<64> &,int)
-    ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@I@Z @ 271 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int)
-    ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@IAAVTRequestStatus@@@Z @ 272 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
-    ?FullName@RFile@@QBEHAAVTDes16@@@Z @ 273 NONAME ; public: int __thiscall RFile::FullName(class TDes16 &)const 
-    ?AddPlugin@RFs@@QBEHABVTDesC16@@@Z @ 274 NONAME ; public: int __thiscall RFs::AddPlugin(class TDesC16 const &)const 
-    ?Close@RPlugin@@QAEXXZ @ 275 NONAME ; public: void __thiscall RPlugin::Close(void)
-    ?DismountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 276 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &)const 
-    ?DismountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 277 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int)const 
-    ?DismountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 278 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int,int)const 
-    ?DoCancel@RPlugin@@IBEXI@Z @ 279 NONAME ; protected: void __thiscall RPlugin::DoCancel(unsigned int)const 
-    ?DoControl@RPlugin@@IBEHH@Z @ 280 NONAME ; protected: int __thiscall RPlugin::DoControl(int)const 
-    ?DoControl@RPlugin@@IBEHHAAVTDes8@@0@Z @ 281 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &,class TDes8 &)const 
-    ?DoControl@RPlugin@@IBEHHAAVTDes8@@@Z @ 282 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &)const 
-    ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@@Z @ 283 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &)const 
-    ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@1@Z @ 284 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &,class TDes8 &)const 
-    ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@@Z @ 285 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &)const 
-    ?MountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 286 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &)const 
-    ?MountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 287 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int)const 
-    ?MountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 288 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int,int)const 
-    ?Open@RPlugin@@QAEHAAVRFs@@H@Z @ 289 NONAME ; public: int __thiscall RPlugin::Open(class RFs &,int)
-    ?PluginName@RFs@@QAEHAAVTDes16@@HH@Z @ 290 NONAME ; public: int __thiscall RFs::PluginName(class TDes16 &,int,int)
-    ?RemovePlugin@RFs@@QBEHABVTDesC16@@@Z @ 291 NONAME ; public: int __thiscall RFs::RemovePlugin(class TDesC16 const &)const 
-    ?AllowDismount@RFs@@QBEHH@Z @ 292 NONAME ; public: int __thiscall RFs::AllowDismount(int)const 
-    ?NotifyDismount@RFs@@QBEXHAAVTRequestStatus@@W4TNotifyDismountMode@@@Z @ 293 NONAME ; public: void __thiscall RFs::NotifyDismount(int,class TRequestStatus &,enum TNotifyDismountMode)const 
-    ?NotifyDismountCancel@RFs@@QBEXAAVTRequestStatus@@@Z @ 294 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(class TRequestStatus &)const 
-    ?NotifyDismountCancel@RFs@@QBEXXZ @ 295 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(void)const 
-    ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAHABVTDesC8@@@Z @ 296 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &,class TDesC8 const &)
-    ?SetStartupConfiguration@RFs@@QBEHHPAX0@Z @ 297 NONAME ; public: int __thiscall RFs::SetStartupConfiguration(int,void *,void *)const 
-    ?ReadCancel@RFile@@QBEXAAVTRequestStatus@@@Z @ 298 NONAME ; public: void __thiscall RFile::ReadCancel(class TRequestStatus &)const 
-    ?ReadCancel@RFile@@QBEXXZ @ 299 NONAME ; public: void __thiscall RFile::ReadCancel(void)const 
-    ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@0HAAH@Z @ 300 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,class TDesC16 const &,int,int &)const 
-    ?SetNotifyChange@RFs@@QAEHH@Z @ 301 NONAME ; public: int __thiscall RFs::SetNotifyChange(int)
-    ?AddCompositeMount@RFs@@QBEHABVTDesC16@@HHH@Z @ 302 NONAME ; int RFs::AddCompositeMount(class TDesC16 const &, int, int, int) const
-    ?Flush@RFile@@QAEXAAVTRequestStatus@@@Z @ 303 NONAME ; public: void __thiscall RFile::Flush(class TRequestStatus &)
-    ?GetSystemDrive@RFs@@SA?AW4TDriveNumber@@XZ @ 304 NONAME ; public: static enum TDriveNumber  __cdecl RFs::GetSystemDrive(void)
-    ??0TBlockMapEntry@@QAE@XZ @ 305 NONAME ; public: __thiscall TBlockMapEntry::TBlockMapEntry(void)
-    ?BlockMap@RFile@@QBEHAAUSBlockMapInfo@@AA_J_JH@Z @ 306 NONAME ; public: int __thiscall RFile::BlockMap(struct SBlockMapInfo &,__int64 &,__int64,int)const 
-    ?SetNumberOfBlocks@TBlockMapEntry@@QAEXI@Z @ 307 NONAME ; public: void __thiscall TBlockMapEntry::SetNumberOfBlocks(unsigned int)
-    ?SetStartBlock@TBlockMapEntry@@QAEXI@Z @ 308 NONAME ; public: void __thiscall TBlockMapEntry::SetStartBlock(unsigned int)
-    ?Clamp@RFileClamp@@QAEHAAVRFile@@@Z @ 309 NONAME ; public: int __thiscall RFileClamp::Clamp(class RFile &)
-    ?Close@RFileClamp@@QAEHAAVRFs@@@Z @ 310 NONAME ; public: int __thiscall RFileClamp::Close(class RFs &)
-    ?FileSystemSubType@RFs@@QBEHHAAVTDes16@@@Z @ 311 NONAME ; public: int __thiscall RFs::FileSystemSubType(int,class TDes16 &)const 
-    ?InitialisePropertiesFile@RFs@@QBEHABVTPtrC8@@@Z @ 312 NONAME ; public: int __thiscall RFs::InitialisePropertiesFile(class TPtrC8 const &)const 
-    ?QueryVolumeInfoExt@RFs@@QBEHHW4TQueryVolumeInfoExtCmd@@AAVTDes8@@@Z @ 313 NONAME ; public: int __thiscall RFs::QueryVolumeInfoExt(int,enum TQueryVolumeInfoExtCmd,class TDes8 &)const 
-    ?VolumeIOParam@RFs@@QBEHHAAVTVolumeIOParamInfo@@@Z @ 314 NONAME ; public: int __thiscall RFs::VolumeIOParam(int,class TVolumeIOParamInfo &)const 
-    ?GetSystemDriveChar@RFs@@SA?AVTChar@@XZ @ 315 NONAME ; public: static class TChar  __cdecl RFs::GetSystemDriveChar(void)
-    ?SetSystemDrive@RFs@@QAEHW4TDriveNumber@@@Z @ 316 NONAME ; public: int __thiscall RFs::SetSystemDrive(enum TDriveNumber)
-    ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@I@Z @ 317 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &,unsigned int)const 
-    ?SetFindMask@TFindFile@@QAEHI@Z @ 318 NONAME ; public: int __thiscall TFindFile::SetFindMask(unsigned int)
-    ?FinaliseDrive@RFs@@QBEHHW4TFinaliseDrvMode@1@@Z @ 319 NONAME ; public: int __thiscall RFs::FinaliseDrive(int,enum RFs::TFinaliseDrvMode)const 
-    ?Volume@RFs@@QBEXAAVTVolumeInfo@@HAAVTRequestStatus@@@Z @ 320 NONAME ; public: void __thiscall RFs::Volume(class TVolumeInfo &,int,class TRequestStatus &)const 
-    ?AddProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 321 NONAME ; public: int __thiscall RFs::AddProxyDrive(class TDesC16 const &)
-    ?Caps@RRawDisk@@QAEHAAVTDes8@@@Z @ 322 NONAME ABSENT ; public: int __thiscall RRawDisk::Caps(class TDes8 &)
-    ?DismountProxyDrive@RFs@@QAEHI@Z @ 323 NONAME ; public: int __thiscall RFs::DismountProxyDrive(unsigned int)
-    ?DoMountProxyDrive@RFs@@AAEHABVTIpcArgs@@@Z @ 324 NONAME ; private: int __thiscall RFs::DoMountProxyDrive(class TIpcArgs const &)
-    ?RemoveProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 325 NONAME ; public: int __thiscall RFs::RemoveProxyDrive(class TDesC16 const &)
-    ?ReadFileSection@RFs@@QBEHABVTDesC16@@_JAAVTDes8@@H@Z @ 326 NONAME ; public: int __thiscall RFs::ReadFileSection(class TDesC16 const &,__int64,class TDes8 &,int)const 
-    ?AdoptFromClient@RFile64@@QAEHABVRMessage2@@HH@Z @ 327 NONAME ; public: int __thiscall RFile64::AdoptFromClient(class RMessage2 const &,int,int)
-    ?AdoptFromCreator@RFile64@@QAEHHH@Z @ 328 NONAME ; public: int __thiscall RFile64::AdoptFromCreator(int,int)
-    ?AdoptFromServer@RFile64@@QAEHHH@Z @ 329 NONAME ; public: int __thiscall RFile64::AdoptFromServer(int,int)
-    ?Create@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 330 NONAME ; public: int __thiscall RFile64::Create(class RFs &,class TDesC16 const &,unsigned int)
-    ?FileSize@TEntry@@QBE_JXZ @ 331 NONAME ; public: __int64 __thiscall TEntry::FileSize(void)const 
-    ?Lock@RFile64@@QBEH_J0@Z @ 332 NONAME ; public: int __thiscall RFile64::Lock(__int64,__int64)const 
-    ?Open@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 333 NONAME ; public: int __thiscall RFile64::Open(class RFs &,class TDesC16 const &,unsigned int)
-    ?Read@RFile64@@QBEHIAAVTDes8@@@Z @ 334 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &)const 
-    ?Read@RFile64@@QBEHIAAVTDes8@@H@Z @ 335 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &,int)const 
-    ?Read@RFile64@@QBEH_JAAVTDes8@@@Z @ 336 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &)const 
-    ?Read@RFile64@@QBEH_JAAVTDes8@@H@Z @ 337 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &,int)const 
-    ?Read@RFile64@@QBEXIAAVTDes8@@AAVTRequestStatus@@@Z @ 338 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,class TRequestStatus &)const 
-    ?Read@RFile64@@QBEXIAAVTDes8@@HAAVTRequestStatus@@@Z @ 339 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,int,class TRequestStatus &)const 
-    ?Read@RFile64@@QBEX_JAAVTDes8@@AAVTRequestStatus@@@Z @ 340 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,class TRequestStatus &)const 
-    ?Read@RFile64@@QBEX_JAAVTDes8@@HAAVTRequestStatus@@@Z @ 341 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,int,class TRequestStatus &)const 
-    ?Replace@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 342 NONAME ; public: int __thiscall RFile64::Replace(class RFs &,class TDesC16 const &,unsigned int)
-    ?Seek@RFile64@@QBEHW4TSeek@@AA_J@Z @ 343 NONAME ; public: int __thiscall RFile64::Seek(enum TSeek,__int64 &)const 
-    ?SetSize@RFile64@@QAEH_J@Z @ 344 NONAME ; public: int __thiscall RFile64::SetSize(__int64)
-    ?Size@RFile64@@QBEHAA_J@Z @ 345 NONAME ; public: int __thiscall RFile64::Size(__int64 &)const 
-    ?Temp@RFile64@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 346 NONAME ; public: int __thiscall RFile64::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int)
-    ?UnLock@RFile64@@QBEH_J0@Z @ 347 NONAME ; public: int __thiscall RFile64::UnLock(__int64,__int64)const 
-    ?Write@RFile64@@QAEHIABVTDesC8@@@Z @ 348 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &)
-    ?Write@RFile64@@QAEHIABVTDesC8@@H@Z @ 349 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int)
-    ?Write@RFile64@@QAEH_JABVTDesC8@@@Z @ 350 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &)
-    ?Write@RFile64@@QAEH_JABVTDesC8@@H@Z @ 351 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &,int)
-    ?Write@RFile64@@QAEXIABVTDesC8@@AAVTRequestStatus@@@Z @ 352 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,class TRequestStatus &)
-    ?Write@RFile64@@QAEXIABVTDesC8@@HAAVTRequestStatus@@@Z @ 353 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int,class TRequestStatus &)
-    ?Write@RFile64@@QAEX_JABVTDesC8@@AAVTRequestStatus@@@Z @ 354 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,class TRequestStatus &)
-    ?Write@RFile64@@QAEX_JABVTDesC8@@HAAVTRequestStatus@@@Z @ 355 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,int,class TRequestStatus &)
-    ?IsValidName@RFs@@QAEHABVTDesC16@@AAVTNameValidParam@1@@Z @ 356 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,class RFs::TNameValidParam &)
-    ?Close@RFs@@QAEXXZ @ 357 NONAME ; public: void __thiscall RFs::Close(void)
-    ??1CFsNotify@@UAE@XZ @ 358 NONAME ; public: virtual __thiscall CFsNotify::~CFsNotify(void)
-    ?AddNotification@CFsNotify@@QAEHIABVTDesC16@@0@Z @ 359 NONAME ; public: int __thiscall CFsNotify::AddNotification(unsigned int,class TDesC16 const &,class TDesC16 const &)
-    ?Attributes@TFsNotification@@QBEHAAI0@Z @ 360 NONAME ; public: int __thiscall TFsNotification::Attributes(unsigned int &,unsigned int &)const 
-    ?CancelNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 361 NONAME ; public: int __thiscall CFsNotify::CancelNotifications(class TRequestStatus &)
-    ?FileSize@TFsNotification@@QBEHAA_J@Z @ 362 NONAME ; public: int __thiscall TFsNotification::FileSize(__int64 &)const 
-    ?NewL@CFsNotify@@SAPAV1@AAVRFs@@H@Z @ 363 NONAME ; public: static class CFsNotify * __cdecl CFsNotify::NewL(class RFs &,int)
-    ?NewName@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 364 NONAME ; public: int __thiscall TFsNotification::NewName(class TPtrC16 &)const 
-    ?NextNotification@CFsNotify@@QAEPBVTFsNotification@@XZ @ 365 NONAME ; public: class TFsNotification const * __thiscall CFsNotify::NextNotification(void)
-    ?NotificationType@TFsNotification@@QBE?AW4TFsNotificationType@1@XZ @ 366 NONAME ; public: enum TFsNotification::TFsNotificationType __thiscall TFsNotification::NotificationType(void)const 
-    ?Path@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 367 NONAME ; public: int __thiscall TFsNotification::Path(class TPtrC16 &)const 
-    ?RemoveNotifications@CFsNotify@@QAEHXZ @ 368 NONAME ; public: int __thiscall CFsNotify::RemoveNotifications(void)
-    ?RequestNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 369 NONAME ; public: int __thiscall CFsNotify::RequestNotifications(class TRequestStatus &)
-    ?SupportedFileSystemName@RFs@@QBEHAAVTDes16@@HH@Z @ 370 NONAME ; public: int __thiscall RFs::SupportedFileSystemName(class TDes16 &,int,int)const 
+	??0CDir@@IAE@XZ @ 1 NONAME ; protected: __thiscall CDir::CDir(void)
+	??0CFileBase@@IAE@AAVRFs@@@Z @ 2 NONAME ; protected: __thiscall CFileBase::CFileBase(class RFs &)
+	??0TDriveUnit@@QAE@ABVTDesC16@@@Z @ 3 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(class TDesC16 const &)
+	??0TDriveUnit@@QAE@H@Z @ 4 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(int)
+	??0TEntryArray@@QAE@XZ @ 5 NONAME ; public: __thiscall TEntryArray::TEntryArray(void)
+	??0TFileText@@QAE@XZ @ 6 NONAME ; public: __thiscall TFileText::TFileText(void)
+	??0TFindFile@@QAE@AAVRFs@@@Z @ 7 NONAME ; public: __thiscall TFindFile::TFindFile(class RFs &)
+	??0TOpenFileScan@@QAE@AAVRFs@@@Z @ 8 NONAME ; public: __thiscall TOpenFileScan::TOpenFileScan(class RFs &)
+	??0TParseBase@@QAE@XZ @ 9 NONAME ; public: __thiscall TParseBase::TParseBase(void)
+	??0TParsePtr@@QAE@AAVTDes16@@@Z @ 10 NONAME ; public: __thiscall TParsePtr::TParsePtr(class TDes16 &)
+	??0TParsePtrC@@QAE@ABVTDesC16@@@Z @ 11 NONAME ; public: __thiscall TParsePtrC::TParsePtrC(class TDesC16 const &)
+	??0TVolumeInfo@@QAE@XZ @ 12 NONAME ; public: __thiscall TVolumeInfo::TVolumeInfo(void)
+	??1CDir@@UAE@XZ @ 13 NONAME ; public: virtual __thiscall CDir::~CDir(void)
+	??1CDirScan@@UAE@XZ @ 14 NONAME ; public: virtual __thiscall CDirScan::~CDirScan(void)
+	??1CFileBase@@MAE@XZ @ 15 NONAME ; protected: virtual __thiscall CFileBase::~CFileBase(void)
+	??4TDriveUnit@@QAEAAV0@ABVTDesC16@@@Z @ 16 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(class TDesC16 const &)
+	??4TDriveUnit@@QAEAAV0@H@Z @ 17 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(int)
+	??ACDir@@QBEABVTEntry@@H@Z @ 18 NONAME ; public: class TEntry const & __thiscall CDir::operator[](int)const 
+	??ATEntryArray@@QBEABVTEntry@@H@Z @ 19 NONAME ; public: class TEntry const & __thiscall TEntryArray::operator[](int)const 
+	?AbbreviatedPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 20 NONAME ; public: class TPtrC16  __thiscall CDirScan::AbbreviatedPath(void)
+	?AbbreviatedPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 21 NONAME ; public: class TPtrC16  __thiscall CFileBase::AbbreviatedPath(void)
+	?AddDir@TParseBase@@QAEHABVTDesC16@@@Z @ 22 NONAME ; public: int __thiscall TParseBase::AddDir(class TDesC16 const &)
+	?AddFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 23 NONAME ; public: int __thiscall RFs::AddFileSystem(class TDesC16 const &)const 
+	?AddL@CDir@@IAEXABVTEntry@@@Z @ 24 NONAME ; protected: void __thiscall CDir::AddL(class TEntry const &)
+	?Att@RFile@@QBEHAAI@Z @ 25 NONAME ; public: int __thiscall RFile::Att(unsigned int &)const 
+	?Att@RFs@@QBEHABVTDesC16@@AAI@Z @ 26 NONAME ; public: int __thiscall RFs::Att(class TDesC16 const &,unsigned int &)const 
+	?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@I@Z @ 27 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int)
+	?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@IAAVTRequestStatus@@@Z @ 28 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int,class TRequestStatus &)
+	?BytesTransferredByCopyStep@CFileMan@@QAEHXZ @ 29 NONAME ; public: int __thiscall CFileMan::BytesTransferredByCopyStep(void)
+	?ChangeMode@RFile@@QAEHW4TFileMode@@@Z @ 30 NONAME ; public: int __thiscall RFile::ChangeMode(enum TFileMode)
+	?CharToDrive@RFs@@SAHVTChar@@AAH@Z @ 31 NONAME ; public: static int __cdecl RFs::CharToDrive(class TChar,int &)
+	?CheckDisk@RFs@@QBEHABVTDesC16@@@Z @ 32 NONAME ; public: int __thiscall RFs::CheckDisk(class TDesC16 const &)const 
+	?ClearPassword@RFs@@QAEHHABV?$TBuf8@$0BA@@@@Z @ 33 NONAME ; public: int __thiscall RFs::ClearPassword(int,class TBuf8<16> const &)
+	?Duplicate@RFile@@QAEHABV1@W4TOwnerType@@@Z @ 34 NONAME ; public: int __thiscall RFile::Duplicate(class RFile const &,enum TOwnerType)
+	?Close@RRawDisk@@QAEXXZ @ 35 NONAME ; public: void __thiscall RRawDisk::Close(void)
+	?Compress@CDir@@IAEXXZ @ 36 NONAME ; protected: void __thiscall CDir::Compress(void)
+	?Connect@RFs@@QAEHH@Z @ 37 NONAME ; public: int __thiscall RFs::Connect(int)
+	?ConstructL@CFileBase@@IAEXXZ @ 38 NONAME ; protected: void __thiscall CFileBase::ConstructL(void)
+	?ControlIo@RFs@@QAEHHHPAX0@Z @ 39 NONAME ; public: int __thiscall RFs::ControlIo(int,int,void *,void *)
+	?Copy@CFileMan@@QAEHABVTDesC16@@0I@Z @ 40 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int)
+	?Copy@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 41 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
+	?Count@CDir@@QBEHXZ @ 42 NONAME ; public: int __thiscall CDir::Count(void)const 
+	?Count@TEntryArray@@QBEHXZ @ 43 NONAME ; public: int __thiscall TEntryArray::Count(void)const 
+	?Create@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 44 NONAME ; public: int __thiscall RFile::Create(class RFs &,class TDesC16 const &,unsigned int)
+	?CurrentAction@CFileMan@@QAE?AW4TAction@1@XZ @ 45 NONAME ; public: enum CFileMan::TAction  __thiscall CFileMan::CurrentAction(void)
+	?CurrentEntry@CFileBase@@QAEABVTEntry@@XZ @ 46 NONAME ; public: class TEntry const & __thiscall CFileBase::CurrentEntry(void)
+	?DefaultPath@RFs@@QBEHAAVTDes16@@@Z @ 47 NONAME ; public: int __thiscall RFs::DefaultPath(class TDes16 &)const 
+	?Delete@CFileMan@@QAEHABVTDesC16@@I@Z @ 48 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int)
+	?Delete@CFileMan@@QAEHABVTDesC16@@IAAVTRequestStatus@@@Z @ 49 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int,class TRequestStatus &)
+	?Delete@RFs@@QAEHABVTDesC16@@@Z @ 50 NONAME ; public: int __thiscall RFs::Delete(class TDesC16 const &)
+	?DismountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 51 NONAME ; public: int __thiscall RFs::DismountFileSystem(class TDesC16 const &,int)const 
+	?Drive@RFs@@QBEHAAVTDriveInfo@@H@Z @ 52 NONAME ; public: int __thiscall RFs::Drive(class TDriveInfo &,int)const 
+	?Drive@TParseBase@@QBE?AVTPtrC16@@XZ @ 53 NONAME ; public: class TPtrC16  __thiscall TParseBase::Drive(void)const 
+	?DriveAndPath@TParseBase@@QBE?AVTPtrC16@@XZ @ 54 NONAME ; public: class TPtrC16  __thiscall TParseBase::DriveAndPath(void)const 
+	?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z @ 55 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &)const 
+	?DrivePresent@TParseBase@@QBEHXZ @ 56 NONAME ; public: int __thiscall TParseBase::DrivePresent(void)const 
+	?DriveToChar@RFs@@SAHHAAVTChar@@@Z @ 57 NONAME ; public: static int __cdecl RFs::DriveToChar(int,class TChar &)
+	?Entry@RFs@@QBEHABVTDesC16@@AAVTEntry@@@Z @ 58 NONAME ; public: int __thiscall RFs::Entry(class TDesC16 const &,class TEntry &)const 
+	?Ext@TParseBase@@QBE?AVTPtrC16@@XZ @ 59 NONAME ; public: class TPtrC16  __thiscall TParseBase::Ext(void)const 
+	?ExtPresent@TParseBase@@QBEHXZ @ 60 NONAME ; public: int __thiscall TParseBase::ExtPresent(void)const 
+	?ExtractL@CDir@@IAEXHAAPAV1@@Z @ 61 NONAME ; protected: void __thiscall CDir::ExtractL(int,class CDir * &)
+	?FileSystemName@RFs@@QBEHAAVTDes16@@H@Z @ 62 NONAME ; public: int __thiscall RFs::FileSystemName(class TDes16 &,int)const 
+	?Find@TFindFile@@QAEHXZ @ 63 NONAME ; public: int __thiscall TFindFile::Find(void)
+	?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z @ 64 NONAME ; public: int __thiscall TFindFile::FindByDir(class TDesC16 const &,class TDesC16 const &)
+	?FindByPath@TFindFile@@QAEHABVTDesC16@@PBV2@@Z @ 65 NONAME ; public: int __thiscall TFindFile::FindByPath(class TDesC16 const &,class TDesC16 const *)
+	?FindWild@TFindFile@@QAEHAAPAVCDir@@@Z @ 66 NONAME ; public: int __thiscall TFindFile::FindWild(class CDir * &)
+	?FindWildByDir@TFindFile@@QAEHABVTDesC16@@0AAPAVCDir@@@Z @ 67 NONAME ; public: int __thiscall TFindFile::FindWildByDir(class TDesC16 const &,class TDesC16 const &,class CDir * &)
+	?FindWildByPath@TFindFile@@QAEHABVTDesC16@@PBV2@AAPAVCDir@@@Z @ 68 NONAME ; public: int __thiscall TFindFile::FindWildByPath(class TDesC16 const &,class TDesC16 const *,class CDir * &)
+	?Flush@RFile@@QAEHXZ @ 69 NONAME ; public: int __thiscall RFile::Flush(void)
+	?FullName@TParseBase@@QBEABVTDesC16@@XZ @ 70 NONAME ; public: class TDesC16 const & __thiscall TParseBase::FullName(void)const 
+	?FullPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 71 NONAME ; public: class TPtrC16  __thiscall CDirScan::FullPath(void)
+	?FullPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 72 NONAME ; public: class TPtrC16  __thiscall CFileBase::FullPath(void)
+	?GetCurrentSource@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 73 NONAME ; public: void __thiscall CFileMan::GetCurrentSource(class TBuf<256> &)
+	?GetCurrentTarget@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 74 NONAME ; public: void __thiscall CFileMan::GetCurrentTarget(class TBuf<256> &)
+	?GetDir@RFs@@QBEHABVTDesC16@@ABVTUidType@@IAAPAVCDir@@@Z @ 75 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,class TUidType const &,unsigned int,class CDir * &)const 
+	?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@1@Z @ 76 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &,class CDir * &)const 
+	?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@@Z @ 77 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &)const 
+	?GetDriveName@RFs@@QBEHHAAVTDes16@@@Z @ 78 NONAME ; public: int __thiscall RFs::GetDriveName(int,class TDes16 &)const 
+	?GetLastError@CFileBase@@QAEHXZ @ 79 NONAME ; public: int __thiscall CFileBase::GetLastError(void)
+	?GetLongName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 80 NONAME ; public: int __thiscall RFs::GetLongName(class TDesC16 const &,class TDes16 &)const 
+	?GetMoreInfoAboutError@CFileBase@@QAE?AW4TFileManError@@XZ @ 81 NONAME ; public: enum TFileManError  __thiscall CFileBase::GetMoreInfoAboutError(void)
+	?GetNotifyUser@RFs@@QAEHXZ @ 82 NONAME ; public: int __thiscall RFs::GetNotifyUser(void)
+	?GetShortName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 83 NONAME ; public: int __thiscall RFs::GetShortName(class TDesC16 const &,class TDes16 &)const 
+	?IsArchive@TEntry@@QBEHXZ @ 84 NONAME ; public: int __thiscall TEntry::IsArchive(void)const 
+	?IsDir@TEntry@@QBEHXZ @ 85 NONAME ; public: int __thiscall TEntry::IsDir(void)const 
+	?IsExtWild@TParseBase@@QBEHXZ @ 86 NONAME ; public: int __thiscall TParseBase::IsExtWild(void)const 
+	?IsFileInRom@RFs@@QBEPAEABVTDesC16@@@Z @ 87 NONAME ; public: unsigned char * __thiscall RFs::IsFileInRom(class TDesC16 const &)const 
+	?IsFileOpen@RFs@@QBEHABVTDesC16@@AAH@Z @ 88 NONAME ; public: int __thiscall RFs::IsFileOpen(class TDesC16 const &,int &)const 
+	?IsHidden@TEntry@@QBEHXZ @ 89 NONAME ; public: int __thiscall TEntry::IsHidden(void)const 
+	?IsKMatchAny@TParseBase@@QBEHXZ @ 90 NONAME ; public: int __thiscall TParseBase::IsKMatchAny(void)const 
+	?IsKMatchOne@TParseBase@@QBEHXZ @ 91 NONAME ; public: int __thiscall TParseBase::IsKMatchOne(void)const 
+	?IsNameWild@TParseBase@@QBEHXZ @ 92 NONAME ; public: int __thiscall TParseBase::IsNameWild(void)const 
+	?IsReadOnly@TEntry@@QBEHXZ @ 93 NONAME ; public: int __thiscall TEntry::IsReadOnly(void)const 
+	?IsRomAddress@RFs@@SAHPAX@Z @ 94 NONAME ; public: static int __cdecl RFs::IsRomAddress(void *)
+	?IsRoot@TParseBase@@QBEHXZ @ 95 NONAME ; public: int __thiscall TParseBase::IsRoot(void)const 
+	?IsSystem@TEntry@@QBEHXZ @ 96 NONAME ; public: int __thiscall TEntry::IsSystem(void)const 
+	?IsValidDrive@RFs@@SAHH@Z @ 97 NONAME ; public: static int __cdecl RFs::IsValidDrive(int)
+	?IsValidName@RFs@@QBEHABVTDesC16@@@Z @ 98 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &)const 
+	?IsValidName@RFs@@QBEHABVTDesC16@@AAG@Z @ 99 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,unsigned short &)const 
+	?IsWild@TParseBase@@QBEHXZ @ 100 NONAME ; public: int __thiscall TParseBase::IsWild(void)const 
+	?LoaderHeapFunction@RFs@@QAEHHPAX0@Z @ 101 NONAME ; public: int __thiscall RFs::LoaderHeapFunction(int,void *,void *)
+	?Lock@RFile@@QBEHHH@Z @ 102 NONAME ; public: int __thiscall RFile::Lock(int,int)const 
+	?LockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@0H@Z @ 103 NONAME ; public: int __thiscall RFs::LockDrive(int,class TBuf8<16> const &,class TBuf8<16> const &,int)
+	?MkDir@RFs@@QAEHABVTDesC16@@@Z @ 104 NONAME ; public: int __thiscall RFs::MkDir(class TDesC16 const &)
+	?MkDirAll@RFs@@QAEHABVTDesC16@@@Z @ 105 NONAME ; public: int __thiscall RFs::MkDirAll(class TDesC16 const &)
+	?Modified@RFile@@QBEHAAVTTime@@@Z @ 106 NONAME ; public: int __thiscall RFile::Modified(class TTime &)const 
+	?Modified@RFs@@QBEHABVTDesC16@@AAVTTime@@@Z @ 107 NONAME ; public: int __thiscall RFs::Modified(class TDesC16 const &,class TTime &)const 
+	?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 108 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int)const 
+	?Move@CFileMan@@QAEHABVTDesC16@@0I@Z @ 109 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int)
+	?Move@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 110 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
+	?Name@TDriveUnit@@QBE?AV?$TBuf@$01@@XZ @ 111 NONAME ; public: class TBuf<2>  __thiscall TDriveUnit::Name(void)const 
+	?Name@TParseBase@@QBE?AVTPtrC16@@XZ @ 112 NONAME ; public: class TPtrC16  __thiscall TParseBase::Name(void)const 
+	?NameAndExt@TParseBase@@QBE?AVTPtrC16@@XZ @ 113 NONAME ; public: class TPtrC16  __thiscall TParseBase::NameAndExt(void)const 
+	?NameBuf@TParse@@MAEAAVTDes16@@XZ @ 114 NONAME ; protected: virtual class TDes16 & __thiscall TParse::NameBuf(void)
+	?NameBuf@TParsePtr@@MAEAAVTDes16@@XZ @ 115 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtr::NameBuf(void)
+	?NameBuf@TParsePtrC@@MAEAAVTDes16@@XZ @ 116 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtrC::NameBuf(void)
+	?NameBufC@TParse@@MBEABVTDesC16@@XZ @ 117 NONAME ; protected: virtual class TDesC16 const & __thiscall TParse::NameBufC(void)const 
+	?NameBufC@TParsePtr@@MBEABVTDesC16@@XZ @ 118 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtr::NameBufC(void)const 
+	?NameBufC@TParsePtrC@@MBEABVTDesC16@@XZ @ 119 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtrC::NameBufC(void)const 
+	?NameOrExtPresent@TParseBase@@QBEHXZ @ 120 NONAME ; public: int __thiscall TParseBase::NameOrExtPresent(void)const 
+	?NamePresent@TParseBase@@QBEHXZ @ 121 NONAME ; public: int __thiscall TParseBase::NamePresent(void)const 
+	?NewL@CDir@@KAPAV1@XZ @ 122 NONAME ; protected: static class CDir * __cdecl CDir::NewL(void)
+	?NewL@CDirScan@@SAPAV1@AAVRFs@@@Z @ 123 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewL(class RFs &)
+	?NewL@CFileMan@@SAPAV1@AAVRFs@@@Z @ 124 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &)
+	?NewL@CFileMan@@SAPAV1@AAVRFs@@PAVMFileManObserver@@@Z @ 125 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &,class MFileManObserver *)
+	?NewLC@CDirScan@@SAPAV1@AAVRFs@@@Z @ 126 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewLC(class RFs &)
+	?Next@RFormat@@QAEHAAH@Z @ 127 NONAME ; public: int __thiscall RFormat::Next(int &)
+	?Next@RFormat@@QAEXAAV?$TPckgBuf@H@@AAVTRequestStatus@@@Z @ 128 NONAME ; public: void __thiscall RFormat::Next(class TPckgBuf<int> &,class TRequestStatus &)
+	?NextL@CDirScan@@QAEXAAPAVCDir@@@Z @ 129 NONAME ; public: void __thiscall CDirScan::NextL(class CDir * &)
+	?NextL@TOpenFileScan@@QAEXAAPAVCDir@@@Z @ 130 NONAME ; public: void __thiscall TOpenFileScan::NextL(class CDir * &)
+	?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@@Z @ 131 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &)
+	?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@ABVTDesC16@@@Z @ 132 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &,class TDesC16 const &)
+	?NotifyChangeCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 133 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(class TRequestStatus &)
+	?NotifyChangeCancel@RFs@@QAEXXZ @ 134 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(void)
+	?NotifyFileManEnded@MFileManObserver@@UAE?AW4TControl@1@XZ @ 135 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManEnded(void)
+	?NotifyFileManOperation@MFileManObserver@@UAE?AW4TControl@1@XZ @ 136 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManOperation(void)
+	?NotifyFileManStarted@MFileManObserver@@UAE?AW4TControl@1@XZ @ 137 NONAME ; public: virtual enum MFileManObserver::TControl  __thiscall MFileManObserver::NotifyFileManStarted(void)
+	?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@ABVTUidType@@@Z @ 138 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,class TUidType const &)
+	?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 139 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,unsigned int)
+	?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 140 NONAME ; public: int __thiscall RFile::Open(class RFs &,class TDesC16 const &,unsigned int)
+	?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAH@Z @ 141 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &)
+	?Open@RRawDisk@@QAEHAAVRFs@@H@Z @ 142 NONAME ; public: int __thiscall RRawDisk::Open(class RFs &,int)
+	?Parse@RFs@@QBEHABVTDesC16@@0AAVTParse@@@Z @ 143 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TDesC16 const &,class TParse &)const 
+	?Parse@RFs@@QBEHABVTDesC16@@AAVTParse@@@Z @ 144 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TParse &)const 
+	?Path@TParseBase@@QBE?AVTPtrC16@@XZ @ 145 NONAME ; public: class TPtrC16  __thiscall TParseBase::Path(void)const 
+	?PathPresent@TParseBase@@QBEHXZ @ 146 NONAME ; public: int __thiscall TParseBase::PathPresent(void)const 
+	?PopDir@TParseBase@@QAEHXZ @ 147 NONAME ; public: int __thiscall TParseBase::PopDir(void)
+	?Read@RDir@@QBEHAAVTEntry@@@Z @ 148 NONAME ; public: int __thiscall RDir::Read(class TEntry &)const 
+	?Read@RDir@@QBEHAAVTEntryArray@@@Z @ 149 NONAME ; public: int __thiscall RDir::Read(class TEntryArray &)const 
+	?Read@RDir@@QBEXAAV?$TPckg@VTEntry@@@@AAVTRequestStatus@@@Z @ 150 NONAME ; public: void __thiscall RDir::Read(class TPckg<class TEntry> &,class TRequestStatus &)const 
+	?Read@RDir@@QBEXAAVTEntryArray@@AAVTRequestStatus@@@Z @ 151 NONAME ; public: void __thiscall RDir::Read(class TEntryArray &,class TRequestStatus &)const 
+	?Read@RFile@@QBEHAAVTDes8@@@Z @ 152 NONAME ; public: int __thiscall RFile::Read(class TDes8 &)const 
+	?Read@RFile@@QBEHAAVTDes8@@H@Z @ 153 NONAME ; public: int __thiscall RFile::Read(class TDes8 &,int)const 
+	?Read@RFile@@QBEHHAAVTDes8@@@Z @ 154 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &)const 
+	?Read@RFile@@QBEHHAAVTDes8@@H@Z @ 155 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &,int)const 
+	?Read@RFile@@QBEXAAVTDes8@@AAVTRequestStatus@@@Z @ 156 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,class TRequestStatus &)const 
+	?Read@RFile@@QBEXAAVTDes8@@HAAVTRequestStatus@@@Z @ 157 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,int,class TRequestStatus &)const 
+	?Read@RFile@@QBEXHAAVTDes8@@AAVTRequestStatus@@@Z @ 158 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,class TRequestStatus &)const 
+	?Read@RFile@@QBEXHAAVTDes8@@HAAVTRequestStatus@@@Z @ 159 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,int,class TRequestStatus &)const 
+	?Read@_RRawDisk@@QAEHHAAVTDes8@@@Z @ 160 NONAME ; public: int __thiscall _RRawDisk::Read(int,class TDes8 &)
+	?Read@TFileText@@QAEHAAVTDes16@@@Z @ 161 NONAME ; public: int __thiscall TFileText::Read(class TDes16 &)
+	?ReadFileSection_RESERVED@RFs@@ABEHABVTDesC16@@HAAVTDes8@@H@Z @ 162 NONAME ; public: int __thiscall RFs::ReadFileSection_RESERVED(class TDesC16 const &,int,class TDes8 &,int)const 
+	?RealName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 163 NONAME ; public: int __thiscall RFs::RealName(class TDesC16 const &,class TDes16 &)const 
+	?RemoveFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 164 NONAME ; public: int __thiscall RFs::RemoveFileSystem(class TDesC16 const &)const 
+	?Rename@CFileMan@@QAEHABVTDesC16@@0I@Z @ 165 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int)
+	?Rename@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 166 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
+	?Rename@RFile@@QAEHABVTDesC16@@@Z @ 167 NONAME ; public: int __thiscall RFile::Rename(class TDesC16 const &)
+	?Rename@RFs@@QAEHABVTDesC16@@0@Z @ 168 NONAME ; public: int __thiscall RFs::Rename(class TDesC16 const &,class TDesC16 const &)
+	?Replace@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 169 NONAME ; public: int __thiscall RFile::Replace(class RFs &,class TDesC16 const &,unsigned int)
+	?Replace@RFs@@QAEHABVTDesC16@@0@Z @ 170 NONAME ; public: int __thiscall RFs::Replace(class TDesC16 const &,class TDesC16 const &)
+	?ResourceCount@RFs@@QBEHXZ @ 171 NONAME ; public: int __thiscall RFs::ResourceCount(void)const 
+	?ResourceCountMarkEnd@RFs@@QBEXXZ @ 172 NONAME ; public: void __thiscall RFs::ResourceCountMarkEnd(void)const 
+	?ResourceCountMarkStart@RFs@@QBEXXZ @ 173 NONAME ; public: void __thiscall RFs::ResourceCountMarkStart(void)const 
+	?RmDir@CFileMan@@QAEHABVTDesC16@@@Z @ 174 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &)
+	?RmDir@CFileMan@@QAEHABVTDesC16@@AAVTRequestStatus@@@Z @ 175 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &,class TRequestStatus &)
+	?RmDir@RFs@@QAEHABVTDesC16@@@Z @ 176 NONAME ; public: int __thiscall RFs::RmDir(class TDesC16 const &)
+	?RunInSeparateThreadL@CFileBase@@IAEXP6AHPAX@Z@Z @ 177 NONAME ; protected: void __thiscall CFileBase::RunInSeparateThreadL(int (__cdecl*)(void *))
+	?RunL@CFileBase@@IAEXXZ @ 178 NONAME ; protected: void __thiscall CFileBase::RunL(void)
+	?ScanDrive@RFs@@QBEHABVTDesC16@@@Z @ 179 NONAME ; public: int __thiscall RFs::ScanDrive(class TDesC16 const &)const 
+	?Seek@RFile@@QBEHW4TSeek@@AAH@Z @ 180 NONAME ; public: int __thiscall RFile::Seek(enum TSeek,int &)const 
+	?Seek@TFileText@@QAEHW4TSeek@@@Z @ 181 NONAME ; public: int __thiscall TFileText::Seek(enum TSeek)
+	?SessionPath@RFs@@QBEHAAVTDes16@@@Z @ 182 NONAME ; public: int __thiscall RFs::SessionPath(class TDes16 &)const 
+	?Set@RFile@@QAEHABVTTime@@II@Z @ 183 NONAME ; public: int __thiscall RFile::Set(class TTime const &,unsigned int,unsigned int)
+	?Set@TFileText@@QAEXAAVRFile@@@Z @ 184 NONAME ; public: void __thiscall TFileText::Set(class RFile &)
+	?Set@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 185 NONAME ; public: int __thiscall TParse::Set(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *)
+	?SetAllocFailure@RFs@@QAEHH@Z @ 186 NONAME ; public: int __thiscall RFs::SetAllocFailure(int)
+	?SetAtt@RFile@@QAEHII@Z @ 187 NONAME ; public: int __thiscall RFile::SetAtt(unsigned int,unsigned int)
+	?SetAtt@RFs@@QAEHABVTDesC16@@II@Z @ 188 NONAME ; public: int __thiscall RFs::SetAtt(class TDesC16 const &,unsigned int,unsigned int)
+	?SetDebugRegister@RFs@@QAEHH@Z @ 189 NONAME ; public: int __thiscall RFs::SetDebugRegister(int)
+	?SetDefaultPath@RFs@@QAEHABVTDesC16@@@Z @ 190 NONAME ; public: int __thiscall RFs::SetDefaultPath(class TDesC16 const &)
+	?SetDriveName@RFs@@QAEHHABVTDesC16@@@Z @ 191 NONAME ; public: int __thiscall RFs::SetDriveName(int,class TDesC16 const &)
+	?SetEntry@RFs@@QAEHABVTDesC16@@ABVTTime@@II@Z @ 192 NONAME ; public: int __thiscall RFs::SetEntry(class TDesC16 const &,class TTime const &,unsigned int,unsigned int)
+	?SetErrorCondition@RFs@@QAEHHH@Z @ 193 NONAME ; public: int __thiscall RFs::SetErrorCondition(int,int)
+	?SetModified@RFile@@QAEHABVTTime@@@Z @ 194 NONAME ; public: int __thiscall RFile::SetModified(class TTime const &)
+	?SetModified@RFs@@QAEHABVTDesC16@@ABVTTime@@@Z @ 195 NONAME ; public: int __thiscall RFs::SetModified(class TDesC16 const &,class TTime const &)
+	?SetNoWild@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 196 NONAME ; public: int __thiscall TParse::SetNoWild(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *)
+	?SetNotifyUser@RFs@@QAEXH@Z @ 197 NONAME ; public: void __thiscall RFs::SetNotifyUser(int)
+	?SetObserver@CFileBase@@QAEXPAVMFileManObserver@@@Z @ 198 NONAME ; public: void __thiscall CFileBase::SetObserver(class MFileManObserver *)
+	?SetScanDataL@CDirScan@@QAEXABVTDesC16@@IIW4TScanDirection@1@@Z @ 199 NONAME ; public: void __thiscall CDirScan::SetScanDataL(class TDesC16 const &,unsigned int,unsigned int,enum CDirScan::TScanDirection)
+	?SetSessionPath@RFs@@QAEHABVTDesC16@@@Z @ 200 NONAME ; public: int __thiscall RFs::SetSessionPath(class TDesC16 const &)
+	?SetSize@RFile@@QAEHH@Z @ 201 NONAME ; public: int __thiscall RFile::SetSize(int)
+	?SetSubst@RFs@@QAEHABVTDesC16@@H@Z @ 202 NONAME ; public: int __thiscall RFs::SetSubst(class TDesC16 const &,int)
+	?SetVolumeLabel@RFs@@QAEHABVTDesC16@@H@Z @ 203 NONAME ; public: int __thiscall RFs::SetVolumeLabel(class TDesC16 const &,int)
+	?Size@RFile@@QBEHAAH@Z @ 204 NONAME ; public: int __thiscall RFile::Size(int &)const 
+	?Sort@CDir@@QAEHI@Z @ 205 NONAME ; public: int __thiscall CDir::Sort(unsigned int)
+	?Subst@RFs@@QBEHAAVTDes16@@H@Z @ 206 NONAME ; public: int __thiscall RFs::Subst(class TDes16 &,int)const 
+	?Temp@RFile@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 207 NONAME ; public: int __thiscall RFile::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int)
+	?ThreadId@TOpenFileScan@@QBE?AVTThreadId@@XZ @ 208 NONAME ; public: class TThreadId  __thiscall TOpenFileScan::ThreadId(void)const 
+	?UnLock@RFile@@QBEHHH@Z @ 209 NONAME ; public: int __thiscall RFile::UnLock(int,int)const 
+	?UnlockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@H@Z @ 210 NONAME ; public: int __thiscall RFs::UnlockDrive(int,class TBuf8<16> const &,int)
+	?Version@RFs@@QBE?AVTVersion@@XZ @ 211 NONAME ; public: class TVersion  __thiscall RFs::Version(void)const 
+	?Volume@RFs@@QBEHAAVTVolumeInfo@@H@Z @ 212 NONAME ; public: int __thiscall RFs::Volume(class TVolumeInfo &,int)const 
+	?Write@RFile@@QAEHABVTDesC8@@@Z @ 213 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &)
+	?Write@RFile@@QAEHABVTDesC8@@H@Z @ 214 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &,int)
+	?Write@RFile@@QAEHHABVTDesC8@@@Z @ 215 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &)
+	?Write@RFile@@QAEHHABVTDesC8@@H@Z @ 216 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &,int)
+	?Write@RFile@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 217 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,class TRequestStatus &)
+	?Write@RFile@@QAEXABVTDesC8@@HAAVTRequestStatus@@@Z @ 218 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,int,class TRequestStatus &)
+	?Write@RFile@@QAEXHABVTDesC8@@AAVTRequestStatus@@@Z @ 219 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,class TRequestStatus &)
+	?Write@RFile@@QAEXHABVTDesC8@@HAAVTRequestStatus@@@Z @ 220 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,int,class TRequestStatus &)
+	?Write@_RRawDisk@@QAEHHAAVTDesC8@@@Z @ 221 NONAME ; public: int __thiscall _RRawDisk::Write(int,class TDesC8 &)
+	?Write@TFileText@@QAEHABVTDesC16@@@Z @ 222 NONAME ; public: int __thiscall TFileText::Write(class TDesC16 const &)
+	?DebugNotify@RFs@@QAEXHIAAVTRequestStatus@@@Z @ 223 NONAME ; public: void __thiscall RFs::DebugNotify(int,unsigned int,class TRequestStatus &)
+	?NotifyDiskSpace@RFs@@QAEX_JHAAVTRequestStatus@@@Z @ 224 NONAME ; public: void __thiscall RFs::NotifyDiskSpace(__int64,int,class TRequestStatus &)
+	?NotifyDiskSpaceCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 225 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(class TRequestStatus &)
+	?NotifyDiskSpaceCancel@RFs@@QAEXXZ @ 226 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(void)
+	??0TEntry@@QAE@ABV0@@Z @ 227 NONAME ; public: __thiscall TEntry::TEntry(class TEntry const &)
+	??0TEntry@@QAE@XZ @ 228 NONAME ; public: __thiscall TEntry::TEntry(void)
+	??4TEntry@@QAEAAV0@ABV0@@Z @ 229 NONAME ; public: class TEntry & __thiscall TEntry::operator=(class TEntry const &)
+	??0TParse@@QAE@XZ @ 230 NONAME ; public: __thiscall TParse::TParse(void)
+	?Drive@RFile@@QBEHAAHAAVTDriveInfo@@@Z @ 231 NONAME ; public: int __thiscall RFile::Drive(int &,class TDriveInfo &)const 
+	?RemountDrive@RFs@@QAEHHPBVTDesC8@@I@Z @ 232 NONAME ; public: int __thiscall RFs::RemountDrive(int,class TDesC8 const *,unsigned int)
+	?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@HAAH@Z @ 233 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,int,int &)const 
+	?CreatePrivatePath@RFs@@QAEHH@Z @ 234 NONAME ; public: int __thiscall RFs::CreatePrivatePath(int)
+	?PrivatePath@RFs@@QAEHAAVTDes16@@@Z @ 235 NONAME ; public: int __thiscall RFs::PrivatePath(class TDes16 &)
+	?SetSessionToPrivate@RFs@@QAEHH@Z @ 236 NONAME ; public: int __thiscall RFs::SetSessionToPrivate(int)
+	?FileNamesIdentical@@YAHABVTDesC16@@0@Z @ 237 NONAME ; int __cdecl FileNamesIdentical(class TDesC16 const &,class TDesC16 const &)
+	?AddExtension@RFs@@QAEHABVTDesC16@@@Z @ 238 NONAME ; public: int __thiscall RFs::AddExtension(class TDesC16 const &)
+	?DismountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 239 NONAME ; public: int __thiscall RFs::DismountExtension(class TDesC16 const &,int)
+	?ExtensionName@RFs@@QAEHAAVTDes16@@HH@Z @ 240 NONAME ; public: int __thiscall RFs::ExtensionName(class TDes16 &,int,int)
+	?MountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 241 NONAME ; public: int __thiscall RFs::MountExtension(class TDesC16 const &,int)
+	?MountFileSystem@RFs@@QAEHABVTDesC16@@0H@Z @ 242 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int)
+	?RemoveExtension@RFs@@QAEHABVTDesC16@@@Z @ 243 NONAME ; public: int __thiscall RFs::RemoveExtension(class TDesC16 const &)
+	?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z @ 244 NONAME ; public: void __thiscall RFs::StartupInitComplete(class TRequestStatus &)
+	?SetLocalDriveMapping@RFs@@QAEHABVTDesC8@@@Z @ 245 NONAME ; public: int __thiscall RFs::SetLocalDriveMapping(class TDesC8 const &)
+	?ControlIo@RFs@@QAEHHH@Z @ 246 NONAME ; public: int __thiscall RFs::ControlIo(int,int)
+	?ControlIo@RFs@@QAEHHHAAVTDes8@@@Z @ 247 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&)   ?Adopt@RFile@@QAEHAAVRFs@@AAH@Z @ 246 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int &)
+	?ControlIo@RFs@@QAEHHHAAVTDes8@@0@Z @ 248 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&,class TDes8&)
+	?Adopt@RFile@@QAEHAAVRFs@@H@Z @ 249 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int)
+	?MountFileSystem@RFs@@QAEHABVTDesC16@@0HH@Z @ 250 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int,int)
+	?MountFileSystem@RFs@@QBEHABVTDesC16@@HH@Z @ 251 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int,int)const 
+	?Read@RRawDisk@@QAEH_JAAVTDes8@@@Z @ 252 NONAME ; public: int __thiscall RRawDisk::Read(__int64,class TDes8 &)
+	?Write@RRawDisk@@QAEH_JAAVTDesC8@@@Z @ 253 NONAME ; public: int __thiscall RRawDisk::Write(__int64,class TDesC8 &)
+	?FinaliseDrives@RFs@@QAEHXZ @ 254 NONAME ; public: int __thiscall RFs::FinaliseDrives(void)
+	?SwapFileSystem@RFs@@QBEHABVTDesC16@@0H@Z @ 255 NONAME ; public: int __thiscall RFs::SwapFileSystem(class TDesC16 const &,class TDesC16 const &,int)const 
+	?ErasePassword@RFs@@QAEHH@Z @ 256 NONAME ; public: int __thiscall RFs::ErasePassword(int)
+	?GetReserveAccess@RFs@@QAEHH@Z @ 257 NONAME ; public: int __thiscall RFs::GetReserveAccess(int)
+	?ReleaseReserveAccess@RFs@@QAEHH@Z @ 258 NONAME ; public: int __thiscall RFs::ReleaseReserveAccess(int)
+	?ReserveDriveSpace@RFs@@QAEHHH@Z @ 259 NONAME ; public: int __thiscall RFs::ReserveDriveSpace(int,int)
+	?AdoptFromClient@RFile@@QAEHABVRMessage2@@HH@Z @ 260 NONAME ; public: int __thiscall RFile::AdoptFromClient(class RMessage2 const &,int,int)
+	?AdoptFromCreator@RFile@@QAEHHH@Z @ 261 NONAME ; public: int __thiscall RFile::AdoptFromCreator(int,int)
+	?AdoptFromServer@RFile@@QAEHHH@Z @ 262 NONAME ; public: int __thiscall RFile::AdoptFromServer(int,int)
+	?TransferToClient@RFile@@QBEHABVRMessage2@@H@Z @ 263 NONAME ; public: int __thiscall RFile::TransferToClient(class RMessage2 const &,int)const 
+	?TransferToProcess@RFile@@QBEHAAVRProcess@@HH@Z @ 264 NONAME ; public: int __thiscall RFile::TransferToProcess(class RProcess &,int,int)const 
+	?TransferToServer@RFile@@QBEHAAVTIpcArgs@@HH@Z @ 265 NONAME ; public: int __thiscall RFile::TransferToServer(class TIpcArgs &,int,int)const 
+	?Name@RFile@@QBEHAAVTDes16@@@Z @ 266 NONAME ; public: int __thiscall RFile::Name(class TDes16 &)const 
+	?Close@RDir@@QAEXXZ @ 267 NONAME ; public: void __thiscall RDir::Close(void)
+	?Close@RFile@@QAEXXZ @ 268 NONAME ; public: void __thiscall RFile::Close(void)
+	?Close@RFormat@@QAEXXZ @ 269 NONAME ; public: void __thiscall RFormat::Close(void)
+	?GetMediaSerialNumber@RFs@@QAEHAAV?$TBuf8@$0EA@@@H@Z @ 270 NONAME ; public: int __thiscall RFs::GetMediaSerialNumber(class TBuf8<64> &,int)
+	?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@I@Z @ 271 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int)
+	?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@IAAVTRequestStatus@@@Z @ 272 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int,class TRequestStatus &)
+	?FullName@RFile@@QBEHAAVTDes16@@@Z @ 273 NONAME ; public: int __thiscall RFile::FullName(class TDes16 &)const 
+	?AddPlugin@RFs@@QBEHABVTDesC16@@@Z @ 274 NONAME ; public: int __thiscall RFs::AddPlugin(class TDesC16 const &)const 
+	?Close@RPlugin@@QAEXXZ @ 275 NONAME ; public: void __thiscall RPlugin::Close(void)
+	?DismountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 276 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &)const 
+	?DismountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 277 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int)const 
+	?DismountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 278 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int,int)const 
+	?DoCancel@RPlugin@@IBEXI@Z @ 279 NONAME ; protected: void __thiscall RPlugin::DoCancel(unsigned int)const 
+	?DoControl@RPlugin@@IBEHH@Z @ 280 NONAME ; protected: int __thiscall RPlugin::DoControl(int)const 
+	?DoControl@RPlugin@@IBEHHAAVTDes8@@0@Z @ 281 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &,class TDes8 &)const 
+	?DoControl@RPlugin@@IBEHHAAVTDes8@@@Z @ 282 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &)const 
+	?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@@Z @ 283 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &)const 
+	?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@1@Z @ 284 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &,class TDes8 &)const 
+	?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@@Z @ 285 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &)const 
+	?MountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 286 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &)const 
+	?MountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 287 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int)const 
+	?MountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 288 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int,int)const 
+	?Open@RPlugin@@QAEHAAVRFs@@H@Z @ 289 NONAME ; public: int __thiscall RPlugin::Open(class RFs &,int)
+	?PluginName@RFs@@QAEHAAVTDes16@@HH@Z @ 290 NONAME ; public: int __thiscall RFs::PluginName(class TDes16 &,int,int)
+	?RemovePlugin@RFs@@QBEHABVTDesC16@@@Z @ 291 NONAME ; public: int __thiscall RFs::RemovePlugin(class TDesC16 const &)const 
+	?AllowDismount@RFs@@QBEHH@Z @ 292 NONAME ; public: int __thiscall RFs::AllowDismount(int)const 
+	?NotifyDismount@RFs@@QBEXHAAVTRequestStatus@@W4TNotifyDismountMode@@@Z @ 293 NONAME ; public: void __thiscall RFs::NotifyDismount(int,class TRequestStatus &,enum TNotifyDismountMode)const 
+	?NotifyDismountCancel@RFs@@QBEXAAVTRequestStatus@@@Z @ 294 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(class TRequestStatus &)const 
+	?NotifyDismountCancel@RFs@@QBEXXZ @ 295 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(void)const 
+	?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAHABVTDesC8@@@Z @ 296 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &,class TDesC8 const &)
+	?SetStartupConfiguration@RFs@@QBEHHPAX0@Z @ 297 NONAME ; public: int __thiscall RFs::SetStartupConfiguration(int,void *,void *)const 
+	?ReadCancel@RFile@@QBEXAAVTRequestStatus@@@Z @ 298 NONAME ; public: void __thiscall RFile::ReadCancel(class TRequestStatus &)const 
+	?ReadCancel@RFile@@QBEXXZ @ 299 NONAME ; public: void __thiscall RFile::ReadCancel(void)const 
+	?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@0HAAH@Z @ 300 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,class TDesC16 const &,int,int &)const 
+	?SetNotifyChange@RFs@@QAEHH@Z @ 301 NONAME ; public: int __thiscall RFs::SetNotifyChange(int)
+	?AddCompositeMount@RFs@@QBEHABVTDesC16@@HHH@Z @ 302 NONAME ; int RFs::AddCompositeMount(class TDesC16 const &, int, int, int) const
+	?Flush@RFile@@QAEXAAVTRequestStatus@@@Z @ 303 NONAME ; public: void __thiscall RFile::Flush(class TRequestStatus &)
+	?GetSystemDrive@RFs@@SA?AW4TDriveNumber@@XZ @ 304 NONAME ; public: static enum TDriveNumber  __cdecl RFs::GetSystemDrive(void)
+	??0TBlockMapEntry@@QAE@XZ @ 305 NONAME ; public: __thiscall TBlockMapEntry::TBlockMapEntry(void)
+	?BlockMap@RFile@@QBEHAAUSBlockMapInfo@@AA_J_JH@Z @ 306 NONAME ; public: int __thiscall RFile::BlockMap(struct SBlockMapInfo &,__int64 &,__int64,int)const 
+	?SetNumberOfBlocks@TBlockMapEntry@@QAEXI@Z @ 307 NONAME ; public: void __thiscall TBlockMapEntry::SetNumberOfBlocks(unsigned int)
+	?SetStartBlock@TBlockMapEntry@@QAEXI@Z @ 308 NONAME ; public: void __thiscall TBlockMapEntry::SetStartBlock(unsigned int)
+	?Clamp@RFileClamp@@QAEHAAVRFile@@@Z @ 309 NONAME ; public: int __thiscall RFileClamp::Clamp(class RFile &)
+	?Close@RFileClamp@@QAEHAAVRFs@@@Z @ 310 NONAME ; public: int __thiscall RFileClamp::Close(class RFs &)
+	?FileSystemSubType@RFs@@QBEHHAAVTDes16@@@Z @ 311 NONAME ; public: int __thiscall RFs::FileSystemSubType(int,class TDes16 &)const 
+	?InitialisePropertiesFile@RFs@@QBEHABVTPtrC8@@@Z @ 312 NONAME ; public: int __thiscall RFs::InitialisePropertiesFile(class TPtrC8 const &)const 
+	?QueryVolumeInfoExt@RFs@@QBEHHW4TQueryVolumeInfoExtCmd@@AAVTDes8@@@Z @ 313 NONAME ; public: int __thiscall RFs::QueryVolumeInfoExt(int,enum TQueryVolumeInfoExtCmd,class TDes8 &)const 
+	?VolumeIOParam@RFs@@QBEHHAAVTVolumeIOParamInfo@@@Z @ 314 NONAME ; public: int __thiscall RFs::VolumeIOParam(int,class TVolumeIOParamInfo &)const 
+	?GetSystemDriveChar@RFs@@SA?AVTChar@@XZ @ 315 NONAME ; public: static class TChar  __cdecl RFs::GetSystemDriveChar(void)
+	?SetSystemDrive@RFs@@QAEHW4TDriveNumber@@@Z @ 316 NONAME ; public: int __thiscall RFs::SetSystemDrive(enum TDriveNumber)
+	?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@I@Z @ 317 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &,unsigned int)const 
+	?SetFindMask@TFindFile@@QAEHI@Z @ 318 NONAME ; public: int __thiscall TFindFile::SetFindMask(unsigned int)
+	?FinaliseDrive@RFs@@QBEHHW4TFinaliseDrvMode@1@@Z @ 319 NONAME ; public: int __thiscall RFs::FinaliseDrive(int,enum RFs::TFinaliseDrvMode)const 
+	?Volume@RFs@@QBEXAAVTVolumeInfo@@HAAVTRequestStatus@@@Z @ 320 NONAME ; public: void __thiscall RFs::Volume(class TVolumeInfo &,int,class TRequestStatus &)const 
+	?AddProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 321 NONAME ; public: int __thiscall RFs::AddProxyDrive(class TDesC16 const &)
+	?Caps@RRawDisk@@QAEHAAVTDes8@@@Z @ 322 NONAME ABSENT ; public: int __thiscall RRawDisk::Caps(class TDes8 &)
+	?DismountProxyDrive@RFs@@QAEHI@Z @ 323 NONAME ; public: int __thiscall RFs::DismountProxyDrive(unsigned int)
+	?DoMountProxyDrive@RFs@@AAEHABVTIpcArgs@@@Z @ 324 NONAME ; private: int __thiscall RFs::DoMountProxyDrive(class TIpcArgs const &)
+	?RemoveProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 325 NONAME ; public: int __thiscall RFs::RemoveProxyDrive(class TDesC16 const &)
+	?ReadFileSection@RFs@@QBEHABVTDesC16@@_JAAVTDes8@@H@Z @ 326 NONAME ; public: int __thiscall RFs::ReadFileSection(class TDesC16 const &,__int64,class TDes8 &,int)const 
+	?AdoptFromClient@RFile64@@QAEHABVRMessage2@@HH@Z @ 327 NONAME ; public: int __thiscall RFile64::AdoptFromClient(class RMessage2 const &,int,int)
+	?AdoptFromCreator@RFile64@@QAEHHH@Z @ 328 NONAME ; public: int __thiscall RFile64::AdoptFromCreator(int,int)
+	?AdoptFromServer@RFile64@@QAEHHH@Z @ 329 NONAME ; public: int __thiscall RFile64::AdoptFromServer(int,int)
+	?Create@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 330 NONAME ; public: int __thiscall RFile64::Create(class RFs &,class TDesC16 const &,unsigned int)
+	?FileSize@TEntry@@QBE_JXZ @ 331 NONAME ; public: __int64 __thiscall TEntry::FileSize(void)const 
+	?Lock@RFile64@@QBEH_J0@Z @ 332 NONAME ; public: int __thiscall RFile64::Lock(__int64,__int64)const 
+	?Open@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 333 NONAME ; public: int __thiscall RFile64::Open(class RFs &,class TDesC16 const &,unsigned int)
+	?Read@RFile64@@QBEHIAAVTDes8@@@Z @ 334 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &)const 
+	?Read@RFile64@@QBEHIAAVTDes8@@H@Z @ 335 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &,int)const 
+	?Read@RFile64@@QBEH_JAAVTDes8@@@Z @ 336 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &)const 
+	?Read@RFile64@@QBEH_JAAVTDes8@@H@Z @ 337 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &,int)const 
+	?Read@RFile64@@QBEXIAAVTDes8@@AAVTRequestStatus@@@Z @ 338 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,class TRequestStatus &)const 
+	?Read@RFile64@@QBEXIAAVTDes8@@HAAVTRequestStatus@@@Z @ 339 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,int,class TRequestStatus &)const 
+	?Read@RFile64@@QBEX_JAAVTDes8@@AAVTRequestStatus@@@Z @ 340 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,class TRequestStatus &)const 
+	?Read@RFile64@@QBEX_JAAVTDes8@@HAAVTRequestStatus@@@Z @ 341 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,int,class TRequestStatus &)const 
+	?Replace@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 342 NONAME ; public: int __thiscall RFile64::Replace(class RFs &,class TDesC16 const &,unsigned int)
+	?Seek@RFile64@@QBEHW4TSeek@@AA_J@Z @ 343 NONAME ; public: int __thiscall RFile64::Seek(enum TSeek,__int64 &)const 
+	?SetSize@RFile64@@QAEH_J@Z @ 344 NONAME ; public: int __thiscall RFile64::SetSize(__int64)
+	?Size@RFile64@@QBEHAA_J@Z @ 345 NONAME ; public: int __thiscall RFile64::Size(__int64 &)const 
+	?Temp@RFile64@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 346 NONAME ; public: int __thiscall RFile64::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int)
+	?UnLock@RFile64@@QBEH_J0@Z @ 347 NONAME ; public: int __thiscall RFile64::UnLock(__int64,__int64)const 
+	?Write@RFile64@@QAEHIABVTDesC8@@@Z @ 348 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &)
+	?Write@RFile64@@QAEHIABVTDesC8@@H@Z @ 349 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int)
+	?Write@RFile64@@QAEH_JABVTDesC8@@@Z @ 350 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &)
+	?Write@RFile64@@QAEH_JABVTDesC8@@H@Z @ 351 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &,int)
+	?Write@RFile64@@QAEXIABVTDesC8@@AAVTRequestStatus@@@Z @ 352 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,class TRequestStatus &)
+	?Write@RFile64@@QAEXIABVTDesC8@@HAAVTRequestStatus@@@Z @ 353 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int,class TRequestStatus &)
+	?Write@RFile64@@QAEX_JABVTDesC8@@AAVTRequestStatus@@@Z @ 354 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,class TRequestStatus &)
+	?Write@RFile64@@QAEX_JABVTDesC8@@HAAVTRequestStatus@@@Z @ 355 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,int,class TRequestStatus &)
+	?IsValidName@RFs@@QAEHABVTDesC16@@AAVTNameValidParam@1@@Z @ 356 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,class RFs::TNameValidParam &)
+	?Close@RFs@@QAEXXZ @ 357 NONAME ; public: void __thiscall RFs::Close(void)
+	??1CFsNotify@@UAE@XZ @ 358 NONAME ; public: virtual __thiscall CFsNotify::~CFsNotify(void)
+	?AddNotification@CFsNotify@@QAEHIABVTDesC16@@0@Z @ 359 NONAME ; public: int __thiscall CFsNotify::AddNotification(unsigned int,class TDesC16 const &,class TDesC16 const &)
+	?Attributes@TFsNotification@@QBEHAAI0@Z @ 360 NONAME ; public: int __thiscall TFsNotification::Attributes(unsigned int &,unsigned int &)const 
+	?CancelNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 361 NONAME ; public: int __thiscall CFsNotify::CancelNotifications(class TRequestStatus &)
+	?FileSize@TFsNotification@@QBEHAA_J@Z @ 362 NONAME ; public: int __thiscall TFsNotification::FileSize(__int64 &)const 
+	?NewL@CFsNotify@@SAPAV1@AAVRFs@@H@Z @ 363 NONAME ; public: static class CFsNotify * __cdecl CFsNotify::NewL(class RFs &,int)
+	?NewName@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 364 NONAME ; public: int __thiscall TFsNotification::NewName(class TPtrC16 &)const 
+	?NextNotification@CFsNotify@@QAEPBVTFsNotification@@XZ @ 365 NONAME ; public: class TFsNotification const * __thiscall CFsNotify::NextNotification(void)
+	?NotificationType@TFsNotification@@QBE?AW4TFsNotificationType@1@XZ @ 366 NONAME ; public: enum TFsNotification::TFsNotificationType __thiscall TFsNotification::NotificationType(void)const 
+	?Path@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 367 NONAME ; public: int __thiscall TFsNotification::Path(class TPtrC16 &)const 
+	?RemoveNotifications@CFsNotify@@QAEHXZ @ 368 NONAME ; public: int __thiscall CFsNotify::RemoveNotifications(void)
+	?RequestNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 369 NONAME ; public: int __thiscall CFsNotify::RequestNotifications(class TRequestStatus &)
+	?SupportedFileSystemName@RFs@@QBEHAAVTDes16@@HH@Z @ 370 NONAME ; public: int __thiscall RFs::SupportedFileSystemName(class TDes16 &,int,int)const 
 	??1CFsMountHelper@@UAE@XZ @ 371 NONAME ; public: virtual __thiscall CFsMountHelper::~CFsMountHelper(void)
 	?DismountFileSystem@CFsMountHelper@@QBEHXZ @ 372 NONAME ; public: int __thiscall CFsMountHelper::DismountFileSystem(void)const 
 	?DismountFileSystem@CFsMountHelper@@QBEXAAVTRequestStatus@@W4TFsDismountMode@1@@Z @ 373 NONAME ; public: void __thiscall CFsMountHelper::DismountFileSystem(class TRequestStatus &,enum CFsMountHelper::TFsDismountMode)const 
 	?GetMountProperties@CFsMountHelper@@QAEHXZ @ 374 NONAME ; public: int __thiscall CFsMountHelper::GetMountProperties(void)
 	?MountFileSystem@CFsMountHelper@@QBEHXZ @ 375 NONAME ; public: int __thiscall CFsMountHelper::MountFileSystem(void)const 
 	?New@CFsMountHelper@@SAPAV1@AAVRFs@@H@Z @ 376 NONAME ; public: static class CFsMountHelper * __cdecl CFsMountHelper::New(class RFs &,int)
+	?DriveNumber@TFsNotification@@QBEHAAH@Z @ 377 NONAME ; public: int __thiscall TFsNotification::DriveNumber(int &)const 
+	?UID@TFsNotification@@QBEHAAVTUid@@@Z @ 378 NONAME ; public: int __thiscall TFsNotification::UID(class TUid &)const 
 
--- a/userlibandfileserver/fileserver/eabi/efileu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/eabi/efileu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -315,4 +315,14 @@
 	_ZNK9RFsPlugin6VolumeER11TVolumeInfoi @ 314 NONAME
 	_ZNK7CFileCB16IsSequentialModeEv @ 315 NONAME
 	_ZN7CFileCB12DirectIOModeERK12RMessagePtr2 @ 316 NONAME
+	_ZN19CFsNotificationInfo10SetNewNameERK7TDesC16 @ 317 NONAME
+	_ZN19CFsNotificationInfo11SetFilesizeEx @ 318 NONAME
+	_ZN19CFsNotificationInfo13SetAttributesEjj @ 319 NONAME
+	_ZN19CFsNotificationInfo13SetSourceNameERK7TDesC16 @ 320 NONAME
+	_ZN19CFsNotificationInfo4FreeERPS_ @ 321 NONAME
+	_ZN19CFsNotificationInfo6SetUidERK4TUid @ 322 NONAME
+	_ZN19CFsNotificationInfo8AllocateERK8CMountCBi @ 323 NONAME
+	_ZN8CMountCB17IssueNotificationEP19CFsNotificationInfo @ 324 NONAME
+	_ZTI19CFsNotificationInfo @ 325 NONAME
+	_ZTV19CFsNotificationInfo @ 326 NONAME
 
--- a/userlibandfileserver/fileserver/eabi/efsrvu.def	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/eabi/efsrvu.def	Mon Nov 01 20:11:36 2010 +0000
@@ -418,4 +418,6 @@
 	_ZNK14CFsMountHelper15MountFileSystemEv @ 417 NONAME
 	_ZNK14CFsMountHelper18DismountFileSystemER14TRequestStatusNS_15TFsDismountModeE @ 418 NONAME
 	_ZNK14CFsMountHelper18DismountFileSystemEv @ 419 NONAME
+	_ZNK15TFsNotification11DriveNumberERi @ 420 NONAME
+	_ZNK15TFsNotification3UIDER4TUid @ 421 NONAME
 
--- a/userlibandfileserver/fileserver/group/release.txt	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/group/release.txt	Mon Nov 01 20:11:36 2010 +0000
@@ -1,3 +1,16 @@
+Version 2.00.4009
+=================
+(Made by fadhliM 25/10/2010)
+
+1.	michcox
+	1.	Release Plan 590182	Files deployment over Virtual File System to PlatSim from Carbide
+		REQ 428-2409	PlatSim development environment enhancements
+		SUB 417-70025	Files deployment over Virtual File System to PlatSim from Carbide
+
+2.	migubarr
+	1.	ou1cimx1#627410 Atlantisry21x T_NOTIFY F32test case failed on e drive 
+
+
 Version 2.00.4008
 =================
 (Made by fadhliM 25/10/2010)
--- a/userlibandfileserver/fileserver/inc/f32fsys.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/inc/f32fsys.h	Mon Nov 01 20:11:36 2010 +0000
@@ -564,6 +564,169 @@
 	friend class TFsControlIo;			// for access to LocateDrives()
 #endif
 	};
+	
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION 
+    typedef TFsNotification::TFsNotificationType TNotificationType;
+#else
+    typedef TInt TNotificationType;
+#endif
+__ASSERT_COMPILE(sizeof(TNotificationType) == sizeof(TInt));
+
+class CFsNotificationInfoBody; 	//Forward-declaration
+class CFsClientMessageRequest; 	//Forward-declaration
+class TParsePtrC;				//Forward-declaration
+template <class T> class CFsPool; //Forward-declaration
+
+class CFsNotificationInfo : public CBase
+    {
+public:
+
+    /**
+     * For construction from File systems / CMountCBs
+     * 
+     * Provides a CFsNotificationInfo to populate. Populate with the change information.
+     * Supply this object to CMountCB::IssueNotification.
+     * 
+     * Once CMountCB::IssueNotification has been called,
+     * free the object by passing it to CFsNotificationInfo::Free
+     * (i.e. Do not call delete on the object)
+     * 
+     * @param aMount The mount control block which is issuing this notification
+     * @param aFunction The function as defined in TFsMessage, f32plugin.h, such as EFsFileWrite. 
+     * 
+     * @return  A CFsNotificationInfo* which may be populated with notification info.
+     *          Will return NULL in error conditions.
+     * 
+     * @see CMountCB::IssueNotification
+     * @see CFsNotificationInfo::Free
+     */
+    IMPORT_C static CFsNotificationInfo* Allocate(const CMountCB& aMount, TInt aFunction);
+    
+    /**
+     * Free CFsNotificationInfo objects allocated by CFsNotificationInfo::Allocate with this function.
+     * 
+     * On return aNotificationInfo will be set to NULL.
+     */
+    IMPORT_C static void Free(CFsNotificationInfo*& aNotificationInfo);
+    
+    //Set data:
+    
+    /**
+     * Set the source name for the changes. 
+     * This is the name of the file/directory that has changed.
+     * 
+     * "drive-letter:" is not to be included.
+     * 
+     * e.g.  "x:\\myfile.txt" is incorrect
+     *       "\\myfile.txt"   is correct.
+     */
+    IMPORT_C TInt SetSourceName(const TDesC& aSrc);
+    
+    /**
+     * Set the new name for the file. 
+     * This is the new name of the file in the case of a rename.
+     * 
+     * "drive-letter:" is not to be included.
+     */
+    IMPORT_C TInt SetNewName(const TDesC& aDest);
+    
+    /**
+     * In the case of a File Write or File Set Size operation being notified,
+     * the new file size of the file must be provided.
+     */
+    IMPORT_C TInt SetFilesize(TInt64 aFilesize);
+    
+    /**
+     * In the case of a change of attributes, the set and cleared attributes must be provided.
+     * (If these are not known, then the current attributes can be provided to aSet and
+     * inverse of the current attributes can be provided to aCleared.
+     */
+    IMPORT_C TInt SetAttributes(TUint aSet,TUint aCleared);
+
+    /**
+     * Set the UID of the process that has caused the change.
+     * 
+     */
+    IMPORT_C TInt SetUid(const TUid& aUid);
+    
+
+    
+    //******************************************** 
+    // File server internal :
+    //********************************************
+    
+    static CFsNotificationInfo* Allocate(CFsMessageRequest& aRequest);
+    static CFsNotificationInfo* Allocate(TInt aFunction, TInt aDrive);
+    
+    //Initialise notification object pool
+    static TInt Initialise();
+    
+    //Getters
+    TInt SetDriveNumber(TInt aDriveNumber);
+    void SetRequest(CFsRequest*);
+    TInt Function();
+    TInt DriveNumber();
+    TParsePtrC& Source();
+    TParsePtrC& NewName();
+    CFsRequest* Request();
+    TInt64* Data();    
+    TUid& Uid();
+    TNotificationType& NotificationType();
+    TBool DestDriveIsSet();
+    
+    /*
+     * This is the source length including the drive and colon
+     * which isn't actually saved as part of the stored source
+     */
+    TInt SourceSize();
+    /*
+     * This is the new name length including the drive and colon
+     * which may (or may not (- see below)) be actually part of the stored newname.
+	 *
+	 * "Drive:" is stored when the notification request originates from a
+	 * file server client and the drive could be different to the source's drive.
+	 *
+	 * In the case of a request originating from a CMountCB::IssueNotification call,
+	 * the CMountCB does not know about drive letters and only operates on a single
+	 * drive so in this case the "drive:" is missing.
+     */
+    TInt NewNameSize();
+    
+    static void NotificationType(TInt aFunction,TNotificationType& aNotificationType);
+    static void PathName(CFsClientMessageRequest& aRequest, TParsePtrC& aName);
+    static void NewPathName(CFsClientMessageRequest& aRequest, TParsePtrC& aName);
+    static TInt NotificationSize(CFsNotificationInfo& aRequest);
+    static TInt TypeToIndex(TNotificationType aType);
+    static TNotificationType NotificationType(TInt& aIndex);
+    static TInt DriveNumber(const TPtrC& aPath);
+    static void Attributes(CFsMessageRequest& aRequest, TUint& aSet, TUint& aClear);
+    static TInt64 FileSize(CFsMessageRequest& aRequest);
+    static TInt ValidateNotification(CFsNotificationInfo& aNotificationInfo);
+    static void SetData(CFsMessageRequest* aRequest, CFsNotificationInfo* aNotificationInfo);
+    static TUint NotifyType(TInt aFunction);
+
+private:
+    //Don't delete instances, free them.
+    virtual ~CFsNotificationInfo();
+    CFsNotificationInfo& operator=(CFsNotificationInfo& aNotification); //to prevent copying
+    
+    // called from New
+    CFsNotificationInfo();                  
+    
+    //Used to populate NotificationInfoPool
+    static CFsNotificationInfo* New();
+
+    //Called after construction/allocation from pool
+    TInt Init(TInt aFunction, TInt aDriveNumber);
+    
+    //Resets notification
+    void CleanNotification(); 
+    
+    CFsNotificationInfoBody* iBody;
+    friend class FsNotify;
+    friend class CFsPool<CFsNotificationInfo>; //For access to ~CFsNotificationInfo for compilation purposes
+    };
+
 
 class CFileCB;
 class CDirCB;
@@ -1395,9 +1558,36 @@
 	// calls GetInterface() with tracepoints added
 	TInt GetInterfaceTraced(TInt aInterfaceId,TAny*& aInterface,TAny* aInput);
 
-
-    
-
+public:
+	/*
+	 * This function is provided for file systems to issue notifications to file server clients
+	 * that have registered for notifications using the RFs::NotifyChange and CFsNotify client-side APIs.
+	 * 
+	 * @param aNotificationInfo This object should contain the relevant Source (and if appropriate, NewName)
+	 *                          as well as any other required information.
+	 *                          
+	 *                          The Source provided should be a fullpath of the form:
+	 *                                 \[path\]directory\      - in the case of changes to a directory
+	 *                                 \[path\]filename.ext    - in the case of changes to a file
+	 *
+	 *                          The drive letter information is not to be included.
+	 *                          
+	 *                          In the case of 'File Write' or 'File Set Size' operations, the resulting file size must be set.
+	 *						    @see CFsNotificationInfo::SetFileSize
+	 *
+	 *                          In the case of a attributes change, the attributes set and cleared must be set.
+	 *						    @see CFsNotificationInfo::SetAttributes
+	 *
+	 *							All CFsNotificationInfo objects must have a Uid set. This is the Uid of the 
+	 *							process which caused the change. i.e. A photo browser may wish to know if it was the camera app
+	 *							or the photo editor which has caused a change. @see CFsNotificationInfo::SetUID							
+	 *
+	 *                          @see class TFsNotification.
+	 *                                     
+	 * @return Symbian Standard error code. KErrNone on success.
+	 */
+	IMPORT_C TInt IssueNotification(CFsNotificationInfo* aNotificationInfo);
+	
 private:
     void SetFileSystem(CFileSystem* aFS);
 
@@ -2041,7 +2231,7 @@
 	void InitL();
 	inline CFileCB& File();
 
-	// For serialising aync requests 
+	// For serialising async requests 
 	TBool RequestStart(CFsMessageRequest* aRequest);
 	void RequestEnd(CFsMessageRequest* aRequest);
 	TBool RequestInProgress() const;
--- a/userlibandfileserver/fileserver/inc/f32notification.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/inc/f32notification.h	Mon Nov 01 20:11:36 2010 +0000
@@ -115,13 +115,16 @@
 
 	/*
 	 * @returns The Drive Number associated with the Path.
+	 */
 	IMPORT_C TInt DriveNumber(TInt& aDriveNumber) const;
-	 */
-	
+
 	/*
 	 * @returns the UID of the process that caused this change.
+	 *          NB, the UID of the process causing the change is not always available
+	 *			such as when memory cards are physically removed.
+	 */
 	IMPORT_C TInt UID(TUid& aUID) const;
-	 */
+	 
 private:
 	//Declared private to prevent construction
 	TFsNotification();
@@ -182,7 +185,7 @@
 		 * CFsNotify stores notifications in a buffer. 
 		 * Clients of CFsNotify must specify how large this buffer should be.
 		 * 
-		 * As a guideline: Notification objects in the buffer typically have a 8byte header,
+		 * As a guideline: Notification objects in the buffer typically have a 12-byte header,
 		 * followed by a word aligned string containing the fullname of the file that has changed.
 		 * In the case of a rename notification both the original and the new fullnames are stored.
 		 *
--- a/userlibandfileserver/fileserver/inc/f32ver.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/inc/f32ver.h	Mon Nov 01 20:11:36 2010 +0000
@@ -58,6 +58,6 @@
 
 @see TVersion
 */
-const TInt KF32BuildVersionNumber=4008;
+const TInt KF32BuildVersionNumber=4009;
 //
 #endif
--- a/userlibandfileserver/fileserver/sfile/efile.mmh	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/efile.mmh	Mon Nov 01 20:11:36 2010 +0000
@@ -48,8 +48,9 @@
 SOURCE			 sf_memory_man.cpp sf_memory_client.cpp
 SOURCE			 sf_plugin_shim.cpp
 SOURCE			 sf_notifier_handlers.cpp
+SOURCE			 sf_pool.cpp
 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
-SOURCE			 sf_pool.cpp sf_notifier.cpp
+SOURCE			  sf_notifier.cpp
 #endif
 
 #ifdef WINS
--- a/userlibandfileserver/fileserver/sfile/sf_dat.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_dat.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -27,6 +27,7 @@
 CFsObjectCon* RawDisks;
 CFsObjectCon* Extensions;
 CFsObjectCon* ProxyDrives;
+CFsPool<CFsNotificationInfo>* NotificationInfoPool;
 
 CServerFs* TheFileServer;
 TDrive TheDrives[KMaxDrives];
--- a/userlibandfileserver/fileserver/sfile/sf_dir.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_dir.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -149,7 +149,7 @@
 	TInt r=ParseSubstPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysDirOpen,&KCapFsPriDirOpen, __PLATSEC_DIAGNOSTIC_STRING("Dir Open"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysDirOpen,&KCapFsPriDirOpen, __PLATSEC_DIAGNOSTIC_STRING("Dir Open"));
 	if(r != KErrNone)
 		return r;
 	return KErrNone;
--- a/userlibandfileserver/fileserver/sfile/sf_file.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_file.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -290,7 +290,7 @@
 	TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src());
  	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileCreate,&KCapFsPriFileCreate,&KCapFsROFileCreate, __PLATSEC_DIAGNOSTIC_STRING("Create File")); 
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileCreate,&KCapFsPriFileCreate,&KCapFsROFileCreate, __PLATSEC_DIAGNOSTIC_STRING("Create File")); 
 	if (r!=KErrNone)
 		return(r);
 	if (OpenOnDriveZOnly)
@@ -320,7 +320,7 @@
 	TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src());
  	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileReplace,&KCapFsPriFileReplace,&KCapFsROFileReplace, __PLATSEC_DIAGNOSTIC_STRING("Replace File")); 
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileReplace,&KCapFsPriFileReplace,&KCapFsROFileReplace, __PLATSEC_DIAGNOSTIC_STRING("Replace File")); 
 	if (r!=KErrNone)
 		return(r);
 
@@ -419,7 +419,7 @@
 
 	if(ComparePrivate(thisPath))
 		{
-		if(! SIDCheck(aRequest,thisPath))
+		if(! SIDCheck(aRequest->Message(),thisPath))
 			{
 			if(!KCapFsPriFileOpen.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_MESSAGE("File Open in private path")))
 				return KErrPermissionDenied;
@@ -492,7 +492,7 @@
 	TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileOpen,&KCapFsPriIsFileOpen, __PLATSEC_DIAGNOSTIC_STRING("Is File Open")); 
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileOpen,&KCapFsPriIsFileOpen, __PLATSEC_DIAGNOSTIC_STRING("Is File Open")); 
 	return(r);
 	}
 
@@ -628,7 +628,7 @@
 	TInt r=ParseNoWildSubstPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Temp File")); 
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Temp File")); 
 	if (r!=KErrNone)
 		return(r);
 	if (aRequest->Src().NameOrExtPresent())
@@ -1496,9 +1496,6 @@
 	CFileCache* fileCache = share->File().FileCache();
 	if (fileCache && (r = fileCache->FlushDirty(aRequest)) != CFsRequest::EReqActionComplete)
 	    {
-		//To be used in notification framework
-	    //CFsMessageRequest& msgRequest = (CFsMessageRequest&)*aRequest;
-	    //msgRequest.iUID = msgRequest.Message().Identity();
 		return r;
 	    }
 
@@ -1950,7 +1947,7 @@
 		return(KErrBadName);
 	if (IsIllegalFullName(aRequest->Dest().FullName().Mid(2)))
 		return(KErrBadName);
-	r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysFileRename,&KCapFsPriFileRename,&KCapFsROFileRename, __PLATSEC_DIAGNOSTIC_STRING("File Rename"));
+	r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysFileRename,&KCapFsPriFileRename,&KCapFsROFileRename, __PLATSEC_DIAGNOSTIC_STRING("File Rename"));
 	return(r);
 	}
 
--- a/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -1623,7 +1623,7 @@
 
 
 
-TInt CFileCache::AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession)
+TInt CFileCache::AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession,TUid aUid)
 	{
 
 	RLocalMessage msgNew;
@@ -1632,7 +1632,7 @@
 	if (r != KErrNone)
 		return r;
 
-	aNewRequest->Set(msgNew, oP, aSession);
+	aNewRequest->Set(msgNew, oP, aSession, aUid);
 	aNewRequest->SetDrive(iDrive);
 	
 	// read-aheads and write-dirty requests should not be posted to plugins
@@ -1676,8 +1676,6 @@
 
 	if (newRequest)
 	    {
-		//To be used in notification framework.
-	    //newRequest->iUID = aOldRequest->Message().Identity();
 		newRequest->Dispatch();
 	    }
 
@@ -1762,8 +1760,8 @@
 	CSessionFs* session = aOldRequest && aOldRequest->Session() ? aOldRequest->Session() : iDirtyDataOwner;
 
 	__ASSERT_ALWAYS(session, Fault(EFlushingWithSessionNull));
-
-	TInt r = AllocateRequest(aNewRequest, ETrue, session);
+	
+	TInt r = AllocateRequest(aNewRequest, ETrue, session, (aOldRequest) ? aOldRequest->Uid() : TUid::Null());
 	if (r != KErrNone)
 		return r;
 	
--- a/userlibandfileserver/fileserver/sfile/sf_file_cache.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.h	Mon Nov 01 20:11:36 2010 +0000
@@ -91,7 +91,7 @@
 	static TInt CompleteFlushDirty(CFsRequest* aMsgRequest);
 	TInt FlushDirtySm(CFsMessageRequest& aMsgRequest);
 
-	TInt AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession = NULL);
+	TInt AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession = NULL,TUid aUid = KNullUid);
 
 	void DoReadAhead(CFsMessageRequest& aMsgRequest, TUint aMode);
 
--- a/userlibandfileserver/fileserver/sfile/sf_local.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_local.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -500,11 +500,14 @@
 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION	
 		if(FsNotificationManager::IsInitialised())
 			{
+		    CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(EFsDismountFileSystem,aDrive);
 			__PRINT3(_L("LocalDrives::CompleteDriveNotifications() Initialised=%d, Count=%d, Drive=%d"),FsNotificationManager::IsInitialised(),FsNotificationManager::Count(), aDrive);
 			TBuf<2> driveDes;
 			driveDes.Append((TChar)aDrive+(TChar)'A');
 			driveDes.Append((TChar)':');
-			FsNotificationManager::HandleChange(NULL,driveDes,TFsNotification::EMediaChange);
+			notificationInfo->SetSourceName(driveDes);
+			FsNotificationManager::HandleChange(*notificationInfo);
+			CFsNotificationInfo::Free(notificationInfo);
 			}
 #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION		
 
--- a/userlibandfileserver/fileserver/sfile/sf_main.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_main.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -166,7 +166,7 @@
 		aMessage.Complete(r);
 		return;
 		}
-	pR->Set(aMessage, oP, this);
+	pR->Set(aMessage, oP, this, aMessage.Identity());
 	__PRINT4TEMP(_L("***** Received Message sess %08x req %08x func 0x%x - %S"), this, pR, ipcFunction, GetFunctionName(ipcFunction));
 	pR->Dispatch();
 	}
@@ -485,6 +485,11 @@
 
 	// initialise notification information
 	FsNotify::Initialise();
+	
+	// initialise notification pool
+	r = CFsNotificationInfo::Initialise();
+	__ASSERT_ALWAYS(r==KErrNone,Fault(ENotifyPoolCreation));
+	
 	// initialise local drive specific information
 	LocalDrives::Initialise();
 
--- a/userlibandfileserver/fileserver/sfile/sf_mnt.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_mnt.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -19,7 +19,7 @@
 #include "sf_mntTraces.h"
 #endif
 
-
+#include "sf_notifier.h"
 
 
 /**
@@ -453,6 +453,22 @@
     }
 
 
+EXPORT_C TInt CMountCB::IssueNotification(CFsNotificationInfo* aNotificationInfo)
+    {
+    //Validate Notification
+    TInt r = CFsNotificationInfo::ValidateNotification(*aNotificationInfo);
+    if(r != KErrNone)
+        return r;
+    
+    //Target RFs::NotifyChange
+    FsNotify::HandleChange(*aNotificationInfo);
+    
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+    //Target CFsNotify
+    FsNotificationManager::HandleChange(*aNotificationInfo);
+#endif
+    return KErrNone;
+    }
 
 
 
--- a/userlibandfileserver/fileserver/sfile/sf_nbs.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_nbs.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -82,7 +82,7 @@
 	TInt r=ParseSubstPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysMkDir,&KCapFsPriMkDir,&KCapFsROMkDir, __PLATSEC_DIAGNOSTIC_STRING("Make Directory"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysMkDir,&KCapFsPriMkDir,&KCapFsROMkDir, __PLATSEC_DIAGNOSTIC_STRING("Make Directory"));
 	return(r);
 	}
 
@@ -110,7 +110,7 @@
 	TInt r=ParseSubstPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRmDir,&KCapFsPriRmDir,&KCapFsRORmDir, __PLATSEC_DIAGNOSTIC_STRING("Remove Directory"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRmDir,&KCapFsPriRmDir,&KCapFsRORmDir, __PLATSEC_DIAGNOSTIC_STRING("Remove Directory"));
 	return(r);
 	}
 
@@ -132,7 +132,7 @@
 	TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysDelete,&KCapFsPriDelete,&KCapFsRODelete, __PLATSEC_DIAGNOSTIC_STRING("Delete"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysDelete,&KCapFsPriDelete,&KCapFsRODelete, __PLATSEC_DIAGNOSTIC_STRING("Delete"));
 	return(r);
 	}
 
@@ -159,13 +159,13 @@
 	TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename"));
 	if(r!=KErrNone)
 		return(r);
 	TDrive* pOldDrive=aRequest->Drive();
 	if ((r=ParseNoWildSubstCheckPathPtr1(aRequest,aRequest->Dest()))!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename"));	
+	r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename"));	
 	if(r == KErrNone)
 		{
 		if (pOldDrive!=aRequest->Drive())
@@ -197,13 +197,13 @@
 	TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace"));	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace"));	
 	if(r!=KErrNone)
 		return(r);
 	TDrive* pOldDrive=aRequest->Drive();
 	if ((r=ParseNoWildSubstCheckPtr1(aRequest,aRequest->Dest()))!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace"));	
+	r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace"));	
 	if(r == KErrNone)
 		{
 		if (pOldDrive!=aRequest->Drive())
@@ -242,7 +242,7 @@
 
 	// Check the capabilites but always allow the entry to be read for private, system and 
 	// resource directories as long as there are no sub folders or files specified
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsEntry, __PLATSEC_DIAGNOSTIC_STRING("Entry"), ETrue);	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsEntry, __PLATSEC_DIAGNOSTIC_STRING("Entry"), ETrue);	
 
 	return(r);
 	}
@@ -277,7 +277,7 @@
 	TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
- 	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysSetEntry,&KCapFsPriSetEntry,&KCapFsROSetEntry, __PLATSEC_DIAGNOSTIC_STRING("Set Entry"));	
+ 	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysSetEntry,&KCapFsPriSetEntry,&KCapFsROSetEntry, __PLATSEC_DIAGNOSTIC_STRING("Set Entry"));	
 	return(r);
 	}
 
@@ -390,7 +390,7 @@
 	TInt r=ParseNoWildSubstFileCheckPtr1(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysReadFileSection,&KCapFsPriReadFileSection, __PLATSEC_DIAGNOSTIC_STRING("Read File Section"));	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysReadFileSection,&KCapFsPriReadFileSection, __PLATSEC_DIAGNOSTIC_STRING("Read File Section"));	
 	return(r);
 	}
 
@@ -481,7 +481,7 @@
 	TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src());	
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysGetShortName,&KCapFsPriGetShortName, __PLATSEC_DIAGNOSTIC_STRING("Get Short Name"));	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysGetShortName,&KCapFsPriGetShortName, __PLATSEC_DIAGNOSTIC_STRING("Get Short Name"));	
 	return(r);
 	}
 
@@ -508,7 +508,7 @@
 	TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src());	
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysGetLongName,&KCapFsPriGetLongName, __PLATSEC_DIAGNOSTIC_STRING("Get Long Name"));	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysGetLongName,&KCapFsPriGetLongName, __PLATSEC_DIAGNOSTIC_STRING("Get Long Name"));	
 	return(r);
 	}
 
@@ -537,7 +537,7 @@
 	TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src());	
 	if (r!=KErrNone)
 		return (r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileInRom,&KCapFsPriIsFileInRom, __PLATSEC_DIAGNOSTIC_STRING("Is File In Rom"));	
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileInRom,&KCapFsPriIsFileInRom, __PLATSEC_DIAGNOSTIC_STRING("Is File In Rom"));	
 	return(r);
 	}
 
--- a/userlibandfileserver/fileserver/sfile/sf_notifier.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_notifier.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -24,20 +24,21 @@
 CFsPool<CFsNotificationBlock>* FsNotificationManager::iPool;
 
 
-CFsNotificationPathFilter* CFsNotificationPathFilter::NewL(const TDesC& aPath, const TDesC& aFilename)
+CFsNotificationPathFilter* CFsNotificationPathFilter::NewL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum)
 	{
 	CFsNotificationPathFilter* self = new (ELeave) CFsNotificationPathFilter();
 	CleanupStack::PushL(self);
-	self->ConstructL(aPath,aFilename);
+	self->ConstructL(aPath,aFilename,aDriveNum);
 	CleanupStack::Pop(self);
 	return self;
 	}
 
-void CFsNotificationPathFilter::ConstructL(const TDesC& aPath, const TDesC& aFilename)
+void CFsNotificationPathFilter::ConstructL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum)
 	{
 	//Allocate the path and filename
 	iPath = aPath.AllocL();
 	iFilename = aFilename.AllocL();	
+	iDriveNum = aDriveNum;
 	}
 
 CFsNotificationPathFilter::~CFsNotificationPathFilter()
@@ -176,7 +177,7 @@
 			if(filterTypeCount)
 				{
 				//Remove this type from the filter register
-				TFsNotification::TFsNotificationType type = FsNotificationHelper::NotificationType(filterType);
+				TFsNotification::TFsNotificationType type = CFsNotificationInfo::NotificationType(filterType);
 				FsNotificationManager::SetFilterRegister(type,EFalse,filterTypeCount);
 				}
 			filterList.Reset();
@@ -188,8 +189,6 @@
 		currentDriveFilters = (TFsNotificationTypeDriveArray*)iterator.NextValue();
 		}
 	iDrivesTypesFiltersMap.Close();
-	iPathFilterList.ResetAndDestroy();
-	iPathFilterList.Close();
 	return KErrNone;
 	}
 
@@ -197,10 +196,8 @@
 	{
 	__PRINT(_L("CFsNotifyRequest::AddFilterL"));
 
-	iPathFilterList.AppendL(aFilter);
-	
 	//Get the drive number to so know which drive array to add the filter(s) to.
-	TInt driveNum = FsNotificationHelper::DriveNumber(aFilter->iPath->Des()); 
+	TInt driveNum = aFilter->iDriveNum; 
 	
 	TInt notifyType = 1; 
 	TInt r = KErrNone;
@@ -213,7 +210,7 @@
 			TFsNotificationTypeFilter typeFilter;
 			typeFilter.iNotificationType = (TFsNotification::TFsNotificationType) notifyType;
 			typeFilter.iPathFilter = aFilter;
-			TInt index = FsNotificationHelper::TypeToIndex(typeFilter.iNotificationType);
+			TInt index = CFsNotificationInfo::TypeToIndex(typeFilter.iNotificationType);
 			
 			//If the per-drive-filterLists have not
 			//been set up yet then do so now.
@@ -256,6 +253,11 @@
 	return iClientMsg.Handle();
 	}
 
+const RMessage2& CFsNotifyRequest::BufferMessage()
+    {
+    return iBufferMsg;
+    }
+
 void CFsNotifyRequest::CloseNotification()
 	{
 	__PRINT(_L("CFsNotifyRequest::CloseNotification()"));
@@ -328,7 +330,7 @@
 			User::LeaveIfError(iChainLock.CreateLocal());	
 			}
 		iNotifyRequests = TheContainer->CreateL();
-		iPool = CFsPool<CFsNotificationBlock>::New(KNotificationPoolSize);
+		iPool = CFsPool<CFsNotificationBlock>::New(KNotificationPoolSize,CFsNotificationBlock::New);
 		User::LeaveIfNull(iPool);
 		}
 	}
@@ -336,7 +338,7 @@
 void FsNotificationManager::SetFilterRegister(TUint aFilter, TBool aAdd, TInt aCount)
 	{
 	__PRINT2(_L("FsNotificationManager::SetFilterRegister(aFilter=%u,aAdd=%d)"),aFilter,aAdd);
-	TInt index = FsNotificationHelper::TypeToIndex((TFsNotification::TFsNotificationType)aFilter);
+	TInt index = CFsNotificationInfo::TypeToIndex((TFsNotification::TFsNotificationType)aFilter);
 	TInt& fr = FsNotificationManager::FilterRegister(index);
 	__ASSERT_DEBUG((aAdd) ? fr >= 0 : fr > 0,Fault(ENotificationFault));
 	fr+= aAdd ? aCount : -aCount; 
@@ -400,9 +402,9 @@
 	}
 
 //Get the notification type based on the TFsMessage function
-void FsNotificationHelper::NotificationType(TInt aFunction,TFsNotification::TFsNotificationType& aNotificationType)
+void CFsNotificationInfo::NotificationType(TInt aFunction,TNotificationType& aNotificationType)
 	{
-	__PRINT(_L("FsNotificationHelper::NotificationType"));
+	__PRINT(_L("CFsNotificationInfo::NotificationType"));
 	switch(aFunction)
 		{
 		case EFsFileWrite:
@@ -486,258 +488,7 @@
 	}
 
 
-//=====FsNotificationManager===========================
  
-//Get the path of the file, folder or drive name based on the TFsMessage function
-void FsNotificationHelper::PathName(CFsClientMessageRequest& aRequest, TDes& aPath)
-	{
-	__PRINT(_L("FsNotificationHelper::PathName"));
-	//Get the notification type
-	TInt function = aRequest.Operation()->Function();
-	
-	//Get the filename(s)
-	switch(function)
-		{
-		case EFsFileWrite:			//EParseSrc | EFileShare
-		case EFsFileSetSize:		//EParseSrc | EFileShare
-		case EFsFileSetAtt:			//EParseDst | EParseSrc, - should not use these; has share.
-		case EFsFileSet:
-		case EFsFileWriteDirty:		//EFileShare
-			{
-			CFileShare* share = NULL;
-			CFileCB* file = NULL;
-			GetFileFromScratch(&aRequest,share,file);	
-			aPath.Append(file->DriveNumber() + 'A');
-			aPath.Append(':');
-			aPath.Append(file->FileName().Des());
-			break;
-			}
-		case EFsFileCreate:			//EParseSrc
-		case EFsDelete:				//EParseSrc
-		case EFsSetEntry:			//EParseSrc,
-		case EFsFileRename:			//EParseDst | EParseSrc,
-		case EFsRename:				//EParseDst | EParseSrc,
-		case EFsReplace:			//EParseDst | EParseSrc,
-		case EFsFileReplace:		//EParseSrc
-			{
-			aPath.Copy(aRequest.Src().FullName());
-			break;
-			}
-        case EFsRmDir:              //EParseSrc
-        case EFsMkDir:              //EParseSrc
-            {
-            aPath.Copy(aRequest.Src().DriveAndPath());
-            break;
-            }
-		case EFsFormatNext:			//EParseSrc
-		case EFsDismountFileSystem: //0
-		case EFsMountFileSystem:	//0
-		case EFsSetVolume:			//0
-		case EFsSetDriveName:		//ESync
-		case EFsRawDiskWrite:		//EParseSrc
-		case EFsMountFileSystemScan:
-			{
-			_LIT(KFormatDrive,"?:");
-			TBuf<2> drive;
-			drive.Append(KFormatDrive);
-			drive[0] = TText(aRequest.Drive()->DriveNumber() + 'A');
-			aPath.Copy(drive);
-			break;
-			}
-		default:
-			ASSERT(0);
-			break;
-		}
-	}
-
-//Get the new path of the file, folder or drive name based on the TFsMessage function
-void FsNotificationHelper::NewPathName(CFsClientMessageRequest& aRequest, TPtrC& aNewPath)
-	{
-	__PRINT(_L("FsNotificationHelper::NewPathName"));
-	//Get the notification type
-	TInt function = aRequest.Operation()->Function();
-
-	//Get the filename(s)
-	switch(function)
-		{
-		case EFsFileRename:			//EParseDst | EParseSrc,
-		case EFsRename:				//EParseDst | EParseSrc,
-		case EFsReplace:			//EParseDst | EParseSrc,
-			{
-			aNewPath.Set(aRequest.Dest().FullName());
-			break;
-			}
-		case EFsSetDriveName:		//ESync
-			{
-			TFileName name;
-			aRequest.ReadL(KMsgPtr1, name);
-			aNewPath.Set(name);
-			break;
-			}
-		case EFsSetVolume:			//0
-			{
-			TFileName name;
-			aRequest.ReadL(KMsgPtr0, name);
-			aNewPath.Set(name);
-			break;
-			}
-		default:
-			{
-			ASSERT(0);
-			break;
-			}
-		}
-	}
-
-//Get the size of the notification based on its type
-TInt FsNotificationHelper::NotificationSize(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aNotificationType, const TDesC& aName)
-	{
-	__PRINT(_L("FsNotificationHelper::NotificationSize"));
-	
-	/*
-	 * If there are no new names, the order of the data in the buffer is:
-	 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
-	 * Word2   : NotificationType (Lower 2 bytes)
-	 * Word(s) : Path (TText8) , [Any sub-class members]
-	 * 
-	 * Else for notification types ERename, EVolumeName and EDriveName the order is:
-	 * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
-	 * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
-	 * Word(s) : Path (TText8) , NewName (TText8)
-	 * 
-	 * EOverflow size: KNotificationHeaderSize
-	 */	
-	
-	TInt size = KNotificationHeaderSize + Align4(aName.Size());
-	
-	switch(aNotificationType)
-		{
-		//NewName
- 		case TFsNotification::ERename:
-		case TFsNotification::EVolumeName:
-		case TFsNotification::EDriveName:
-			{
-			TPtrC dest;
-			NewPathName(aRequest,dest);
-			size += Align4(dest.Size()); 
-			break;
-			}
-		case TFsNotification::EFileChange:
-			{
-			size += sizeof(TInt64);
-			break;
-			}
-		case TFsNotification::EAttribute:
-			{
-			size += sizeof(TUint64);
-			break;
-			}
-		case TFsNotification::ECreate: 
-		case TFsNotification::EDelete:
-		case TFsNotification::EMediaChange:
-			{
-			break;
-			}
-		default:
-			{
-			ASSERT(0);
-			break;
-			}
-		}
-	return (TUint16) size;
-	}
-
-TFsNotification::TFsNotificationType FsNotificationHelper::NotificationType(TInt& aIndex)
-	{
-	__PRINT(_L("FsNotificationHelper::NotificationType(TInt)"));
-	__ASSERT_DEBUG(aIndex < KNumRegisterableFilters, Fault(ENotificationFault));
-	
-	switch(aIndex) //No break statements here on purpose
-		{
-		case 7 : return TFsNotification::EMediaChange;
-		case 6 : return TFsNotification::EDriveName;
-		case 5 : return TFsNotification::EVolumeName;
-		case 4 : return TFsNotification::EDelete;
-		case 3 : return TFsNotification::EAttribute;
-		case 2 : return TFsNotification::ECreate;
-		case 1 : return TFsNotification::ERename;
-		case 0 : return TFsNotification::EFileChange;
-		default: ASSERT(0); return (TFsNotification::TFsNotificationType) 0;
-		}
-	}
-
-//Get the array index of the notification based on its type
-TInt FsNotificationHelper::TypeToIndex(TFsNotification::TFsNotificationType aType)
-	{
-	__PRINT(_L("FsNotificationHelper::ArrayIndex"));
-
-	TInt index = 0; 
-	switch(aType) //No break statements here on purpose
-		{
-		case TFsNotification::EMediaChange: index++;
-		case TFsNotification::EDriveName:	index++;
-		case TFsNotification::EVolumeName:	index++;
-		case TFsNotification::EDelete:	 	index++;
-		case TFsNotification::EAttribute:	index++;
-		case TFsNotification::ECreate:	 	index++;
-		case TFsNotification::ERename:	 	index++;
-		case TFsNotification::EFileChange:	// skip;
-		default: break;
-		}
-	__ASSERT_DEBUG(index < KNumRegisterableFilters, Fault(ENotificationFault));
-	return index;
-	}
-
-TInt FsNotificationHelper::DriveNumber(const TPtrC& aPath)
-	{
-	if(aPath.Length() >= 2 && ((TChar)aPath[1])==(TChar)':')
-		{
-		TChar driveChar = ((TChar)aPath[0]);
-		driveChar.UpperCase();
-		TInt driveNum = driveChar-(TChar)'A'; 
-		return driveNum;
-		}
-	else
-		{
-		return KErrNotFound;
-		}
-	}
-
-//Get the attributes set and cleared
-void FsNotificationHelper::Attributes(CFsClientMessageRequest& aRequest, TUint& aSet, TUint& aClear)
-	{
-	__PRINT(_L("FsNotificationHelper::Attributes"));
-
-	TInt function = aRequest.Operation()->Function();
-	const RMessage2& msg = aRequest.Message();
-
-	switch(function)
-		{
-		case EFsFileSet:
-			{
-			aSet = msg.Int1();
-			aClear = msg.Int2();
-			break;
-			}
-		case EFsFileSetAtt:
-			{
-			aSet = msg.Int0();
-			aClear = msg.Int1();
-			break;
-			}
-		case EFsSetEntry:
-			{
-			aSet = msg.Int2();
-			aClear = msg.Int3();
-			break;
-			}
-		default:
-			{
-			ASSERT(0);
-			break;
-			}
-		}
-	}
 
 
 TBool CFsNotifyRequest::ValidateNotification(TInt aNotificationSize, TInt& aServerTail)
@@ -898,7 +649,7 @@
 // If there is a iClientMsg then this is the first time this
 // has been called since the client called RequestNotifications.
 // In this situation we complete the client request.
-TInt CFsNotifyRequest::NotifyChange(CFsClientMessageRequest* aRequest,const TDesC& aName, TFsNotification::TFsNotificationType aNotificationType, CFsNotificationBlock& aBlock)
+TInt CFsNotifyRequest::NotifyChange(CFsNotificationInfo* aRequest, CFsNotificationBlock& aBlock)
 	{
 	/*
 	 * Different notification types have different data associated with them.
@@ -920,8 +671,8 @@
 	
 	__PRINT(_L("CFsNotifyRequest::NotifyChange()"));
 
-	TInt notificationSize = FsNotificationHelper::NotificationSize(*aRequest,aNotificationType,aName);
-	
+    TInt notificationSize = CFsNotificationInfo::NotificationSize(*aRequest);
+    
 	iClientSyncLock.Wait();
 	iTailSemaphore.Wait();
 	
@@ -936,16 +687,23 @@
 	//We can store the size of the notification 
 	//and the size of the name in the same word.
 	
+	TBuf<2> driveBuf;
+	driveBuf.SetLength(2);
+    TChar driveLetter = 'A';
+    RFs::DriveToChar(aRequest->DriveNumber(),driveLetter);
+    driveBuf[0] = (TText)driveLetter;
+    driveBuf[1] = (TText)':';
+	
 	TUint16 nameLen = 0;	//Overflow has no name
 	TInt notifSize = KNotificationHeaderSize;
 	if(!overflow)
 		{
-		nameLen = (TUint16)aName.Size();
+        nameLen = (TUint16)aRequest->SourceSize();
 		notifSize = notificationSize;
 		}
 	else 
 		{
-		aNotificationType = TFsNotification::EOverflow;
+        aRequest->NotificationType() = TFsNotification::EOverflow;
 		}	
 
 	iServerTail = tail + notifSize;
@@ -958,62 +716,47 @@
 	memcpy((TText8*)aBlock.Data()+writeOffset,&sizeNameLen,sizeof(TUint));
 	writeOffset+=sizeof(TUint);
 
-	TPtrC newName;
-	
-	if (aNotificationType == TFsNotification::ERename ||
-		aNotificationType == TFsNotification::EVolumeName ||
-		aNotificationType == TFsNotification::EDriveName)
-		{
-		FsNotificationHelper::NewPathName(*aRequest,newName);
-		//Store NewNameSize and notification Type (Word2)
-		TUint typeNewNameLen = ((TUint16)newName.Size() << 16) | (TUint16)aNotificationType;
+    if (aRequest->NotificationType() == TFsNotification::ERename ||
+        aRequest->NotificationType() == TFsNotification::EVolumeName ||
+        aRequest->NotificationType() == TFsNotification::EDriveName)
+        {
+        //Store NewNameSize and notification Type (Word2)
+        TUint typeNewNameLen = ((TUint16)aRequest->NewNameSize() << 16) | (TUint16)aRequest->NotificationType();
 		memcpy((TText8*)aBlock.Data()+writeOffset,&typeNewNameLen,sizeof(TUint));
 		}
 	else
 		{
 		//Store notification Type (Word2)
-		memcpy((TText8*)aBlock.Data()+writeOffset,&aNotificationType,sizeof(TUint));
+        memcpy((TText8*)aBlock.Data()+writeOffset,&aRequest->NotificationType(),sizeof(TUint));
 		}
 	writeOffset+=sizeof(TUint);
 	
-	CFileShare* share = NULL;
-    CFileCB* file = NULL;
-    if(aRequest) //Don't always have a request such as when called from localdrives.
-        {
-        GetFileFromScratch(aRequest, share, file);
-        }
-    
     //
     //Store UID
-    /*
-	TUid uid;
-	uid.iUid = KErrUnknown;
-	if(aRequest && aRequest->Operation()->iFunction == EFsFileWriteDirty)
-	    {
-	    uid = aRequest->iUID;
-	    }
-	else if(aRequest)
-	    {
-	    uid = aRequest->Message().Identity();
-	    }
-	memcpy((TText8*)aBlock.Data()+writeOffset,&uid.iUid,sizeof(TUint32));
+	memcpy((TText8*)aBlock.Data()+writeOffset,&aRequest->Uid().iUid,sizeof(TUint32));
 	writeOffset+=sizeof(TUint32);
-	*/
+	
 	
 	if(!overflow)
 		{
 		//Store Name (Word3)
-		memcpy((TText8*)aBlock.Data()+writeOffset,aName.Ptr(),aName.Size());
-		writeOffset += Align4(aName.Size());
-		
+	    {
+	    //Store driveColon
+	    if(aRequest->NotificationType()!=TFsNotification::EMediaChange)
+	        {
+	        memcpy((TText8*)aBlock.Data()+writeOffset,driveBuf.Ptr(),driveBuf.Size());
+	        writeOffset += driveBuf.Size(); //NB: Not Align4'd deliberately.
+	        }
+	    memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->Source().FullName().Ptr(),aRequest->Source().FullName().Size());
+	    writeOffset += Align4(aRequest->Source().FullName().Size());
+	    }
 
-		switch (aNotificationType)
+        switch (aRequest->NotificationType())
 			{
 			case TFsNotification::EFileChange:
+			case TFsNotification::EAttribute:
 				{
-				TInt64 size = 0;
-				size = file->CachedSize64();
-				memcpy((TText8*)aBlock.Data()+writeOffset,&size,sizeof(TInt64));
+                memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->Data(),sizeof(TInt64));
 				writeOffset += sizeof(TInt64);
 				break;
 				}
@@ -1022,20 +765,19 @@
 			case TFsNotification::EDriveName:
 				{
 				//Store NewName
-				memcpy((TText8*)aBlock.Data()+writeOffset,newName.Ptr(),newName.Size());
-				writeOffset += Align4(newName.Size());
+				
+				if(!aRequest->DestDriveIsSet())
+				    {
+				    //This means that the notification has come from a Mount rather than from FileServer
+				    //It also means that the new name will have the same drive letter as the source.
+				    memcpy((TText8*)aBlock.Data()+writeOffset,driveBuf.Ptr(),driveBuf.Size());
+				    writeOffset += driveBuf.Size(); //NB: Not Align4'd deliberately.
+				    }
+                memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->NewName().FullName().Ptr(),aRequest->NewName().FullName().Size());
+                writeOffset += Align4(aRequest->NewName().FullName().Size());
 				break;
 				}
-			case TFsNotification::EAttribute:
-				{
-				TUint set=0;
-				TUint clear=0;
-				FsNotificationHelper::Attributes(*aRequest,set,clear);
-				TUint64 att = MAKE_TUINT64(set,clear);
-				memcpy((TText8*)aBlock.Data()+writeOffset,&att,sizeof(TUint64));
-				writeOffset += sizeof(TUint64);
-				break;
-				}
+
 			default:
 				{
 				break;
@@ -1085,107 +827,71 @@
 //A change has occurred in f32 represented by this
 //request object. Work out which CfsNotify’s are interested
 // (if any) and call CfsNotifyRequest::NotifyChange.
-void FsNotificationManager::HandleChange(CFsClientMessageRequest* aRequest,const TDesC& aOperationName, TFsNotification::TFsNotificationType aType)
-	{
-	__PRINT2(_L("FsNotificationManager::HandleChange() aRequest=0x%x, aType=%d"),&aRequest,aType);
-
-	Lock(); //ToDo: Read Lock (Read/Write Lock)	
-	if(Count())
-		{
-		//Only search while there are filters of this type set up.
-		TInt index = FsNotificationHelper::TypeToIndex(aType);
-		TInt& filterCount = FsNotificationManager::FilterRegister(index);
-		TInt seenFilter = filterCount; //Number of requests set up for this type
-		
-		//Iterate CFsNotifyRequests
-		TInt count = iNotifyRequests->Count();
-		
-		if(aType == TFsNotification::EMediaChange)
-			seenFilter = count;
-		
-		//If there aren't any requests then breakout
-		if(count == 0)
-			{
-			Unlock();
-			return;
-			}
-		
-		TInt driveNum = FsNotificationHelper::DriveNumber(aOperationName); 
+void FsNotificationManager::HandleChange(CFsNotificationInfo& aRequest)
+    {
+    __PRINT2(_L("FsNotificationManager::HandleChange() aNotificationInfo=0x%x,NotificationType=%d"),&aRequest,aRequest.NotificationType());
+    if(Count())
+        {
+        Lock(); //ToDo: Read Lock (Read/Write Lock) 
+        if(Count())
+            {
+            //Only search while there are filters of this type set up.
+            TInt index = CFsNotificationInfo::TypeToIndex(aRequest.NotificationType());
+            TInt& filterCount = FsNotificationManager::FilterRegister(index);
+            TInt seenFilter = filterCount; //Number of requests set up for this type
+            
+            //Iterate CFsNotifyRequests
+            TInt count = iNotifyRequests->Count();
+            
+            if(aRequest.NotificationType() == TFsNotification::EMediaChange)
+                seenFilter = count;
+            
+            //If there aren't any requests then breakout
+            if(count == 0)
+                {
+                Unlock();
+                return;
+                }
+            
+            //For every notification request(i.e. every CFsNotify client-side).
+            for(TInt i=0; i<count && seenFilter; ++i)
+                {
+                CFsNotifyRequest* notifyRequest = (CFsNotifyRequest*)(*iNotifyRequests)[i];
+                CFsNotifyRequest::TNotifyRequestStatus status = notifyRequest->ActiveStatus();
+                if(! (status==CFsNotifyRequest::EActive || 
+                      status==CFsNotifyRequest::EOutstanding))
+                    {
+                    //Not active; check next notification request
+                    continue;
+                    }
+                
+                //Check whether we are interested in this change.
+                //Get the filters associated with this operation on this drive
+                TFsNotificationTypeArray* filterList = notifyRequest->FilterTypeList(aRequest.DriveNumber(),index);
+                DoHandleChange(filterList,seenFilter,aRequest,notifyRequest);
 
-		//For every notification request.
-		for(TInt i=0; i<count && seenFilter; ++i)
-			{
-			CFsNotifyRequest* notifyRequest = (CFsNotifyRequest*)(*iNotifyRequests)[i];
-			CFsNotifyRequest::TNotifyRequestStatus status = notifyRequest->ActiveStatus();
-			if(! (status==CFsNotifyRequest::EActive || 
-				  status==CFsNotifyRequest::EOutstanding))
-				{
-				//Not active; check next notification request
-				continue;
-				}
-			
-			//Check whether we are interested in this change.
-			//Get the filters associated with this operation on this drive
-			TFsNotificationTypeArray* filterList = notifyRequest->FilterTypeList(driveNum,index);
-			DoHandleChange(filterList,seenFilter,aRequest,notifyRequest,aOperationName,aType);
-
-			if(aType==TFsNotification::EMediaChange)
-				continue; //next request
-			
-			//If there are still filters to check
-			if(seenFilter)
-				{
-				//Check changes that are not tied to a particular drive
-				filterList = notifyRequest->FilterTypeList(KErrNotFound,index);
-				DoHandleChange(filterList,seenFilter,aRequest,notifyRequest,aOperationName,aType);
-				}
-			}
-		}
-	Unlock();
-	}
-
-//A change has occurred in f32 represented by this
-//request object. Work out which CfsNotify’s are interested
-// (if any) and call CfsNotifyRequest::NotifyChange.
-void FsNotificationManager::HandleChange(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aType)
-	{
-	__PRINT(_L("FsNotificationManager::HandleChange"));
-	TFileName currentOperationsName;
-	FsNotificationHelper::PathName(aRequest, currentOperationsName);
-	if(currentOperationsName.Length())
-		HandleChange(&aRequest,currentOperationsName,aType);
-	}
-
-//A change has occurred in f32 represented by this
-//request object. Work out which CfsNotify’s are interested
-// (if any) and call CfsNotifyRequest::NotifyChange.
-void FsNotificationManager::HandleChange(CFsClientMessageRequest& aRequest)
-	{
-	if(Count() && aRequest.Message().Handle() != KLocalMessageHandle)
-		{
-		__PRINT(_L("FsNotificationManager::HandleChange"));
-		TFsNotification::TFsNotificationType operationNotificationType;
-		FsNotificationHelper::NotificationType(aRequest.FsFunction(), operationNotificationType);
-		HandleChange(aRequest,operationNotificationType);
-		}
-	}
+                if(aRequest.NotificationType()==TFsNotification::EMediaChange)
+                    continue; //next request
+                
+                //If there are still filters to check
+                if(seenFilter)
+                    {
+                    //Check changes that are not tied to a particular drive
+                    filterList = notifyRequest->FilterTypeList(KErrNotFound,index);
+                    DoHandleChange(filterList,seenFilter,aRequest,notifyRequest);
+                    }
+                }
+            }
+        Unlock();
+        }
+    }
 
 
 ////
 #else
 ////
 
-void FsNotificationManager::HandleChange(CFsClientMessageRequest* ,const TDesC&, TFsNotification::TFsNotificationType)
-	{
-	return;
-	}
-
-void FsNotificationManager::HandleChange(CFsClientMessageRequest& , TFsNotification::TFsNotificationType)
-	{
-	return;
-	}
-
-void FsNotificationManager::HandleChange(CFsClientMessageRequest&)
+void FsNotificationManager::HandleChange(CFsNotificationInfo&)
 	{
 	return;
 	}
@@ -1193,10 +899,11 @@
 #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
 
 //Called from FsNotificationManager::DoHandleChange
-FsNotificationManager::TFsNotificationFilterMatch FsNotificationManager::DoMatchFilter(CFsClientMessageRequest* aRequest, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter)
+FsNotificationManager::TFsNotificationFilterMatch FsNotificationManager::DoMatchFilter(const RMessage2& aMessage, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter)
     {
     TFsNotificationFilterMatch filterMatch = EDifferent;
     TParsePtrC parseOp(aOperationName);
+    
     TPtrC pathOpDes = parseOp.DriveAndPath();
     TPtrC nameOpDes = parseOp.NameAndExt();
     TInt pathLength = aFilter.iPath->Des().Length();
@@ -1210,7 +917,7 @@
     else //if no path filter was set up
         // then we need to ensure we don't notify on data-caged areas which we shouldn't
         {
-        TInt r = PathCheck(aRequest,aOperationName.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("FsNotificationManager::DoHandleChange"));
+        TInt r = PathCheck(aMessage,aOperationName.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("FsNotificationManager::DoHandleChange"));
         if(r != KErrNone)
             return EContinue; //next filter
         }
@@ -1228,8 +935,9 @@
     return filterMatch;
     }
 
-// This is called on a per drive basis.
-void FsNotificationManager::DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray,TInt& aSeenFilter, CFsClientMessageRequest* aRequest, CFsNotifyRequest* aNotifyRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType& aType)
+// The aFilterTypeArray is an array for the filters that target the current drive (only).
+// This is called on a per client (CFsNotify) basis.
+void FsNotificationManager::DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray,TInt& aSeenFilter, CFsNotificationInfo& aNotificationInfo, CFsNotifyRequest* aNotifyRequest)
 	{		
 	__PRINT(_L("FsNotificationManager::DoHandleChange()"));
 	
@@ -1238,36 +946,39 @@
 	
 	TInt numFilters = aFilterTypeArray->Count();
 	
-	if(aType == TFsNotification::EMediaChange)
-		numFilters = 1; //Only need to notify once per drive.
-		
-	//For every filter in this request
+    if(aNotificationInfo.NotificationType() == TFsNotification::EMediaChange)
+        numFilters = 1; //Only need to notify once per client for EMediaChange.
+        
+    //For every filter in this request (CFsNotify)
 	for(TInt j = 0; j < numFilters;++j)
 		{
 		//Is the correct notification type
 		aSeenFilter--;
 		
 		TBool filterMatch = EDifferent;
-		if(aType != TFsNotification::EMediaChange)
+        if(aNotificationInfo.NotificationType()  != TFsNotification::EMediaChange)
 			{
 			CFsNotificationPathFilter& filter = *(((*aFilterTypeArray)[j]).iPathFilter);
-			__PRINT2(_L("FsNotificationManager::DoHandleChange() operationName=%S, filterName=%S"),&aOperationName,filter.iPath);
-			
-			filterMatch = DoMatchFilter(aRequest,aOperationName,filter);
+            __PRINT2(_L("FsNotificationManager::DoHandleChange() operationName=%S, filterName=%S"),&aNotificationInfo.Source().FullName(),filter.iPath);
+            
+			//buferMsg here is the message of the client *recieving* the notification
+            const RMessage2& bufferMsg = aNotifyRequest->BufferMessage();
+            filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.Source().FullName(),filter);
 			if(filterMatch == FsNotificationManager::EContinue)
 			    continue; //triggers for data cages
 			
 			//We need to check for changes coming in to a directory when its rename
-			if(aType == TFsNotification::ERename && filterMatch==FsNotificationManager::EDifferent)  
+            if(aNotificationInfo.NotificationType() == TFsNotification::ERename && filterMatch==FsNotificationManager::EDifferent)  
                 {
-                TPtrC aDestinationNamePtrC;
-                FsNotificationHelper::NewPathName(*aRequest,aDestinationNamePtrC);
-                __PRINT2(_L("FsNotificationManager::DoHandleChange() destinationName=%S, filterName=%S"),&aDestinationNamePtrC,filter.iPath);
-                filterMatch = DoMatchFilter(aRequest,aDestinationNamePtrC,filter);
+                __PRINT2(_L("FsNotificationManager::DoHandleChange() destinationName=%S, filterName=%S"),&aNotificationInfo.NewName().FullName(),filter.iPath);
+                if(aNotificationInfo.DestDriveIsSet())
+                    filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.NewName().FullName().Mid(2),filter);
+                else
+                    filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.NewName().FullName(),filter);
                 }
 			}
 
-		if(filterMatch || (aType == TFsNotification::EMediaChange))//Match or MediaChange (report regardless of filters)
+        if(filterMatch || (aNotificationInfo.NotificationType() == TFsNotification::EMediaChange))//Match or MediaChange (report regardless of filters)
 			{
 			//Matching - Handle change
 			
@@ -1275,7 +986,7 @@
 			//So that we can do IPC from a single place.
 			CFsNotificationBlock* block = iPool->Allocate();
 				
-			TInt r = aNotifyRequest->NotifyChange(aRequest,aOperationName,aType,*block);
+            TInt r = aNotifyRequest->NotifyChange(&aNotificationInfo,*block);
 				
 			//Free block
 			iPool->Free(block);
--- a/userlibandfileserver/fileserver/sfile/sf_notifier.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_notifier.h	Mon Nov 01 20:11:36 2010 +0000
@@ -51,12 +51,13 @@
 class CFsNotificationPathFilter
 	{
 public:
-	static CFsNotificationPathFilter* NewL(const TDesC& aPath, const TDesC& aFilename);
+	static CFsNotificationPathFilter* NewL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum);
 	~CFsNotificationPathFilter();
 private:
-	void ConstructL(const TDesC& aPath, const TDesC& aFilename);
+	void ConstructL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum);
 	CFsNotificationPathFilter();
 public:
+	TInt iDriveNum;
 	HBufC* iPath;
 	HBufC* iFilename;
 	};
@@ -119,7 +120,7 @@
 	
 	/*
 	 * Returns the RArray<TFsNotificationFilter> for an index
-	 * as returned from FsNotificationHelper::TypeToIndex()
+	 * as returned from CFsNotificationInfo::TypeToIndex()
 	 */
 	TFsNotificationTypeArray* FilterTypeList(TInt aDrive,TInt aIndex);
 	
@@ -157,11 +158,8 @@
 	 * notification of this operation to the client.
 	 * 
 	 * Calling of this function means that we are notifying about this operation. (all checks passed)
-	 * 
-	 * aRequest can be NULL when the request doesn't come from the file server 
-	 * (such as when a media card is removed)
 	 */
-	TInt NotifyChange(CFsClientMessageRequest* aRequest, const TDesC& aName, TFsNotification::TFsNotificationType aNotificationType, CFsNotificationBlock& aBlock);
+	TInt NotifyChange(CFsNotificationInfo* aRequest, CFsNotificationBlock& aBlock);
 		
 	/*
 	 * This function performs the IPC to the client's buffer.
@@ -174,6 +172,9 @@
 	//Simple getter
 	TInt ClientMsgHandle();
 	
+	//Platsec needs to check against the path with a message of the *receiving* client. 
+	const RMessage2& BufferMessage();
+	
 private:
 	CFsNotifyRequest();
 	void ConstructL();
@@ -216,15 +217,7 @@
 	 * Each index of the TFsNotificationTypeDriveArray is a TFsNotificationTypeArray
 	 */
 	RHashMap<TInt,TFsNotificationTypeDriveArray> iDrivesTypesFiltersMap;
-	
-	/*
-	 * The iPathFilterList is an RPointerArray of CFsNotificationPathFilters.
-	 * 
-	 * These are normally only accessed via a TFsNotificationTypeFilter (via iDrivesTypesFiltersMap),
-	 * not via this array directly.
-	 */
-	RPointerArray<CFsNotificationPathFilter> iPathFilterList;
-	
+		
 	RMessage2 iBufferMsg; //To update buffer
 	RMessage2 iClientMsg; //client notification request
 	
@@ -270,24 +263,6 @@
 	};
 
 /**
- * Helper class to get certain attributes from or about a particular operation to used in a notification
- * 
- * @internalTechnology
- */
-class FsNotificationHelper
-	{
-public:
-	static void NotificationType(TInt aFunction,TFsNotification::TFsNotificationType& aNotificationType);
-	static void PathName(CFsClientMessageRequest& aRequest, TDes& aName);
-	static void NewPathName(CFsClientMessageRequest& aRequest, TPtrC& aName);
-	static TInt NotificationSize(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aNotificationType, const TDesC& aName);
-	static TInt TypeToIndex(TFsNotification::TFsNotificationType aType);
-	static TFsNotification::TFsNotificationType NotificationType(TInt& aIndex);
-	static TInt DriveNumber(const TPtrC& aPath);
-	static void Attributes(CFsClientMessageRequest& aRequest, TUint& aSet, TUint& aClear);
-	};
-
-/**
  * The FsNotificationManager is a static object
  * 
  *@internalTechnology
@@ -307,26 +282,8 @@
 	 * Work out which CFsNotifyRequests are interested
 	 * (if any) and call CFsNotifyRequest::NotifyChange.
 	 */
-	static void HandleChange(CFsClientMessageRequest& aRequest);
-	
-	/* A change has occurred represented by this request.
-	 * Work out which CFsNotifyRequests are interested
-	 * (if any) and call CFsNotifyRequest::NotifyChange.
-	 * 
-	 * This override is used directly when we want to force a particular notification type
-	 */
-	static void HandleChange(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aType);
+	static void HandleChange(CFsNotificationInfo& aRequest);
 	
-	/* 
-	 * This override is used directly when we want to specify the current operation's name (src) and notification type.
-	 * 
-	 * aRequest can be NULL when the request doesn't come from the file server 
-	 * such as when a media card is removed, see LocalDrives::CompleteDriveNotifications
-	 * 
-	 * @See LocalDrives::CompleteDriveNotifications(TInt aDrive)
-	 */
-	static void HandleChange(CFsClientMessageRequest* aRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType aType);
-
 	//Initialise iNotifyRequests and iStaticNotification
 	static void OpenL();
 	static TBool IsInitialised();
@@ -350,7 +307,7 @@
 	static void SetFilterRegister(TUint aFilter, TBool aAdd, TInt aCount = 1);
 	/*
 	 * Get the number of registers filters set up on a particular type.
-	 * @param aIndex the TFsNotificationType's index as determined from FsNotificationHelper::TypeToIndex
+	 * @param aIndex the TFsNotificationType's index as determined from CFsNotificationInfo::TypeToIndex
 	 */
 	static TInt& FilterRegister(TInt aIndex);
 
@@ -386,13 +343,13 @@
     /*
      * Checks whether aOperation matches the filter name and/or path set in aFilter. 
      */
-    static TFsNotificationFilterMatch DoMatchFilter(CFsClientMessageRequest* aRequest, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter);
+    static TFsNotificationFilterMatch DoMatchFilter(const RMessage2& aMessage, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter);
     
 	/*
 	 * Iterates filters for a particular drive.
 	 * Called from HandleChange
 	 */
-	static void DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray, TInt& aSeenFilter, CFsClientMessageRequest* aRequest, CFsNotifyRequest* aNotifyRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType& aType);
+	static void DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray, TInt& aSeenFilter, CFsNotificationInfo& aNotificationInfo, CFsNotifyRequest* aNotifyRequest);
 	
 	/*
 	 * Stores the CFsNotifyRequests
--- a/userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -261,7 +261,7 @@
 		}
 	
 	if(path.Length() >= 2)
-		r=PathCheck(aRequest,path.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Notification Add Filter"));
+		r=PathCheck(aRequest->Message(),path.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Notification Add Filter"));
 	return r;
 	}
 
@@ -284,14 +284,32 @@
 	__PRINT2(_L("TFsNotificationAdd::AddNotification() path=%S, filename=%S"),&path,&filename);
 	
 	//If this is a path starting with 'drive-letter:'
-	TInt driveNum = FsNotificationHelper::DriveNumber(path);
-	if(path.Length() >= 2 && (driveNum < 0 || driveNum > 25) && ((TChar)driveNum)!=((TChar)'?') && ((TChar)path[1])==(TChar)':')
-		{
-		return KErrPathNotFound;
-		}
+	TInt driveNum = CFsNotificationInfo::DriveNumber(path);
+	if(path.Length() >= 2)
+	    {
+	    if(path[1] != (TText)':')
+	        {
+	        if(path[0]!=(TText)'*')
+	            {
+	            return KErrPathNotFound;
+	            }
+	        }
+	    else // 2nd char is ':' 
+	        {
+	        if(driveNum < EDriveA  || driveNum > EDriveZ)
+	            {
+	            if(path[0]!=(TText)'?')
+	                return KErrPathNotFound;
+	            }
+	        }
+	    }
 
 	CleanupStack::PushL(notifyRequest);
-	CFsNotificationPathFilter* filter = CFsNotificationPathFilter::NewL(path,filename);
+	TPtrC pathPtr(path);
+	if(driveNum!=KErrNotFound || ((path.Length() >=1) && path[0]=='?'))
+	    //Remove the drive: part of the the path if it's got one.
+	    pathPtr.Set(path.Mid(2));
+	CFsNotificationPathFilter* filter = CFsNotificationPathFilter::NewL(pathPtr,filename,driveNum);
 
 	//Bitmask of filter types
 	TUint filterMask = (TUint) aRequest->Message().Int0();
--- a/userlibandfileserver/fileserver/sfile/sf_notify.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_notify.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -16,14 +16,866 @@
 //
 
 #include "sf_std.h"
+#include "sf_notifier.h"
+#include "sf_pool.h"
 
-
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+#include <f32notification.h>
+#endif
 
 TChangeQue FsNotify::iChangeQues[KMaxNotifyQues];
 TDiskSpaceQue FsNotify::iDiskSpaceQues[KMaxDiskQues];
 TDebugQue FsNotify::iDebugQue;
 TDismountNotifyQue FsNotify::iDismountNotifyQue;
 
+_LIT(KEmptyString,"");
+
+CFsNotificationInfoBody::CFsNotificationInfoBody()
+: iSrc(KEmptyString),
+  iSrcBuf(KEmptyString),
+  iDest(KEmptyString),
+  iDestDriveStored(EFalse),
+  iFunction(KErrNotFound),
+  iData(KErrNotFound), 
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+  iNotificationType(TFsNotification::EOverflow),
+#else
+  iNotificationType(KErrNotFound),
+#endif
+  iUid(TUid::Null())
+    {
+    }
+
+CFsNotificationInfo::CFsNotificationInfo()
+    {
+    }
+
+/*
+ * These do not get deleted, they get Freed via CFsNotificationInfo::Free.
+ */
+CFsNotificationInfo::~CFsNotificationInfo()
+    {
+    Fault(ENotificationInfoDeletion);
+    }
+
+TInt CFsNotificationInfo::Init(TInt aFunction, TInt aDriveNum)
+    {
+    //Clean notification before use
+    CleanNotification();
+    
+    iBody->iFunction = aFunction;
+    TInt err = SetDriveNumber(aDriveNum);
+    if(err != KErrNone)
+        {
+        return err;
+        }
+ 
+    //Set notification type
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+    CFsNotificationInfo::NotificationType(iBody->iFunction, iBody->iNotificationType);
+#else
+    iBody->iNotificationType = KErrNotSupported;
+#endif   
+    return KErrNone;
+    }
+
+void CFsNotificationInfo::CleanNotification()
+    {
+    //Clear all variables 
+    TParsePtrC empty(KEmptyString);
+    memcpy(&iBody->iSrc,&empty,sizeof(TParsePtrC));
+    memcpy(&iBody->iDest,&empty,sizeof(TParsePtrC));
+    iBody->iData = KErrNotFound;
+    iBody->iRequest = NULL;
+    iBody->iDriveNumber = KErrNotFound;
+    iBody->iUid = TUid::Null();
+    iBody->iDestDriveStored = EFalse;
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+    iBody->iNotificationType=TFsNotification::EOverflow;
+#else
+    iBody->iNotificationType=KErrNotFound;
+#endif
+    }
+
+EXPORT_C CFsNotificationInfo* CFsNotificationInfo::Allocate(const CMountCB& aMount, TInt aFunction)
+    {
+    CFsNotificationInfo* info = NotificationInfoPool->Allocate();
+    __ASSERT_DEBUG(info,User::Panic(_L("CFsNotificationInfo::Allocate, Could not allocate"),KErrNotFound));
+    
+    TInt driveNum = aMount.Drive().DriveNumber();
+    __ASSERT_ALWAYS((driveNum >= EDriveA && driveNum <= EDriveZ), User::Panic(_L("CFsNotificationInfo::Allocate - Invalid Drive Num"),KErrArgument));
+    TInt err = info->Init(aFunction,driveNum);
+    if(err != KErrNone)
+        {
+        Free(info);
+        return NULL;
+        }
+    return info;
+    }
+
+
+CFsNotificationInfo* CFsNotificationInfo::Allocate(CFsMessageRequest& aRequest)
+    {
+    //Get a notification Info block from the pool.
+    CFsNotificationInfo* notificationInfo = NotificationInfoPool->Allocate();
+    
+    //Set the function and call Init.
+    TInt function = aRequest.Operation()->Function();
+    notificationInfo->iBody->iFunction = function;
+    TInt err = notificationInfo->Init(function,aRequest.DriveNumber());
+    if(err != KErrNone)
+        {
+        CFsNotificationInfo::Free(notificationInfo);
+        return NULL;
+        }
+
+    //Set request
+    notificationInfo->SetRequest(&aRequest);
+
+	//Set UID
+    notificationInfo->SetUid(aRequest.Uid()); 
+
+    //Set notification type
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+    CFsNotificationInfo::SetData(&aRequest,notificationInfo);
+#endif    
+    
+    CFsClientMessageRequest& msgRequest = (CFsClientMessageRequest&)aRequest;
+    
+    //Get and store Src
+    CFsNotificationInfo::PathName(msgRequest,notificationInfo->Source());
+    
+	//Get and store NewName/Dest
+    switch(function)
+        {
+        case EFsFileRename:
+        case EFsRename:    
+        case EFsReplace:   
+        case EFsSetDriveName:
+        case EFsSetVolume:
+            {
+            CFsNotificationInfo::NewPathName((CFsClientMessageRequest&)aRequest,notificationInfo->NewName());
+            notificationInfo->iBody->iDestDriveStored = ETrue;
+            }
+        default:
+            break;
+        }
+    return notificationInfo;
+    }
+
+CFsNotificationInfo* CFsNotificationInfo::Allocate(TInt aFunction, TInt aDrive)
+    {
+    //Get a notification Info block from the pool.
+    CFsNotificationInfo* notificationInfo = NotificationInfoPool->Allocate();
+    
+    //Set the function and call Init.
+    notificationInfo->iBody->iFunction = aFunction;
+    TInt err = notificationInfo->Init(aFunction,aDrive);
+    if(err != KErrNone)
+        {
+        CFsNotificationInfo::Free(notificationInfo);
+        return NULL;
+        }
+    
+    //Set request (NULL)
+    notificationInfo->SetRequest(NULL);
+	
+	//Set UID (KNullUid)
+    notificationInfo->SetUid(TUid::Null());
+    return notificationInfo;
+    }
+
+EXPORT_C void CFsNotificationInfo::Free(CFsNotificationInfo*& aNotificationInfo)
+    {
+    __ASSERT_DEBUG(aNotificationInfo,User::Panic(_L("CFsNotificationInfo::Free - KErrArgument"), KErrArgument));
+    NotificationInfoPool->Free(aNotificationInfo);    
+    aNotificationInfo = NULL;
+    }
+
+
+TInt CFsNotificationInfo::Initialise()
+    {
+    //Have to trap as sf_main.cpp commonInitialize doesn't.
+    TRAPD(r, NotificationInfoPool = CFsPool<CFsNotificationInfo>::New(KMaxDrives,CFsNotificationInfo::New));
+    if(r != KErrNone)
+        return r;
+    if(!NotificationInfoPool)
+        return KErrNoMemory;
+    return KErrNone;
+    }
+
+CFsNotificationInfo* CFsNotificationInfo::New()
+    {
+    CFsNotificationInfo* info = new CFsNotificationInfo;
+    __ASSERT_ALWAYS(info,Fault(ENotifyPoolCreation));
+    info->iBody = new CFsNotificationInfoBody();
+    __ASSERT_ALWAYS(info->iBody,Fault(ENotifyPoolCreation));
+    return info;
+    }
+
+EXPORT_C TInt CFsNotificationInfo::SetSourceName(const TDesC& aSrc)
+    {
+    //Add the aSrc to a TParsePtrC (no copying the filename)
+    TParsePtrC sourceParsePtr(aSrc);
+    
+    if(sourceParsePtr.DrivePresent() || !sourceParsePtr.FullName().Length())
+        return KErrArgument;
+    
+    switch(iBody->iFunction)
+        {
+
+        case EFsFileWrite:          //EParseSrc | EFileShare
+        case EFsFileSetSize:        //EParseSrc | EFileShare
+        case EFsFileSetAtt:         //EParseDst | EParseSrc, - should not use these; has share.
+        case EFsFileSet:            //EParseSrc | EFileShare
+        case EFsFileSetModified:    //EParseSrc | EFileShare - new
+        case EFsFileWriteDirty:     //EFileShare
+        case EFsFileCreate:         //EParseSrc
+        case EFsFileTemp:           //EParseSrc - new
+        case EFsFileRename:         //EParseDst | EParseSrc,
+        case EFsFileReplace:        //EParseSrc
+            {
+            //Should look like this:  \[path\]filename
+            if(!sourceParsePtr.Name().Length())
+                {
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsDelete:             //EParseSrc
+        case EFsSetEntry:           //EParseSrc,
+        case EFsRename:             //EParseDst | EParseSrc,
+        case EFsReplace:            //EParseDst | EParseSrc,
+            {
+            if(!sourceParsePtr.PathPresent() && !sourceParsePtr.NamePresent())
+                {
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsRmDir:              //EParseSrc
+        case EFsMkDir:              //EParseSrc
+            {
+            if(!sourceParsePtr.PathPresent())
+                {
+                return KErrArgument;
+                }
+            break;
+            }
+      /*case EFsFormatNext:         //EParseSrc
+        case EFsDismountFileSystem: //0
+        case EFsMountFileSystem:    //0
+        case EFsSetVolume:          //0
+        case EFsSetDriveName:       //ESync
+        case EFsRawDiskWrite:       //EParseSrc
+        case EFsMountFileSystemScan: */
+        default:
+            {
+            __ASSERT_DEBUG(EFalse,User::Panic(_L("CFsNotificationInfo::SetSourceName Invalid Operation"),KErrArgument));
+            return KErrNotSupported;
+            }
+        }
+    memcpy(&iBody->iSrc,&sourceParsePtr,sizeof(TParsePtrC));
+    return KErrNone;
+    }
+
+EXPORT_C TInt CFsNotificationInfo::SetNewName(const TDesC& aDest)
+    {
+    //Add the aSrc to a TParsePtr for some validation without copying the filename
+    TParsePtrC destParsePtr(aDest);
+    
+    if(destParsePtr.DrivePresent() || !destParsePtr.FullName().Length())
+        return KErrArgument;
+    
+    switch(iBody->iFunction)
+        {
+        case EFsFileRename:         //EParseDst | EParseSrc,
+        case EFsRename:             //EParseDst | EParseSrc,
+        case EFsReplace:            //EParseDst | EParseSrc,
+            {
+            if(!destParsePtr.PathPresent() && !destParsePtr.NamePresent())
+                {
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsSetDriveName:
+        case EFsSetVolume:
+            {
+            if(!destParsePtr.NamePresent())
+                {
+                return KErrArgument;
+                }
+            break;
+            }            
+        default:
+            {
+            __ASSERT_DEBUG(ETrue,User::Panic(_L("CFsNotificationInfo::SetNewName Invalid Operation"),KErrArgument));
+            }
+        }
+    
+    memcpy(&iBody->iDest,&destParsePtr,sizeof(TParsePtrC));
+    return KErrNone;
+    }
+
+EXPORT_C TInt CFsNotificationInfo::SetFilesize(TInt64 aFilesize)
+    {
+    if(aFilesize<0)
+        return KErrArgument;
+    
+    iBody->iData = aFilesize;
+    return KErrNone;
+    }
+EXPORT_C TInt CFsNotificationInfo::SetAttributes(TUint aSet,TUint aCleared)
+    {
+    iBody->iData = MAKE_TUINT64(aSet,aCleared);
+    return KErrNone;
+    }
+
+EXPORT_C TInt CFsNotificationInfo::SetUid(const TUid& aUid)
+    {
+    iBody->iUid = aUid;
+    return KErrNone;
+    }
+
+
+TInt CFsNotificationInfo::SetDriveNumber(TInt aDriveNumber) 
+    {
+    if(aDriveNumber >= EDriveA && aDriveNumber <= EDriveZ)
+        {
+        iBody->iDriveNumber = aDriveNumber;
+        return KErrNone;
+        }
+    return KErrArgument;    
+    }
+void CFsNotificationInfo::SetRequest(CFsRequest* aRequest)
+    {
+    iBody->iRequest = aRequest;
+    }
+TInt CFsNotificationInfo::Function() 
+    { return iBody->iFunction; }
+TInt CFsNotificationInfo::DriveNumber() 
+    { return iBody->iDriveNumber; }
+TParsePtrC& CFsNotificationInfo::Source() 
+    {
+    switch(iBody->iFunction)
+        {
+        case EFsFormatNext:         //EParseSrc
+        case EFsDismountFileSystem: //0
+        case EFsMountFileSystem:    //0
+        case EFsSetVolume:          //0
+        case EFsSetDriveName:       //ESync
+        case EFsRawDiskWrite:       //EParseSrc
+        case EFsMountFileSystemScan:
+            {
+            _LIT(KFormatDrive,"?:");
+            iBody->iSrcBuf = KFormatDrive;
+            iBody->iSrcBuf[0] = TText(DriveNumber() + 'A');
+            TParsePtrC parse(iBody->iSrcBuf);
+            memcpy(&iBody->iSrc,&parse,sizeof(TParsePtrC));
+            }
+        }
+    return iBody->iSrc;
+    }
+TParsePtrC& CFsNotificationInfo::NewName() 
+    { return iBody->iDest; }
+CFsRequest* CFsNotificationInfo::Request() 
+    { return iBody->iRequest; }
+TInt64* CFsNotificationInfo::Data() 
+    { return &iBody->iData; }
+TUid& CFsNotificationInfo::Uid()
+    { return iBody->iUid; }
+TNotificationType& CFsNotificationInfo::NotificationType()
+    { return iBody->iNotificationType; }
+TBool CFsNotificationInfo::DestDriveIsSet()
+    { return iBody->iDestDriveStored; }
+TInt CFsNotificationInfo::SourceSize()
+    {
+    TInt size = Source().FullName().Size();
+    if(NotificationType()!=TFsNotification::EMediaChange    &&
+       NotificationType()!=TFsNotification::EDriveName      && 
+       NotificationType()!=TFsNotification::EVolumeName)
+        {
+        size += sizeof(TText)*2;
+        }
+    return size;    
+    }
+TInt CFsNotificationInfo::NewNameSize()
+    {
+    TInt size = NewName().FullName().Size();
+    if(!DestDriveIsSet())
+        size += sizeof(TText)*2;
+    return size;  
+    }
+
+//Get the path of the file, folder or drive name based on the TFsMessage function
+void CFsNotificationInfo::PathName(CFsClientMessageRequest& aRequest, TParsePtrC& aPath)
+    {
+    __PRINT(_L("CFsNotificationInfo::PathName"));
+    //Get the notification type
+    TInt function = aRequest.Operation()->Function();
+    
+    //Get the filename(s)
+    switch(function)
+        {
+        case EFsFileWrite:          //EParseSrc | EFileShare
+        case EFsFileSetSize:        //EParseSrc | EFileShare
+        case EFsFileSetAtt:         //EParseDst | EParseSrc, - should not use these; has share.
+        case EFsFileSet:            //EParseSrc | EFileShare
+        case EFsFileSetModified:    //EParseSrc | EFileShare - new
+        case EFsFileWriteDirty:     //EFileShare
+            {
+            CFileShare* share = NULL;
+            CFileCB* file = NULL;
+            GetFileFromScratch(&aRequest,share,file);
+            TParsePtrC ptrC(file->iFileName->Des());
+            memcpy(&aPath,&ptrC,sizeof(TParsePtrC));
+            break;
+            }
+        case EFsFileCreate:         //EParseSrc
+        case EFsFileTemp:           //EParseSrc - new
+        case EFsDelete:             //EParseSrc
+        case EFsSetEntry:           //EParseSrc,
+        case EFsFileRename:         //EParseDst | EParseSrc,
+        case EFsRename:             //EParseDst | EParseSrc,
+        case EFsReplace:            //EParseDst | EParseSrc,
+        case EFsFileReplace:        //EParseSrc
+            {
+            TParsePtrC parsePtrC(aRequest.Src().FullName().Mid(2)); //Don't want drive letter
+            memcpy(&aPath,&parsePtrC,sizeof(TParsePtrC));
+            break;
+            }
+        case EFsRmDir:              //EParseSrc
+        case EFsMkDir:              //EParseSrc
+            {
+            TParsePtrC parsePtrC(aRequest.Src().Path());
+            memcpy(&aPath,&parsePtrC,sizeof(TParsePtrC));
+            break;
+            
+            //aPath.Set(aRequest.Src().DriveAndPath(),NULL,NULL);
+            //break;
+            }
+        case EFsFormatNext:         //EParseSrc
+        case EFsDismountFileSystem: //0
+        case EFsMountFileSystem:    //0
+        case EFsSetVolume:          //0
+        case EFsSetDriveName:       //ESync
+        case EFsRawDiskWrite:       //EParseSrc
+        case EFsLockDrive:
+        case EFsUnlockDrive:
+        case EFsReserveDriveSpace:
+        case EFsMountFileSystemScan:
+            {
+            break;
+            }
+        default:
+            ASSERT(0);
+            break;
+        }
+    }
+
+//Get the new path of the file, folder or drive name based on the TFsMessage function
+void CFsNotificationInfo::NewPathName(CFsClientMessageRequest& aRequest, TParsePtrC& aNewPath)
+    {
+    __PRINT(_L("CFsNotificationInfo::NewPathName"));
+    //Get the notification type
+    TInt function = aRequest.Operation()->Function();
+
+    //Get the filename(s)
+    switch(function)
+        {
+        case EFsFileRename:         //EParseDst | EParseSrc,
+        case EFsRename:             //EParseDst | EParseSrc,
+        case EFsReplace:            //EParseDst | EParseSrc,
+            {
+            //We must provide the drive letter too as in the case
+            //of the file being monitored being renamed to a 
+            //different drive.
+            //In that case we need to provide the new drive letter to the client.
+            TParsePtrC ptrC(aRequest.Dest().FullName());
+            memcpy(&aNewPath,&ptrC,sizeof(TParsePtrC));
+            break;
+            }
+        case EFsSetVolume:          //EParseDst
+        case EFsSetDriveName:       //ESync | EParseDst
+            {
+            TParsePtrC ptrC(aRequest.Dest().FullName());
+            memcpy(&aNewPath,&ptrC,sizeof(TParsePtrC));
+            break;
+            }
+        default:
+            {
+            ASSERT(0);
+            }
+        }
+    }
+
+//Get the size of the notification based on its type
+TInt CFsNotificationInfo::NotificationSize(CFsNotificationInfo& aRequest)
+    {
+    __PRINT(_L("CFsNotificationInfo::NotificationSize"));
+    
+    /*
+     * If there are no new names, the order of the data in the buffer is:
+     * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
+     * Word2   : NotificationType (Lower 2 bytes)
+     * Word3   : UID
+     * Word(s) : Path (TText8) , [Any sub-class members]
+     * 
+     * Else for notification types ERename, EVolumeName and EDriveName the order is:
+     * Word1   : NotificationSize (2 bytes) , PathSize (2 bytes)
+     * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
+     * Word3   : UID
+     * Word(s) : Path (TText8) , NewName (TText8)
+     * 
+     * EOverflow size: KNotificationHeaderSize
+     */ 
+    
+    //Size of the filename +(with '<drive>:')
+    TInt size = KNotificationHeaderSize + Align4(aRequest.SourceSize());
+    
+    switch(aRequest.NotificationType())
+        {
+        //NewName
+        case TFsNotification::ERename:
+        case TFsNotification::EVolumeName:
+        case TFsNotification::EDriveName:
+            {
+            if(!aRequest.NewName().FullName().Length())
+                __ASSERT_ALWAYS(false,User::Panic(_L("CFsNotificationInfo::NotificationSize"),KErrArgument));
+            
+            size += Align4(aRequest.NewNameSize());
+            break;
+            }
+        case TFsNotification::EFileChange:
+            {
+            size += sizeof(TInt64);
+            break;
+            }
+        case TFsNotification::EAttribute:
+            {
+            size += sizeof(TUint64);
+            break;
+            }
+        case TFsNotification::ECreate: 
+        case TFsNotification::EDelete:
+        case TFsNotification::EMediaChange:
+            {
+            break;
+            }
+        default:
+            {
+            ASSERT(0);
+            break;
+            }
+        }
+    return (TUint16) size;
+    }
+
+
+TNotificationType CFsNotificationInfo::NotificationType(TInt& aIndex)
+    {
+    __PRINT(_L("CFsNotificationInfo::NotificationType(TInt)"));
+    __ASSERT_DEBUG(aIndex < KNumRegisterableFilters, Fault(ENotificationFault));
+    
+    switch(aIndex) //No break statements here on purpose
+        {
+        case 7 : return TFsNotification::EMediaChange;
+        case 6 : return TFsNotification::EDriveName;
+        case 5 : return TFsNotification::EVolumeName;
+        case 4 : return TFsNotification::EDelete;
+        case 3 : return TFsNotification::EAttribute;
+        case 2 : return TFsNotification::ECreate;
+        case 1 : return TFsNotification::ERename;
+        case 0 : return TFsNotification::EFileChange;
+        default: ASSERT(0); return (TFsNotification::TFsNotificationType) 0;
+        }
+    }
+
+//Get the array index of the notification based on its type
+TInt CFsNotificationInfo::TypeToIndex(TNotificationType aType)
+    {
+    __PRINT(_L("CFsNotificationInfo::ArrayIndex"));
+
+    TInt index = 0; 
+    switch(aType) //No break statements here on purpose
+        {
+        case TFsNotification::EMediaChange: index++;
+        case TFsNotification::EDriveName:   index++;
+        case TFsNotification::EVolumeName:  index++;
+        case TFsNotification::EDelete:      index++;
+        case TFsNotification::EAttribute:   index++;
+        case TFsNotification::ECreate:      index++;
+        case TFsNotification::ERename:      index++;
+        case TFsNotification::EFileChange:  // skip;
+        default: break;
+        }
+    __ASSERT_DEBUG(index < KNumRegisterableFilters, Fault(ENotificationFault));
+    return index;
+    }
+
+TInt CFsNotificationInfo::DriveNumber(const TPtrC& aPath)
+    {
+    if(aPath.Length() >= 1)
+        {
+        TInt drive;
+        TInt r = RFs::CharToDrive(aPath[0],drive);
+        if(r!=KErrNone)
+            return KErrNotFound;
+        return drive;
+        }
+    return KErrNotFound;
+    }
+
+//Get the attributes set and cleared
+void CFsNotificationInfo::Attributes(CFsMessageRequest& aRequest, TUint& aSet, TUint& aClear)
+    {
+    __PRINT(_L("CFsNotificationInfo::Attributes"));
+
+    TInt function = aRequest.Operation()->Function();
+    const RMessage2& msg = aRequest.Message();
+
+    //Client notification
+    switch(function)
+        {
+        case EFsFileSet:
+            {
+            aSet = msg.Int1();
+            aClear = msg.Int2();
+            break;
+            }
+        case EFsFileSetAtt:
+            {
+            aSet = msg.Int0();
+            aClear = msg.Int1();
+            break;
+            }
+        case EFsSetEntry:
+            {
+            aSet = msg.Int2();
+            aClear = msg.Int3();
+            break;
+            }
+        default:
+            {
+            ASSERT(0);
+            break;
+            }
+        }
+    }
+
+TInt64 CFsNotificationInfo::FileSize(CFsMessageRequest& aRequest)
+    {
+    CFileShare* share = NULL;
+    CFileCB* file = NULL;
+    GetFileFromScratch(&aRequest, share, file);
+    TInt64 size = file->CachedSize64();
+    return size;
+    }
+
+
+void CFsNotificationInfo::SetData(CFsMessageRequest* aRequest, CFsNotificationInfo* aNotificationInfo)
+    {
+    TInt function = aRequest->Operation()->Function();
+    
+    switch(function)
+        {
+        case EFsFileWrite:
+        case EFsFileWriteDirty:
+        case EFsFileSetSize:
+            {
+            aNotificationInfo->SetFilesize(FileSize(*aRequest));
+            break;
+            }
+        case EFsSetEntry:
+        case EFsFileSetAtt:
+        case EFsFileSet:
+            {
+            TUint set = 0;
+            TUint clear = 0;
+            Attributes(*aRequest,set,clear);
+            *(aNotificationInfo->Data())= MAKE_TUINT64(set,clear);
+            break;
+            }
+        default:
+            {
+            return;
+            }
+        }
+    }
+
+TInt CFsNotificationInfo::ValidateNotification(CFsNotificationInfo& aNotificationInfo)
+    {
+    //Validate UID
+    if(aNotificationInfo.Uid() == TUid::Null())
+        {
+        __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Uid not set"),KErrArgument));
+        return KErrArgument;
+        }
+   
+    switch(aNotificationInfo.Function())
+        {
+        case EFsFileWrite:
+        case EFsFileWriteDirty:
+        case EFsFileSetSize:
+            {
+            if(*aNotificationInfo.Data() == -1)
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - File size not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(!aNotificationInfo.Source().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(aNotificationInfo.NewName().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsRename:
+        case EFsFileRename:
+        case EFsReplace:
+        case EFsSetVolume:
+        case EFsSetDriveName:
+            {
+            if(!aNotificationInfo.Source().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(!aNotificationInfo.NewName().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(*aNotificationInfo.Data() != -1)
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsMkDir:
+        case EFsFileCreate:
+        case EFsFileReplace:
+        case EFsDelete:
+        case EFsRmDir:
+            {
+            if(!aNotificationInfo.Source().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(aNotificationInfo.NewName().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            if(*aNotificationInfo.Data() != -1)
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            break;
+            }
+        case EFsFileSetAtt:
+        case EFsFileSet:
+        case EFsSetEntry:
+            {
+            if(!aNotificationInfo.Source().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(*aNotificationInfo.Data() == -1)
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Attributes not set"),KErrArgument));
+                return KErrArgument;
+                }
+            if(aNotificationInfo.NewName().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument));
+                return KErrArgument;
+                }               
+            break;
+            }
+        case EFsDismountFileSystem:
+        case EFsMountFileSystem:
+        case EFsFormatNext:
+        case EFsRawDiskWrite:
+        case EFsMountFileSystemScan:
+            {
+            if(aNotificationInfo.NewName().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument));
+                return KErrArgument;
+                }               
+            if(aNotificationInfo.Source().FullName().Length())
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            if(*aNotificationInfo.Data() != -1)
+                {
+                __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument));
+                return KErrArgument;
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return KErrNone;
+    }
+
+TUint CFsNotificationInfo::NotifyType(TInt aFunction)
+//
+//  Convert aFunction that caused the notification to a 
+//  value corresponding to the correct TNotifyType enum  
+//
+    {
+    switch (aFunction)
+        {
+        case EFsFileCreate:
+        case EFsFileReplace:
+        case EFsDelete:
+        case EFsReplace:
+        case EFsFileRename:
+            return(ENotifyFile|ENotifyEntry);   
+        case EFsMkDir:
+        case EFsRmDir:
+            return(ENotifyDir|ENotifyEntry);    
+        case EFsRename:                 
+            return(ENotifyDir|ENotifyFile|ENotifyEntry);                    
+        case EFsSetVolume:                  
+            return(ENotifyDisk|ENotifyEntry);   
+        case EFsFileSet:
+        case EFsFileSetAtt:
+        case EFsFileSetModified:
+        case EFsFileSetSize:
+        case EFsSetEntry:
+            return(ENotifyAttributes);  
+        case EFsFileWrite:
+        case EFsFileWriteDirty:
+            return(ENotifyWrite);   
+        case EFsRawDiskWrite:
+        case EFsLockDrive:
+        case EFsUnlockDrive:
+            return(ENotifyDisk);    
+        case EFsFileTemp:       
+        case EFsSetDriveName:
+            return(ENotifyAll); 
+        default:
+            return(0);
+        }
+    }
+
 void CNotifyInfo::Initialise(TInfoType aType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession)
 //
 //
@@ -67,16 +919,16 @@
 	CNotifyInfo::Initialise(EStdChange,aStatus,aMessage,aSession);
 	}
 
-TUint CStdChangeInfo::RequestNotifyType(CFsRequest* aRequest)
+TUint CStdChangeInfo::RequestNotifyType(CFsNotificationInfo* aRequest)
 //
 // return notification type for the request
 //
 	{
-	TUint notifyType=aRequest->Operation()->NotifyType();
-	if(aRequest->Operation()->Function()==EFsRename)
+    TUint notifyType=CFsNotificationInfo::NotifyType(aRequest->Function());
+    if(aRequest->Function()==EFsRename)
 		{
 		__ASSERT_DEBUG(notifyType==(ENotifyDir|ENotifyFile|ENotifyEntry),Fault(EStdChangeRequestType));
-		if(aRequest->Src().NamePresent())
+        if(aRequest->Source().NamePresent())
 			notifyType=ENotifyFile|ENotifyEntry;
 		else
 			notifyType=ENotifyDir|ENotifyEntry;
@@ -84,12 +936,13 @@
 	return(notifyType);						
 	}
 
-TBool CStdChangeInfo::IsMatching(CFsRequest* aRequest)
+
+TBool CStdChangeInfo::IsMatching(CFsNotificationInfo* aNotificationInfo)
 //
 // return ETrue if operation type of request matches that of change notification
 //
-	{
-	if((iChangeType&ENotifyAll) || (iChangeType&aRequest->Operation()->NotifyType()))
+    {
+    if((iChangeType&ENotifyAll) || (iChangeType&CFsNotificationInfo::NotifyType(aNotificationInfo->Function())))
 		return(ETrue);
 	else
 		return(EFalse);
@@ -107,17 +960,17 @@
 	}
 
 
-TBool CExtChangeInfo::IsMatching(CFsRequest* aRequest)
+TBool CExtChangeInfo::IsMatching(CFsNotificationInfo* aRequest)
 //
 // return ETrue if operation notify type of request matches that of change notification
 // and paths match
 //
-	{
-	TInt function=aRequest->Operation()->Function();
+    {
+    TInt function=aRequest->Function();
 	//	if a rename occurred inform any requests if their path has been changed regardless of the notification type
 	if(function==EFsRename)				
 		{		
-		TBuf<KMaxFileName> renamePath=aRequest->Src().FullName().Mid(2);		
+        TBuf<KMaxFileName> renamePath=aRequest->Source().FullName();        
 		renamePath+=_L("*");
 		if (iName.MatchF(renamePath)!=KErrNotFound)	
 			return(ETrue);
@@ -127,18 +980,14 @@
 	//Special case where the dir the notifier is setup on has just been created
 	if(function==EFsMkDir)	
 		{		
-		TInt notDrive;
-		RFs::CharToDrive(aRequest->Src().Drive()[0],notDrive);	//can not fail as the drive letter has been parsed already
-		if(aRequest->Src().Path().MatchF(iName) == 0 && aRequest->DriveNumber() == notDrive)
+        if(aRequest->Source().Path().MatchF(iName) == 0)
 			return ETrue;
 		}
 	
-	//Special case where  the File the notifier is setup on has just been created by temp as the name is not known unti it has been created
+	//Special case where  the File the notifier is setup on has just been created by temp as the name is not known until it has been created
 	if(function==EFsRename||function==EFsFileOpen||function==EFsFileCreate||function==EFsFileReplace)
 		{
-		TInt notDrive;
-		RFs::CharToDrive(aRequest->Src().Drive()[0],notDrive);	//can not fail as the drive letter has been parsed already
-		if(aRequest->Src().FullName().Mid(2).MatchF(iName) == 0 && aRequest->DriveNumber() == notDrive)
+        if(aRequest->Source().FullName().MatchF(iName) == 0)
 			return ETrue;
 		}
 	
@@ -162,13 +1011,10 @@
 			TBuf<KMaxFileName> root=iName;
 			root+=_L("*");	
 			
-			// NB share may be NULL if file server has initiated a flush of the file cache
-			CFileShare* share;
-			CFileCB* fileCache;
-			GetFileFromScratch(aRequest, share, fileCache);
-			if (share && share->File().FileName().MatchF(root) != KErrNotFound)
-				return(ETrue);
-
+                if (aRequest->Source().FullName().MatchF(root) != KErrNotFound)
+                    {
+                    return(ETrue);
+                    }
 			}
 			break;
 			case EFsSetDriveName:
@@ -186,18 +1032,26 @@
 				TBuf<KMaxFileName> root = iName;
 				root+=_L("*");	
 				
-				if(aRequest->Src().FullName().Mid(2).MatchF(root)!=KErrNotFound)
+                if(aRequest->Source().FullName().MatchF(root)!=KErrNotFound)
 					return(ETrue);	
 				else if(function==EFsRename||function==EFsReplace||function==EFsFileRename)
 					{
 					// - rename/replace causes the file/path to disappear
-					if(aRequest->Dest().FullName().Mid(2).MatchF(root)!=KErrNotFound)
+				    TPtrC newName;
+				    if(aRequest->DestDriveIsSet())
+				        newName.Set(aRequest->NewName().FullName().Mid(2));
+				    else
+				        newName.Set(aRequest->NewName().FullName());
+                    if(newName.MatchF(root)!=KErrNotFound)
 						{
 						return(ETrue);
 						}
 
 					// - rename/replace causes the file/path to arrive
-					root=aRequest->Dest().FullName().Mid(2);
+                    if(aRequest->DestDriveIsSet())
+                        root=aRequest->NewName().FullName().Mid(2);
+                    else
+                        root=aRequest->NewName().FullName();
 					root+=_L("*");
 
 					if (iName.MatchF(root)!=KErrNotFound)
@@ -416,7 +1270,7 @@
 	iQLock.Signal();
 	}
 
-void TChangeQue::CheckChange(CFsRequest* aRequest)
+void TChangeQue::CheckChange(CFsNotificationInfo& aRequest)
 //
 // complete any notification in que that matches aRequest
 //
@@ -429,9 +1283,9 @@
 		__ASSERT_DEBUG(info->Type()==CNotifyInfo::EStdChange||info->Type()==CNotifyInfo::EExtChange,Fault(EChangeQueType));
 		TBool isMatching;
 		if(info->Type()==CNotifyInfo::EStdChange)
-			isMatching=((CStdChangeInfo*)info)->IsMatching(aRequest);
+			isMatching=((CStdChangeInfo*)info)->IsMatching(&aRequest);
 		else
-			isMatching=((CExtChangeInfo*)info)->IsMatching(aRequest);
+			isMatching=((CExtChangeInfo*)info)->IsMatching(&aRequest);
 		if(isMatching)
 			{
 			__PRINT1(_L("TChangeQue::CheckChange()-Matching info=0x%x"),info);
@@ -842,17 +1696,18 @@
 	return(KErrNone);
 	}
 
-void FsNotify::HandleChange(CFsRequest* aRequest,TInt aDrive)
+
+void FsNotify::HandleChange(CFsNotificationInfo& aNotificationInfo)
 //
 // Check whether any change notifications need to be completed due to aRequest on aDrive
 //
-	{
-	__PRINT2(_L("FsNotify::HandleChange() aRequest=0x%x, aDrive=%d"),aRequest,aDrive);
-	if(!aRequest->IsChangeNotify())
-		return;
-	iChangeQues[ChangeIndex(aDrive)].CheckChange(aRequest);
-	iChangeQues[ChangeIndex(KDriveInvalid)].CheckChange(aRequest);
-	}
+    {
+    __PRINT1(_L("FsNotify::HandleChange(TFsNotificationInfo) DriveNumber=%d"),aNotificationInfo.DriveNumber());
+    if(aNotificationInfo.Request() && !aNotificationInfo.Request()->IsChangeNotify())
+        return;
+    iChangeQues[ChangeIndex(aNotificationInfo.DriveNumber())].CheckChange(aNotificationInfo);
+    iChangeQues[ChangeIndex(KDriveInvalid)].CheckChange(aNotificationInfo);
+    }
 	
 
 void FsNotify::HandleDiskSpace(CFsRequest* aRequest,TInt aDrive)
--- a/userlibandfileserver/fileserver/sfile/sf_ops.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_ops.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -165,48 +165,6 @@
 		}
 	}
 
-TUint TOperation::NotifyType() const
-//
-//	Convert operation that caused the notification to a 
-//	value corresponding to the correct TNotifyType enum  
-//
-	{
-	switch (iFunction)
-		{
-	case EFsFileCreate:
-	case EFsFileReplace:
-	case EFsDelete:
-	case EFsReplace:
-	case EFsFileRename:
-		return(ENotifyFile|ENotifyEntry);	
-	case EFsMkDir:
-	case EFsRmDir:
-		return(ENotifyDir|ENotifyEntry);	
-	case EFsRename:					
-		return(ENotifyDir|ENotifyFile|ENotifyEntry);					
-	case EFsSetVolume:					
-		return(ENotifyDisk|ENotifyEntry);	
-	case EFsFileSet:
-	case EFsFileSetAtt:
-	case EFsFileSetModified:
-	case EFsFileSetSize:
-	case EFsSetEntry:
-		return(ENotifyAttributes);	
-	case EFsFileWrite:
-	case EFsFileWriteDirty:
-		return(ENotifyWrite);	
-	case EFsRawDiskWrite:
-	case EFsLockDrive:
-	case EFsUnlockDrive:
-		return(ENotifyDisk);	
-	case EFsFileTemp:		
-	case EFsSetDriveName:
-		return(ENotifyAll);	
-	default:
-		return(0);
-		}
-	}
-
 TBool TOperation::IsCompleted() const
 //
 //
--- a/userlibandfileserver/fileserver/sfile/sf_ops.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_ops.h	Mon Nov 01 20:11:36 2010 +0000
@@ -34,7 +34,7 @@
 		{	EFsDriveList,				ESync,								&TFsDriveList::Initialise,					NULL,								&TFsDriveList::DoRequestL					},
 		{	EFsDrive,					ESync,								&TFsDrive::Initialise,						NULL,								&TFsDrive::DoRequestL						},
 		{	EFsVolume,					0,									&TFsVolume::Initialise,						NULL,								&TFsVolume::DoRequestL						, MSG0(EVolumeInfo)},
-		{	EFsSetVolume,				0,									&TFsSetVolume::Initialise,					NULL,								&TFsSetVolume::DoRequestL					},
+		{	EFsSetVolume,				EParseDst, 									&TFsSetVolume::Initialise,					NULL,								&TFsSetVolume::DoRequestL					},
 		{	EFsSubst,					ESync,								&TFsSubst::Initialise,						NULL,								&TFsSubst::DoRequestL						},
 		{	EFsSetSubst,				ESync | EParseSrc,					&TFsSetSubst::Initialise,					NULL,								&TFsSetSubst::DoRequestL					},
 		{	EFsRealName,				ESync | EParseSrc,					&TFsRealName::Initialise,					NULL,								&TFsRealName::DoRequestL					},
@@ -51,7 +51,7 @@
 		{	EFsEntry,					EParseSrc,							&TFsEntry::Initialise,						NULL,								&TFsEntry::DoRequestL						, MSG0(EName) | MSG1(EEntry)},
 		{	EFsSetEntry,				EParseSrc,							&TFsSetEntry::Initialise,					NULL,								&TFsSetEntry::DoRequestL					, MSG0(EName) | MSG1(ETime) | MSG2(ESetAtt) | MSG3(EClearAtt)},
 		{	EFsGetDriveName,			ESync,								&TFsGetDriveName::Initialise,				NULL,								&TFsGetDriveName::DoRequestL				},
-		{	EFsSetDriveName,			ESync,								&TFsSetDriveName::Initialise,				NULL,								&TFsSetDriveName::DoRequestL				},
+		{	EFsSetDriveName,			ESync | EParseDst,								&TFsSetDriveName::Initialise,				NULL,								&TFsSetDriveName::DoRequestL				},
 		{	EFsFormatSubClose,			ESync,								&TFsSubClose::Initialise,					NULL,								&TFsSubClose::DoRequestL					},
 		{	EFsDirSubClose,				ESync,								&TFsSubClose::Initialise,					NULL,								&TFsSubClose::DoRequestL					},
 		{	EFsFileSubClose,			EFileShare | EFsDspObj,				&TFsSubClose::Initialise,					NULL,								&TFsSubClose::DoRequestL					},
--- a/userlibandfileserver/fileserver/sfile/sf_pool.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_pool.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -23,13 +23,13 @@
 //=====CFsPool=============================
 
 template <class T>
-CFsPool<T>* CFsPool<T>::New(TInt aPoolSize)
+CFsPool<T>* CFsPool<T>::New(TInt aPoolSize, T*(*aNewFunction)())
 	{
 	CFsPool<T>* pool = new CFsPool<T>();
 	if(!pool)
 		return NULL;
 	
-	TInt r = pool->Construct(aPoolSize);
+	TInt r = pool->Construct(aPoolSize,aNewFunction);
 	if(r!=KErrNone)
 		{
 		delete pool;
@@ -46,20 +46,20 @@
 	}
 
 template <class T>
-TInt CFsPool<T>::Construct(TInt aPoolSize)
+TInt CFsPool<T>::Construct(TInt aPoolSize,T*(*aNewFunction)())
 	{
-	TInt r = iPoolLock.CreateLocal(KNotificationPoolSize);
+	TInt r = iPoolLock.CreateLocal(aPoolSize);
 	if(r != KErrNone)
 			return r;
 	
-	r = iFreeList.Reserve(KNotificationPoolSize);
+	r = iFreeList.Reserve(aPoolSize);
 	if(r != KErrNone)
 		return r;
 	
 	TInt i = 0;
 	while(i < aPoolSize)
 		{
-		T* t = T::New();
+		T* t = aNewFunction();
 		if(!t)
 			{
 			return KErrNoMemory;
@@ -120,9 +120,9 @@
 	iPoolLock.Signal();
 	}
 
+//These are needed here because the compiler needs to know which types will be 
+//instantiating the template (because it's in a separate file)
 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION	
-//This is needed here because the compiler needs to know which types will be 
-//instantiating the template (because it's in a separate file)
 template class CFsPool<CFsNotificationBlock>;
 #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION	
-
+template class CFsPool<CFsNotificationInfo>;
--- a/userlibandfileserver/fileserver/sfile/sf_pool.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_pool.h	Mon Nov 01 20:11:36 2010 +0000
@@ -27,13 +27,14 @@
 class CFsPool
 	{
 public:
-	static CFsPool<T>* New(TInt aPoolSize);
+   
+	static CFsPool<T>* New(TInt aPoolSize,T*(*aNewFunction)());
 	~CFsPool();
 	
 	/*
 	 * Allocate returns a pointer of class T.
 	 * The pointer returned is removed from the pool.
-	 * When the pool is empty this function will wait.
+	 * WAITs when the pool is empty.
 	 */
 	T* Allocate();
 	
@@ -44,7 +45,7 @@
 	void Free(T* aBlock);
 private:
 	CFsPool();
-	TInt Construct(TInt aPoolSize);
+	TInt Construct(TInt aPoolSize,T*(*aNewFunction)());
 	
 	void Lock();
 	void Unlock();
--- a/userlibandfileserver/fileserver/sfile/sf_request.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_request.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -471,6 +471,19 @@
 	return(-1);
 	}
 
+/*
+ * Gets the UID of the client 
+ */
+TUid CFsRequest::Uid()
+    {
+    return TUid::Null();
+    }
+
+TUid CFsMessageRequest::Uid()
+    {
+    return iUID;
+    }
+
 
 TBool CFsMessageRequest::IsNotifierSpecific() const
 	{
@@ -910,11 +923,12 @@
 	}
 
 	
-void CFsMessageRequest::Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession)
+void CFsMessageRequest::Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession, TUid aUid)
 //
 //
 //
 	{
+    iUID = aUid;
 	iCurrentPlugin=NULL;
 	iMessage=aMessage;
 	iDrive=NULL;
@@ -924,11 +938,6 @@
 	EnablePostIntercept(ETrue);
 	}
 
-void CFsMessageRequest::Set(const TOperation& aOperation)
-	{
-	iOperation=const_cast<TOperation*>(&aOperation);
-	}
-
 void CFsMessageRequest::Process()
 //
 // Process the request - (passing to a plugin or a drive thread)
@@ -1326,10 +1335,46 @@
 
 	if(aError==KErrNone)
 		{
+	    //Get a notificationInfo block (freed again after notification complete)
+	    CFsNotificationInfo* notificationInfo = NULL; 
+	    
 		if(!(FsNotify::IsChangeQueEmpty(driveNumber)))
-			FsNotify::HandleChange(this,driveNumber);
-	
+		    {
+		    if(CFsNotificationInfo::NotifyType(Operation()->Function()))
+		        {
+		        notificationInfo = CFsNotificationInfo::Allocate(*this); 
+		        if(notificationInfo)
+		            FsNotify::HandleChange(*notificationInfo);
+		        }
+		    }
+
+		
 #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+		
+		if(!FsNotificationManager::IsInitialised())
+		    {
+	        if(notificationInfo)
+	            {
+	            CFsNotificationInfo::Free(notificationInfo);
+	            }
+		    return;
+		    }
+		
+        if(!notificationInfo)
+            {
+            TFsNotification::TFsNotificationType type;
+            CFsNotificationInfo::NotificationType(Operation()->Function(),type);
+            if(type)
+                {
+                notificationInfo = CFsNotificationInfo::Allocate(*this);
+                if(!notificationInfo)
+                    return;
+                }
+            else
+                {
+                return;
+                }
+            }
 		if 	(iOperation->iFunction == EFsFileWrite)
 			{
 			CFileShare* share = (CFileShare*) this->ScratchValue();
@@ -1339,29 +1384,19 @@
 			// Manage notifications for write with no cache or a write-through
 			if (!fileCache || !fileCache->IsDirty())
 				{
-				FsNotificationManager::HandleChange((CFsClientMessageRequest&)*this);
+				FsNotificationManager::HandleChange(*notificationInfo);
 				}
 			}
-		else if((iOperation->iFunction == EFsFileWriteDirty) && FsNotificationManager::IsInitialised())
-			{
-			CFileShare* share;
-			CFileCB* file;
-			GetFileFromScratch(this, share, file);
-
-			TFileName path;
-			path.Append(file->DriveNumber() + 'A');
-			path.Append(':');
-			path.Append(file->FileName().Des());
-			
-			// Manage notifications for write with caching enabled
-			FsNotificationManager::HandleChange((CFsClientMessageRequest*)this, path, TFsNotification::EFileChange);
-			}
 		else if(IsNotifierSupported())
 			{
-			FsNotificationManager::HandleChange((CFsClientMessageRequest&)*this);
+			FsNotificationManager::HandleChange(*notificationInfo);
 			}
 #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
-		}
+		
+		//Free the notificationInfo block
+		if(notificationInfo)
+		    CFsNotificationInfo::Free(notificationInfo);
+		}// Err==KErrNone
 	}
 
 void CFsMessageRequest::DoNotifyDiskSpace(TInt aError)
@@ -1782,7 +1817,7 @@
 void CFsMessageRequest::SetOperationFunc(TInt aFunction)
 	{
 	const TOperation& oP = OperationArray[aFunction];
-	Set(oP);
+	iOperation = const_cast<TOperation*>(&oP);
 	// modified because some requests were set to PostInitialise. They are set to DoRequest in Dispatch anyway, so this is possibly ok?
 	//__ASSERT_ALWAYS(iReqState == EReqStateDoRequest, Fault(EInvalidMsgState));
 	}
--- a/userlibandfileserver/fileserver/sfile/sf_ses.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_ses.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -375,13 +375,13 @@
 TInt TFsSetDriveName::DoRequestL(CFsRequest* aRequest)
 	{
 	TInt driveNum=aRequest->Drive()->DriveNumber();
-	TFileName driveName;
-	aRequest->ReadL(KMsgPtr1,driveName);
+
 
 //	Validate name - return KErrBadName if it contains illegal characters such as
 //	* ? / | > <
 
-	TNameChecker checker(driveName);
+    TPtrC driveName(aRequest->Dest().FullName());
+    TNameChecker checker(driveName);
 	TText badChar;
 	if (checker.IsIllegalName(badChar))
 		return(KErrBadName);
@@ -398,7 +398,7 @@
 		}
 	if (TheDriveNames[driveNum]==NULL || TheDriveNames[driveNum]->Des().MaxLength()<len)
 		return(KErrNoMemory);
-	*TheDriveNames[driveNum]=driveName;
+	*TheDriveNames[driveNum]=aRequest->Dest().FullName();
 	return(KErrNone);
 	}
 
@@ -407,6 +407,13 @@
 	TInt r=ValidateDrive(aRequest->Message().Int0(),aRequest);
 	if (r!=KErrNone)
 		return(r);
+	
+    TFileName driveName;
+    aRequest->ReadL(KMsgPtr1,driveName);
+	r = aRequest->Dest().Set(driveName,NULL,NULL);
+	if (r!=KErrNone)
+		return(r);
+	
 	if (!KCapFsSetDriveName.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Set Drive Name")))
 		return KErrPermissionDenied;
 	return KErrNone;
--- a/userlibandfileserver/fileserver/sfile/sf_std.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_std.h	Mon Nov 01 20:11:36 2010 +0000
@@ -34,7 +34,7 @@
 #include "sf_func.h"
 #include <f32plugin.h>
 #include "f32trace.h"
-
+#include "sf_pool.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);}}
@@ -455,6 +455,8 @@
 	EFsObjectOpen,
 	EContainerHeapCorruptionOnRemove,
 	ESessionOpenError,
+	ENotifyPoolCreation,
+	ENotificationInfoDeletion
 	};
 
 
@@ -1006,7 +1008,6 @@
 	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;
@@ -1209,8 +1210,10 @@
 	inline TInt FsFunction();
 	void Close();	// close the session & dispatch object this request is using
 
-public:
 	CFsRequest();
+	
+	virtual TUid Uid();
+	
 protected:
 	inline void Set(const TOperation& aOperation,CSessionFs* aSession);
 	inline void Set(CSessionFs* aSession);
@@ -1262,8 +1265,7 @@
 	{
 public:
 	void Set(const RMessage2& aMessage,CSessionFs* aSession);
-	void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession);
-	void Set(const TOperation& aOperation);
+	void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession, TUid aUid = TUid::Null());
 	inline void SetPostInitialise(TFsRequestFunc aCacheFunction);
 	//
 	inline void SetMessage(RMessage2& aMessage);
@@ -1305,8 +1307,7 @@
 	TBool IsPluginRequest();
 	static inline CFsMessageRequest* RequestFromMessage(const RMessagePtr2& aMessage);
 	
-   // UID of the process to touching the file. (To be used in notification framework).
-   // TUid iUID;
+	virtual TUid Uid();
 private:
 	void DoNotify(TInt aError);
 	void DoNotifyDiskSpace(TInt aError);
@@ -1327,6 +1328,7 @@
 private:
 	TMsgOperation* iCurrentOperation;
 	TInt iLastError;
+    TUid iUID;//UID of the process this message belongs to
 	};
 
 
@@ -1486,8 +1488,8 @@
 	{
 public:
 	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession);
-	TUint RequestNotifyType(CFsRequest* aRequest);
-	TBool IsMatching(CFsRequest* aRequest);
+	TUint RequestNotifyType(CFsNotificationInfo* aRequest);
+	TBool IsMatching(CFsNotificationInfo* aRequest);
 protected:
 	TNotifyType iChangeType;
 	};
@@ -1496,7 +1498,7 @@
 	{
 public:
 	void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession,const TDesC& aName);
-	TBool IsMatching(CFsRequest* aRequest);
+	TBool IsMatching(CFsNotificationInfo* aRequest);
 private:
 	TFileName iName;
 	};
@@ -1557,7 +1559,7 @@
 	TInt AddNotify(CNotifyInfo* aInfo);
 	TBool CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL);
 	void CancelAll(TInt aCompletionCode);
-	void CheckChange(CFsRequest* aRequest);
+	void CheckChange(CFsNotificationInfo& aNotificationInfo);
 	TBool IsEmpty();
 	};
 
@@ -1598,6 +1600,30 @@
 	TBool HandlePendingDismount(CSessionFs* aSession, TInt aDrive);
 	};
 
+class CFsNotificationInfo;
+
+class CFsNotificationInfoBody : public CBase
+    {
+public:
+    CFsNotificationInfoBody();
+private:    
+    TParsePtrC iSrc;
+    TBuf<2> iSrcBuf;
+    TParsePtrC iDest;
+    TBool iDestDriveStored;
+    TInt iDriveNumber;
+    TInt iFunction;
+    CFsRequest* iRequest; //Can be NULL
+    
+    //CFsNotify framework
+    TInt64 iData;
+    TNotificationType iNotificationType;
+    TUid iUid;
+    
+    friend class CFsNotificationInfo;
+    };
+
+
 class FsNotify
 	{
 public:
@@ -1607,7 +1633,7 @@
 	static TInt AddDebug(CNotifyInfo* aDebugInfo);
 	static TInt AddDismountNotify(CNotifyInfo* aDismountNotifyInfo);
 	static void DiskChange(TInt aDrive);
-	static void HandleChange(CFsRequest* aRequest,TInt aDrive);
+	static void HandleChange(CFsNotificationInfo& aNotificationInfo);
 	static void HandleDiskSpace(CFsRequest* aRequest,TInt aDrive);
 	static void HandleDiskSpace(TInt aDrive, TInt64& aFreeSpace);
 	static void HandleDebug(TUint aFunction);
@@ -1689,6 +1715,7 @@
 extern CFsObjectCon* RawDisks;
 extern CFsObjectCon* Extensions;
 extern CFsObjectCon* ProxyDrives;
+extern CFsPool<CFsNotificationInfo>* NotificationInfoPool;
 
 extern CKernEventNotifier* TheKernEventNotifier;
 
@@ -1767,18 +1794,18 @@
  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);
+ TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag);
+ TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag);
+ TInt PathCheck(const RMessage2& aMessage, 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);
+ TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag);
+ TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); 
+ TInt PathCheck(const RMessage2& 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 SIDCheck(const RMessage2& aMessage, const TDesC& aThePath);
  TBool ComparePaths(const TDesC& aPath1,const TDesC& aPath2);
  TUint32 CalcNameHash(const TDesC& aName);
 
--- a/userlibandfileserver/fileserver/sfile/sf_svr.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_svr.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -211,7 +211,7 @@
 			return(ret);
 		}
 	aRequest->SetScratchValue(monitorAllDrives);
-	ret = PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsNotifyChangeEx, __PLATSEC_DIAGNOSTIC_STRING("Extended Change Notifier"));		
+	ret = PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsNotifyChangeEx, __PLATSEC_DIAGNOSTIC_STRING("Extended Change Notifier"));		
 	return(ret);
 	}
 
@@ -594,13 +594,9 @@
     if(r != KErrNone)
         return r;
 
-	TFileName volumeName;
-	aRequest->ReadL(KMsgPtr0,volumeName);
-	if (volumeName.Length()>KMaxVolumeNameLength)	//	KMaxVolumeNameLength = 11 
-		return(KErrBadName);
-	
     //	Validate name - return KErrBadName if it contains illegal characters such as * ? / | > <
-	TNameChecker checker(volumeName);
+    TPtrC volumeName(aRequest->Dest().FullName());
+    TNameChecker checker(volumeName);
 	TText badChar;
 	if (checker.IsIllegalName(badChar))
 		return(KErrBadName);
@@ -617,6 +613,17 @@
 	TInt r=ValidateDriveDoSubst(aRequest->Message().Int1(),aRequest);
 	if (r!=KErrNone)
 		return(r);
+	TFileName volumeName;
+	TRAP(r,aRequest->ReadL(KMsgPtr0,volumeName));
+	if(r!=KErrNone)
+	    return r;
+    if (volumeName.Length()>KMaxVolumeNameLength)   //  KMaxVolumeNameLength = 11 
+        return(KErrBadName);
+    
+	r = aRequest->Dest().Set(volumeName,NULL,NULL);
+	if(r!=KErrNone)
+	    return r;
+	
 	if (!KCapFsSetVolume.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Set Volume")))
 		return KErrPermissionDenied;
 	return KErrNone;
@@ -671,7 +678,7 @@
 		pD->SetSubstedDrive(NULL);
 		return(KErrNone);
 		}
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysSetSubst,&KCapFsPriSetSubst,&KCapFsROSetSubst, __PLATSEC_DIAGNOSTIC_STRING("Set Subst"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysSetSubst,&KCapFsPriSetSubst,&KCapFsROSetSubst, __PLATSEC_DIAGNOSTIC_STRING("Set Subst"));
 	if (r!=KErrNone)
 		return(r);
 	if (pD->Att()&(KDriveAttLocal|KDriveAttRom|KDriveAttRedirected|KDriveAttSubsted))
@@ -710,7 +717,7 @@
 	TInt r=ParseSubstPtr0(aRequest,aRequest->Src());
 	if (r!=KErrNone)
 		return(r);
-	r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRealName,&KCapFsPriRealName, __PLATSEC_DIAGNOSTIC_STRING("Real Name"));
+	r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRealName,&KCapFsPriRealName, __PLATSEC_DIAGNOSTIC_STRING("Real Name"));
 	if (r!=KErrNone)
 		return(r);
 	TFileName substName;
@@ -869,7 +876,7 @@
 	TInt r=ParsePathPtr0(aRequest,parse);	
 	if (r!=KErrNone && r!=KErrInUse)
 		return(r);
-	r=PathCheck(aRequest,parse.FullName().Mid(2),&KCapFsSysSetSessionPath,&KCapFsPriSetSessionPath, __PLATSEC_DIAGNOSTIC_STRING("Set Session Path"));
+	r=PathCheck(aRequest->Message(),parse.FullName().Mid(2),&KCapFsSysSetSessionPath,&KCapFsPriSetSessionPath, __PLATSEC_DIAGNOSTIC_STRING("Set Session Path"));
 	if (r!=KErrNone)
 		return(r);
 	if (IsIllegalFullName(parse.FullName()))
--- a/userlibandfileserver/fileserver/sfile/sf_utl.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_utl.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -133,14 +133,14 @@
 	return ETrue;
 	}
 
-TBool SIDCheck(CFsRequest* aRequest, const TDesC& aThePath)
+TBool SIDCheck(const RMessage2& aMessage, const TDesC& aThePath)
 //
 //	Compare the Private/XXXXXXXX/ portion of a path be accessed to make sure it matches the process SID 
 //
 	{
 	if(aThePath.Length() >= KPrivateLengthCheck)
 		{
-		TSecureId appUID = aRequest->Message().SecureId();
+        TSecureId appUID = aMessage.SecureId();
 		TBuf<KSIDLength+1> dirName;
 		dirName.AppendNumFixedWidth(appUID.iId, EHex, 8);
 	
@@ -155,16 +155,16 @@
 	}
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag)
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag)
 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull /*aDiag*/)
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull /*aDiag*/)
 #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
 //
 //	Compare the parsed path with protected path names path must be parsed b4 using
 //
 	{
 
-	if(aRequest->Message().Handle() == KLocalMessageHandle)
+	if(aMessage.Handle() == KLocalMessageHandle)
 		return KErrNone;
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
@@ -185,11 +185,11 @@
 
 	if(ComparePrivate(aThePath))
 		{	
-		if(SIDCheck(aRequest, aThePath))
+		if(SIDCheck(aMessage, aThePath))
 			return KErrNone;	
 		else
 			{
-			if(aPriCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+			if(aPriCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 				return KErrNone;
 			else
 				return KErrPermissionDenied;
@@ -197,14 +197,14 @@
 		}
 	else if(CompareSystem(aThePath))
 		{
-		if(aSysCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+		if(aSysCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 			return KErrNone;
 		else
 			return KErrPermissionDenied;
 		}
 	else if(CompareResource(aThePath))
 		{
-		if(aROCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+		if(aROCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 			return KErrNone;
 		else
 			return KErrPermissionDenied;
@@ -214,16 +214,16 @@
  	}
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag) 
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag) 
 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull /*aDiag*/) 
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull /*aDiag*/) 
 #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
 //
 //	Compare the parsed path with protected path names path must be parsed b4 using
 //
 	{
 
-	if(aRequest->Message().Handle() == KLocalMessageHandle)
+	if(aMessage.Handle() == KLocalMessageHandle)
 		return KErrNone;
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
@@ -244,11 +244,11 @@
 
 	if(ComparePrivate(aThePath))
 		{	
-		if(SIDCheck(aRequest, aThePath))
+		if(SIDCheck(aMessage, aThePath))
 			return KErrNone;	
 		else
 			{
-			if(aPriCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+			if(aPriCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 				return KErrNone;
 			else
 				return KErrPermissionDenied;
@@ -256,7 +256,7 @@
 		}
 	else if(CompareSystem(aThePath))
 		{
-		if(aSysCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+		if(aSysCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 			return KErrNone;
 		else
 			return KErrPermissionDenied;
@@ -266,16 +266,16 @@
  	}
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed) 
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed) 
 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
-TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aCap, OnlyCreateWithNull /*aDiag*/, TBool aExactMatchAllowed) 
+TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aCap, OnlyCreateWithNull /*aDiag*/, TBool aExactMatchAllowed) 
 #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
 //
 //	Compare the parsed path with protected path names path must be parsed b4 using
 //
 	{
 
-	if(aRequest->Message().Handle() == KLocalMessageHandle)
+	if(aMessage.Handle() == KLocalMessageHandle)
 		return KErrNone;
 
 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
@@ -296,11 +296,11 @@
 
 	if(ComparePrivate(aThePath))
 		{	
-		if(SIDCheck(aRequest, aThePath))
+		if(SIDCheck(aMessage, aThePath))
 			return KErrNone;	
 		else
 			{
-			if(aCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+			if(aCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 				return KErrNone;
 			else if (aExactMatchAllowed && aThePath.Length() <= KPrivateLength + 1)
 				return KErrNone;
@@ -310,7 +310,7 @@
 		}
 	else if(CompareSystem(aThePath))
 		{
-		if(aCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout)))
+		if(aCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout)))
 			return KErrNone;
 		else if (aExactMatchAllowed && aThePath.Length() <= KSystemLength + 1)
 			return KErrNone;
--- a/userlibandfileserver/fileserver/sfsrv/cl_notification.cpp	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfsrv/cl_notification.cpp	Mon Nov 01 20:11:36 2010 +0000
@@ -179,7 +179,7 @@
  * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
  * Word3   : UID
  * Word(s) : Path (TText8) , [Any sub-class members]
-
+ */
 EXPORT_C TInt TFsNotification::DriveNumber(TInt& aDriveNumber) const
 	{
 	TPtrC path(NULL,0);
@@ -193,7 +193,7 @@
 		}
 	return r;
 	}
-	*/
+	
 
 /*
  * The order of the data in the buffer is:
@@ -201,14 +201,14 @@
  * Word2   : NewNameSize (2 bytes) , NotificationType (2 bytes)
  * Word3   : UID
  * Word(s) : Path (TText8) , [Any sub-class members]
-
+ */
 EXPORT_C TInt TFsNotification::UID(TUid& aUID) const
     {
     TUint* word3 = PtrAdd((TUint*)this, sizeof(TUint)*2);
     aUID.iUid = *word3;
     return KErrNone; 
     }
-	*/
+	
 
 
 CFsNotificationList* CFsNotificationList::NewL(TInt aBufferSize)
@@ -321,12 +321,34 @@
 	}
 
 EXPORT_C TInt CFsNotify::AddNotification(TUint aNotificationType, const TDesC& aPath, const TDesC& aFilename)
-	{
-	if(aNotificationType == 0 || (aPath.Length() <= 0 && aFilename.Length() <= 0))
-		return KErrArgument;
+    {
+    TInt pathLength = aPath.Length();
+    if(aNotificationType == 0 || (pathLength <= 0 && aFilename.Length() <= 0))
+        return KErrArgument;
+
+    //Validate path.
+    //Paths must be fully formed. i.e. with a valid or wild drive letter.
+    if(pathLength)
+        {
+        if(aPath[0] != '*' && aPath[0] != '?')
+            {
+            TInt drive = KErrNotFound;
+            TInt r = RFs::CharToDrive(aPath[0],drive);
 
-	return iBody->iFsNotify.AddNotification(aNotificationType, aPath, aFilename);
-	}
+            if(r!=KErrNone)
+                return KErrPathNotFound;
+            if(drive < EDriveA || drive > EDriveZ)
+                return KErrPathNotFound;
+            if(pathLength < 2)
+                return KErrPathNotFound;
+            else if(aPath[1] != ':')
+                return KErrPathNotFound;
+            }
+        }
+
+
+    return iBody->iFsNotify.AddNotification(aNotificationType, aPath, aFilename);
+    }
 
 //Removes notification request, does not close session
 EXPORT_C TInt CFsNotify::RemoveNotifications()
@@ -450,19 +472,17 @@
 	return KErrNotSupported;
 	}
 
-/*
 EXPORT_C TInt TFsNotification::DriveNumber(TInt&) const
 	{
 	Panic(ENotificationPanic);
 	return KErrNotSupported;
 	}
 	
-EXPORT_C TInt TFsNotification::UID(TUid& aUID) const
+EXPORT_C TInt TFsNotification::UID(TUid&) const
     {
  	Panic(ENotificationPanic);
 	return KErrNotSupported;
     }
-*/
 
 EXPORT_C CFsNotify* CFsNotify::NewL(RFs& , TInt)
 	{
--- a/userlibandfileserver/fileserver/sfsrv/cl_notification.h	Tue Oct 26 12:49:20 2010 +0100
+++ b/userlibandfileserver/fileserver/sfsrv/cl_notification.h	Mon Nov 01 20:11:36 2010 +0000
@@ -61,15 +61,12 @@
  * All types have the following data and are aligned in the buffer like so:
  * Word1 : Size (TUint16 - upper 2 bytes) , NameLength (TUint16 - lower 2 bytes),
  * Word2 : Type (TUint - 4 bytes)
- * [not yet supported - Word3 : UID (TUint32 - 4 Bytes) ]
+ * Word3 : UID (TUint32 - 4 Bytes) 
  * 
  @internalTechnology
  @released
  */
-const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint));
-//
-//When UID is added:
-//const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint))+sizeof(TUint32);
+const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+sizeof(TUint)+sizeof(TUint32);
 
 /*
  * This is the minimum allowed size of the buffer set by the client that is