merge
authorTom Sutcliffe <thomas.sutcliffe@accenture.com>
Tue, 07 Sep 2010 20:38:36 +0100
changeset 65 31c9a831b704
parent 64 27ac5e7cd5fb (diff)
parent 51 8dc858aede52 (current diff)
child 69 5b2eab065888
merge
build/common/common.mmh
core/src/fshell.mmp
--- a/build/common/common.mmh	Sat Aug 28 00:14:27 2010 +0100
+++ b/build/common/common.mmh	Tue Sep 07 20:38:36 2010 +0100
@@ -277,7 +277,9 @@
 #endif
 
 #if defined(FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
+#ifdef FSHELL_COMMS_SUPPORT
 #define FSHELL_CORE_SUPPORT_SYSINFO_WLAN
+#endif
 #define FSHELL_CORE_SUPPORT_SECURE_TIME
 #endif
 
--- a/build/common/fsh_rombuild_defs.iby	Sat Aug 28 00:14:27 2010 +0100
+++ b/build/common/fsh_rombuild_defs.iby	Tue Sep 07 20:38:36 2010 +0100
@@ -22,7 +22,7 @@
 
 #define FSHELL_DATA_FILE(fileNameFrom, fileNameTo) data=##fileNameFrom fileNameTo
 #define FSHELL_EXECUTABLE_FILE(fileName) file=\epoc32\release\##MAIN##\##BUILD##\##fileName sys\bin\##fileName
-#define FSHELL_EXECUTABLE_AS_DATA(fileNameFrom, fileNameTo) data=\epoc32\release\##MAIN##\##BUILD##\fileNameFrom sys\bin\fileNameTo
+#define FSHELL_EXECUTABLE_AS_DATA(fileNameFrom, fileNameTo) data=\epoc32\release\##MAIN##\##BUILD##\fileNameFrom sys\bin\##fileNameTo
 #define FSHELL_DEBUG_EXECUTABLE_FILE(fileName) file=\epoc32\release\##MAIN##\##BUILD##\##fileName sys\bin\##fileName
 #define FSHELL_RENAMED_EXECUTABLE_FILE(fileNameFrom, fileNameTo) file=\epoc32\release\##MAIN##\##BUILD##\##fileNameFrom sys\bin\##fileNameTo
 #define FSHELL_DEBUG_RENAMED_EXECUTABLE_FILE(fileNameFrom, fileNameTo) file=\epoc32\release\##MAIN##\##BUILD##\##fileNameFrom sys\bin\##fileNameTo
@@ -46,7 +46,7 @@
 
 #define FSHELL_DATA_FILE(fileNameFrom, fileNameTo) data=##fileNameFrom fileNameTo
 #define FSHELL_EXECUTABLE_FILE(fileName) file=##ABI_DIR##\##DEBUG_DIR##\##fileName sys\bin\##fileName
-#define FSHELL_EXECUTABLE_AS_DATA(fileNameFrom, fileNameTo) file=##ABI_DIR##\##DEBUG_DIR##\fileNameFrom sys\bin\fileNameTo
+#define FSHELL_EXECUTABLE_AS_DATA(fileNameFrom, fileNameTo) file=##ABI_DIR##\##DEBUG_DIR##\fileNameFrom sys\bin\##fileNameTo
 #define FSHELL_DEBUG_EXECUTABLE_FILE(fileName) file=##ABI_DIR##\##DEBUG_DIR##\##fileName sys\bin\##fileName
 #define FSHELL_RENAMED_EXECUTABLE_FILE(fileNameFrom, fileNameTo) file=##ABI_DIR##\##BUILD_DIR\##fileNameFrom sys\bin\##fileNameTo
 #define FSHELL_DEBUG_RENAMED_EXECUTABLE_FILE(fileNameFrom, fileNameTo) file=##ABI_DIR##\##DEBUG_DIR\##fileNameFrom sys\bin\##fileNameTo
--- a/build/common/fshell.iby	Sat Aug 28 00:14:27 2010 +0100
+++ b/build/common/fshell.iby	Tue Sep 07 20:38:36 2010 +0100
@@ -45,4 +45,8 @@
 #include <consoleproxy.iby>
 FSHELL_EXECUTABLE_FILE(consoleextensions.dll) // TODO move this to the new fshell_consoles.iby
 
+#ifdef FSHELL_TRACECORE_SUPPORT
+FSHELL_EXECUTABLE_FILE(terminalkeyboardcons.dll) // TODO move this to the new fshell_consoles.iby
+#endif
+
 #endif // FSHELL_IBY
--- a/build/sf/3tshell/fshell_platform.iby	Sat Aug 28 00:14:27 2010 +0100
+++ b/build/sf/3tshell/fshell_platform.iby	Tue Sep 07 20:38:36 2010 +0100
@@ -21,6 +21,8 @@
 
 #else
 
+#define FSHELL_REPLACE_ECONS
+
 // The minimum that fshell requires to rombuild successfully
 
 // Don't ask me...
--- a/commands/fzip/fzip.cif	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/fzip/fzip.cif	Tue Sep 07 20:38:36 2010 +0100
@@ -38,11 +38,11 @@
 
 ==option bool r recurse
 
-Include sub-directories and any files contained therein when archiving.  Must be used in conjunction with '--unzip'.
+Include sub-directories and any files contained therein when archiving.
 
 ==option filename f file multiple
 
-A file to archive. Only applicable when creating a new archive.
+A file or directory to archive. Only applicable when creating a new archive. If a directory is specified then it and any files contained immediately within that directory are archived. Use --recurse to archive all sub-directories and files within the directory. 
 
 ==option enum t compression-type
 
--- a/commands/hal/hal.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/hal/hal.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -14,6 +14,7 @@
 #include <hal.h>
 #include <fshell/common.mmh>
 #include <fshell/ltkhal.h>
+#include <fshell/ltkutils.h>
 
 using namespace IoUtils;
 
@@ -127,13 +128,7 @@
 			{
 			if (!iOptions.IsPresent(&iDumpFileName))
 				{
-#ifdef FSHELL_9_1_SUPPORT
-				TInt ch = 'c';
-				HAL::Get(HAL::ESystemDrive, ch);
-				iDumpFileName[0] = 'A' + ch;
-#else
-				iDumpFileName[0] = 'A' + static_cast<TInt>(RFs::GetSystemDrive());
-#endif
+				iDumpFileName[0] = LtkUtils::GetSystemDrive();
 				}
 			RFile file;
 			LeaveIfErr(file.Open(FsL(), iDumpFileName, EFileRead), _L("Couldn't open \"%S\" for reading"), &iDumpFileName);
--- a/commands/pubsub/pubsub.cif	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/pubsub/pubsub.cif	Tue Sep 07 20:38:36 2010 +0100
@@ -68,6 +68,10 @@
 
 When specified in conjunction with the C<notify> command, uses C<CBtracePubSub> to get the notifications instead of using C<RProperty::Subscribe> or C<memoryaccess>.
 
+==option bool r raw
+
+When specified in conjunction with the C<get> command, print out just the value, rather than the usual more verbose format that shows the category, key, type and value.
+
 ==copyright
 
 Copyright (c) 2008-2010 Accenture. All rights reserved.
--- a/commands/pubsub/pubsub.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/pubsub/pubsub.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -68,6 +68,7 @@
 	HBufC* iStringVal;
 	TInt iIntVal;
 	TBool iForce;
+	TBool iRaw;
 
 	TBool iNotify;
 	TBool iDefine;
@@ -342,15 +343,29 @@
 		switch (type)
 			{
 			case EInt:
-				Printf(_L("0x%08x 0x%08x TInt: %d (0x%x)\r\n"), aCategory, aKey, valInt, valInt);
+				if (iRaw)
+					{
+					Printf(_L("%d"), valInt);
+					}
+				else
+					{
+					Printf(_L("0x%08x 0x%08x TInt: %d (0x%x)\r\n"), aCategory, aKey, valInt, valInt);
+					}
 				break;
 			case EDes:
 				{
-				TPtrC8 des(valDes);
-				if (!aFull) des.Set(valDes.Left(32)); // Don't print the whole thing, only 2 lines max
-				Printf(_L("0x%08x 0x%08x TDesC8 hex dump:\r\n"), aCategory, aKey);
-				LtkUtils::HexDumpToOutput(des, Stdout());
-				if (des.Length() < valDes.Length()) Write(_L("...\r\n"));
+				if (iRaw)
+					{
+					Printf(_L8("%S"), &valDes);
+					}
+				else
+					{
+					TPtrC8 des(valDes);
+					if (!aFull) des.Set(valDes.Left(32)); // Don't print the whole thing, only 2 lines max
+					Printf(_L("0x%08x 0x%08x TDesC8 hex dump:\r\n"), aCategory, aKey);
+					LtkUtils::HexDumpToOutput(des, Stdout());
+					if (des.Length() < valDes.Length()) Write(_L("...\r\n"));
+					}
 				break;
 				}
 			default:
@@ -376,6 +391,7 @@
 #ifdef FSHELL_TRACE_SUPPORT
 	aOptions.AppendBoolL(iUseBtrace, _L("btrace"));
 #endif
+	aOptions.AppendBoolL(iRaw, _L("raw"));
 	//aOptions.AppendStringL(iStringVal, '8', _L("set-data"), _L("Sets the specified key to this 8-bit value"));
 	//aOptions.AppendBoolL(iDelete, 'l', _L("delete"), _L("Deletes the specified property"));
 	}
--- a/commands/variant/variant.cif	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/variant/variant.cif	Tue Sep 07 20:38:36 2010 +0100
@@ -20,7 +20,7 @@
 
 If the device matches the given command line options, KErrNone is returned. If not, KErrNotSupported is returned. Note that the command will not print any error message in the case of the variant not being supported, so that it doesn't make script output untidy. If an error message is required, use the C<--verbose> option.
 
-In addition there are two special variants understood by all implementations of this command: C<wins> and C<target> for WINS[CW] emulator and non-emulator platforms respectively.
+In addition there are some other special variant names supported, that are derived at compile time from the platform.mmh macros and similar: run the tool with no arguments to see the full list.
 
 Example usage:
 
@@ -28,6 +28,8 @@
     variant wins && do-something-emulator-specific
     variant h4 h6 && do-something-for-h4-and-h6
 
+If no arguments are specified, all the supported and understood variants are listed.
+
 ==option uint u uid multiple
 
 Test whether the device matches any of the specified machine UIDs.
@@ -38,7 +40,7 @@
 
 ==option bool l list
 
-List the variant names that this command understands. Note this is all of them, not just the ones that match the current platform.
+Has no effect, kept for compatability.
 
 ==argument string variantname optional multiple
 
--- a/commands/variant/variant.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/commands/variant/variant.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -12,6 +12,7 @@
 
 #include <hal.h>
 #include "variant.h"
+#include <fshell/common.mmh>
 #include <fshell/descriptorutils.h>
 
 //
@@ -67,30 +68,56 @@
 	{ 0x2000DA56, DESC("5800") },
 	{ 0x2001F0A1, DESC("satio") }, // I assume this is what it shipped with...
 	{ 0x20029a73, DESC("n8") }, // Likewise...
+	{ 0x102734e3, DESC("qemu") },
 	};
 const TInt KMachineIdVariantCount = sizeof(KMachineIdVariants) / sizeof(TVariant);
 
+// This is a list of things configured in or out at compile time based on the platform.mmh macros and similar
+const LtkUtils::SLitC KOtherSupportedVariants[] =
+	{
+#ifdef __WINS__
+	DESC("wins"),
+#else
+	DESC("target"),
+#endif
+#ifdef FSHELL_TRACECORE_SUPPORT
+	DESC("tracecore-support"),
+#endif
+	};
+const TInt KOtherSupportedVariantsCount = sizeof(KOtherSupportedVariants) / sizeof(LtkUtils::SLitC);
+
 void CCmdVariant::DoRunL()
 	{
-	if (iList)
+	TInt localMachineUid = GetMachineUidL();
+
+	if (iMachineId.Count() == 0 && iVariant.Count() == 0)
 		{
-		Printf(_L("Supported variants: "));
+		Printf(_L("Variant names understood by this command: "));
 		for (TInt i = 0; i < KMachineIdVariantCount; i++)
 			{
 			Printf(_L("%S, "), &KMachineIdVariants[i].iName);
 			}
-		// Finally add the ones which don't appear in KMachineIdVariants
-		Write(_L("wins, target\r\n"));
+		// Finally add the ones which can appear in KOtherSupportedVariants
+		Printf(_L("wins, target, tracecore-support\r\n"));
+
+		Printf(_L("Variant names supported by this device: "));
+		for (TInt i = 0; i < KMachineIdVariantCount; i++)
+			{
+			if (localMachineUid == KMachineIdVariants[i].iUid)
+				{
+				Printf(_L("%S, "), &KMachineIdVariants[i].iName);
+				}
+			}
+		for (TInt i = 0; i < KOtherSupportedVariantsCount; i++)
+			{
+			if (i > 0) Printf(_L(", "));
+			Printf(KOtherSupportedVariants[i]());
+			}
+		Printf(_L("\r\n"));
 		Complete(KErrNone);
 		return;
 		}
 
-	if (iMachineId.Count() == 0 && iVariant.Count() == 0)
-		{
-		LeaveIfErr(KErrArgument, _L("You must specify at least one <variantname> argument or --uid option"));
-		}
-
-	TInt localMachineUid = GetMachineUidL();
 	TBool match = EFalse;
 	if (iMachineId.Count())
 		{
@@ -115,11 +142,14 @@
 					match = ETrue;
 					}
 				}
-#ifdef __WINS__
-			if (iVariant[i]->CompareF(_L("wins")) == 0) match = ETrue;
-#else
-			if (iVariant[i]->CompareF(_L("target")) == 0) match = ETrue;
-#endif
+			
+			for (TInt j = 0; match == EFalse && j < KOtherSupportedVariantsCount; j++)
+				{
+				if (iVariant[i]->CompareF(KOtherSupportedVariants[j]) == 0)
+					{
+					match = ETrue;
+					}
+				}
 			}
 		}
 
--- a/core/builtins/var.cif	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/builtins/var.cif	Tue Sep 07 20:38:36 2010 +0100
@@ -64,6 +64,10 @@
 
 Subtracts the given value from the environment variable. Semantics as per add.
 
+==enum-value multiply
+
+Multiply the specified environment variable by the given value.
+
 ==argument string argument optional
 
 The argument to the operation.
--- a/core/group/comm.script	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/group/comm.script	Tue Sep 07 20:38:36 2010 +0100
@@ -11,6 +11,8 @@
 # Accenture - Initial contribution
 #
 
+variant wins && error -5 "comm.script is not supported on the emulator"
+
 # NaviEngine, port next to VGA
 variant naviengine && export ARGS "--console vt100busdevcons --console-title pdd=euart1,ldd=ecomm,port=1,rate=115200"
 
@@ -26,8 +28,16 @@
 # OPP Mid-Size Prototype, requires a special USB cable with a UART bridge built into it (normally covered in heat shrink) or a "black box".
 variant opp-mid-size && export ARGS "--console vt100busdevcons --console-title pdd=euart1,ldd=ecomm,rate=115200,port=4"
 
+# QEMU simulator - assumes you're using 2nd emulated serial port for fshell, ie with options similar to "-serial file:rdebug.txt -serial COMx"
+variant qemu && export ARGS "--console vt100busdevcons --console-title pdd=eserial,ldd=ecomm,rate=115200,port=1"
+
 # Add new variants here
 
+
+# Only try terminal keyboard if there hasn't been a better match for the hardware (and tracecore is supported)
+# Therefore, this rule should stay near the bottom of the file
+var ARGS not-defined && variant tracecore-support && export ARGS "--console terminalkeyboardcons --console-size 120,40" 
+
 # And finally, start fshell with the given configuration
 var ARGS defined || error -5 "Variant not recognised, can't open serial connection"
 fshell $ARGS &
\ No newline at end of file
--- a/core/group/fshell_autoexec.bat	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/group/fshell_autoexec.bat	Tue Sep 07 20:38:36 2010 +0100
@@ -1,1 +1,1 @@
-fshell autostart
+start fshell autostart
--- a/core/group/fshell_core.iby	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/group/fshell_core.iby	Tue Sep 07 20:38:36 2010 +0100
@@ -170,19 +170,16 @@
 #endif
 
 #ifdef FSHELL_REPLACE_ECONS
-//FSHELL_RENAMED_EXECUTABLE_FILE(iocons.dll, econs.dll)
-// New method that doesn't involve removing other occurences of econs.dll from your IBYs. See TODO
-FSHELL_EXECUTABLE_AS_DATA(iocons.dll, iocons.dll)
+FSHELL_EXECUTABLE_AS_DATA(iocons.dll,iocons.dll)
 
 #ifdef FSHELL_USE_BLUETOOTH_CONSOLE
-FSHELL_DATA_FILE(ZSYSTEM\console\iosrv.ini.bluetooth, system\console\iosrv.ini)
+FSHELL_DATA_FILE(ZSYSTEM\console\iosrv.ini.bluetooth,system\console\iosrv.ini)
 #else
-//TomS: I don't think this should be here any more - the VT100 consoles don't need it and I get by quite happily without it
-//FSHELL_DATA_FILE(ZSYSTEM\console\iosrv.ini.econs_fb, system\console\iosrv.ini)
+FSHELL_DATA_FILE(ZSYSTEM\console\iosrv.ini.econs_fb,system\console\iosrv.ini)
 #ifdef FSHELL_WSERV_SUPPORT
-FSHELL_RENAMED_EXECUTABLE_FILE(econseik.dll, econs_fb.dll)
+FSHELL_RENAMED_EXECUTABLE_FILE(econseik.dll,econs_fb.dll)
 #else
-FSHELL_RENAMED_EXECUTABLE_FILE(econs.dll, econs_fb.dll)
+FSHELL_RENAMED_EXECUTABLE_FILE(econs.dll,econs_fb.dll)
 #endif
 #endif // FSHELL_USE_BLUETOOTH_CONSOLE
 
--- a/core/src/commands.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/src/commands.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -3428,16 +3428,19 @@
 			break;
 		case EAdd:
 		case ESubtract:
+		case EMultiply:
 			{
-			if (iArg == NULL) LeaveIfErr(KErrArgument, _L("Argument must be specified for add and subtract operations"));
+			if (iArg == NULL) LeaveIfErr(KErrArgument, _L("Argument must be specified for add, subtract and multiply operations"));
 			TLex lex(*iArg);
 			TInt operand;
 			TInt err = lex.Val(operand);
 			LeaveIfErr(err, _L("Couldn't parse an integer from argument '%S'"), iArg);
-			if (iOperation == ESubtract) operand = -operand;
-			TInt current = 0;
-			TRAP_IGNORE(current = env.GetAsIntL(*iVar1)); // If it doesn't yet exist or isn't an int, we'll treat it as if it was zero
-			env.SetL(*iVar1, current + operand);
+			TInt value = 0;
+			TRAP_IGNORE(value = env.GetAsIntL(*iVar1)); // If it doesn't yet exist or isn't an int, we'll treat it as if it was zero
+			if (iOperation == ESubtract) value = value - operand;
+			else if (iOperation == EMultiply) value = value * operand;
+			else value = value + operand;
+			env.SetL(*iVar1, value);
 			break;
 			}
 		default:
@@ -3535,8 +3538,6 @@
 	if (err < 0)
 		{
 		aError.Report();
-		const TDesC& scriptPath = Env().GetAsDes(KScriptPath);
-		const TDesC& scriptName = Env().GetAsDes(KScriptName);
 		PrintError(err, _L("Aborted \"%S\" at line %d"), &aError.ScriptFileName(), aError.ScriptLineNumber());
 		}
 	Complete(err);
--- a/core/src/commands.h	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/src/commands.h	Tue Sep 07 20:38:36 2010 +0100
@@ -729,6 +729,7 @@
 		ENotEqual,
 		EAdd,
 		ESubtract,
+		EMultiply,
 		} iOperation;
 	HBufC* iVar1;
 	HBufC* iArg;
--- a/core/src/fshell.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/src/fshell.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -405,9 +405,7 @@
 		User::LeaveIfError(fs.Connect());
 		_LIT(KPath, "%c:\\sys\\bin\\econs.dll");
 		TBuf<32> econsPath;
-		TChar systemDrive = 'c';
-		fs.DriveToChar(fs.GetSystemDrive(), systemDrive);
-		econsPath.Format(KPath, TUint(systemDrive));
+		econsPath.Format(KPath, LtkUtils::GetSystemDrive());
 		TEntry ioconsEntry;
 		err = fs.Entry(iocons.FileName(), ioconsEntry);
 		if (err == KErrNone)
--- a/core/src/fshell.mmp	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/src/fshell.mmp	Tue Sep 07 20:38:36 2010 +0100
@@ -94,7 +94,7 @@
 #ifdef SBSV2
 sourcepath      /epoc32/build/fshell/core/generated/PLAT
 #else
-sourcepath      \epoc32\build\fshell\core\generated\ ## PLAT
+sourcepath      \epoc32\build\fshell\core\generated\PLAT
 #endif
 source          fshell_version.cpp
 
--- a/core/tsrc/fshell-basic-test.script	Sat Aug 28 00:14:27 2010 +0100
+++ b/core/tsrc/fshell-basic-test.script	Tue Sep 07 20:38:36 2010 +0100
@@ -154,6 +154,11 @@
 #TODO with $A defined this no longer works - is this reasonable? I'm guessing the string is expanded left-to-right.
 #echo $A$INNER | export -s RESULT # I'd like this to expand to $ANEST then to "correct" but it expands to aaaNEST
 
+# Check what characters are allowed in an environment variable name - I'm assuming |&$^#;"' aren't a good idea
+export AWKWARD-!£%*()_+=/\[]{}:@ "really awkward thing"
+echo -n "Evil $AWKWARD-!£%*()_+=/\[]{}:@." | export -s RESULT
+var RESULT == "Evil really awkward thing." || $Error
+
 # Test that errors reported from scripts are reported with correct line numbers
 export EXPECTED_ERR "Error: Aborted ^"$SCRIPT_PATHprinterror.script^" at line 17 : KErrNotFound (-1)^r^n"
 
--- a/documentation/change_history.pod	Sat Aug 28 00:14:27 2010 +0100
+++ b/documentation/change_history.pod	Tue Sep 07 20:38:36 2010 +0100
@@ -24,7 +24,7 @@
 
 =item *
 
-Added L<terminal keyboard|terminalkeyboardcons> console, for platforms that support Terminal Keyboard and Trace Core.
+Added L<terminal keyboard|terminalkeyboardcons> console, for platforms that support Terminal Keyboard and Trace Core. On such platforms comm.script (and thus -DFSHELL_AUTOSTART) will use it if there is no better match for the hardware platform.
 
 =item *
 
@@ -46,6 +46,8 @@
 
 fshell's current working directory is now normalised (via new TFileName2::Normalize function) so that the case matches what's on the filesystem).
 
+=back
+
 =head2 Release 000.2-000.5
 
 Test releases with build fixes.
--- a/libraries/iosrv/bmarm/iocliu.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/iosrv/bmarm/iocliu.def	Tue Sep 07 20:38:36 2010 +0100
@@ -141,7 +141,7 @@
 	ConnectL__10RIoSession @ 140 NONAME R3UNUSED ; RIoSession::ConnectL(void)
 	Connect__10RIoSession @ 141 NONAME R3UNUSED ; RIoSession::Connect(void)
 	ConsoleImplementation__Q27IoUtils12CCommandBase @ 142 NONAME R3UNUSED ; IoUtils::CCommandBase::ConsoleImplementation(void)
-	CopyL__Q27IoUtils12CEnvironmentRCQ27IoUtils12CEnvironment @ 143 NONAME R3UNUSED ; IoUtils::CEnvironment::CopyL(IoUtils::CEnvironment const &)
+	CopyL__Q27IoUtils12CEnvironmentRCQ27IoUtils12CEnvironment @ 143 NONAME R3UNUSED ABSENT ; IoUtils::CEnvironment::CopyL(IoUtils::CEnvironment const &)
 	Count__CQ27IoUtils12CEnvironment @ 144 NONAME R3UNUSED ; IoUtils::CEnvironment::Count(void) const
 	CreateImplementationLC__CQ27IoUtils25CServerCommandConstructor @ 145 NONAME R3UNUSED ; IoUtils::CServerCommandConstructor::CreateImplementationLC(void) const
 	CreateL__10RIoConsoleR10RIoSessionRC7TDesC16R10RIoConsoleT2RC5TSizeUi @ 146 NONAME ; RIoConsole::CreateL(RIoSession &, TDesC16 const &, RIoConsole &, TDesC16 const &, TSize const &, unsigned int)
@@ -196,8 +196,8 @@
 	Exit__Q27IoUtils11CServerBasei @ 195 NONAME R3UNUSED ; IoUtils::CServerBase::Exit(int)
 	Ext__CQ27IoUtils10TFileName2 @ 196 NONAME R3UNUSED ; IoUtils::TFileName2::Ext(void) const
 	Extension___Q27IoUtils12CCommandBaseUiRPvPv @ 197 NONAME ; IoUtils::CCommandBase::Extension_(unsigned int, void *&, void *)
-	ExternalizeL__CQ27IoUtils12CEnvironmentR5TDes8 @ 198 NONAME R3UNUSED ; IoUtils::CEnvironment::ExternalizeL(TDes8 &) const
-	ExternalizedSize__CQ27IoUtils12CEnvironment @ 199 NONAME R3UNUSED ; IoUtils::CEnvironment::ExternalizedSize(void) const
+	ExternalizeL__CQ27IoUtils12CEnvironmentR5TDes8 @ 198 NONAME R3UNUSED ABSENT ; IoUtils::CEnvironment::ExternalizeL(TDes8 &) const
+	ExternalizedSize__CQ27IoUtils12CEnvironment @ 199 NONAME R3UNUSED ABSENT ; IoUtils::CEnvironment::ExternalizedSize(void) const
 	Factory__Q27IoUtils11CServerBase @ 200 NONAME R3UNUSED ; IoUtils::CServerBase::Factory(void)
 	Factory__Q27IoUtils18CServerCommandBase @ 201 NONAME R3UNUSED ; IoUtils::CServerCommandBase::Factory(void)
 	FindFileL__Q27IoUtils10TFileName2R3RFs @ 202 NONAME R3UNUSED ; IoUtils::TFileName2::FindFileL(RFs &)
@@ -371,11 +371,11 @@
 	Reset__Q27IoUtils14CTextFormatter @ 370 NONAME R3UNUSED ; IoUtils::CTextFormatter::Reset(void)
 	RunCommandL__Q27IoUtils12CCommandBase @ 371 NONAME R3UNUSED ; IoUtils::CCommandBase::RunCommandL(void)
 	RunCommandL__Q27IoUtils12CCommandBasePC7TDesC16PQ27IoUtils12CEnvironment @ 372 NONAME R3UNUSED ; IoUtils::CCommandBase::RunCommandL(TDesC16 const *, IoUtils::CEnvironment *)
-	RunCommandL__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironment @ 373 NONAME ; IoUtils::CCommandBase::RunCommandL(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *)
-	RunCommand__Q27IoUtils12CCommandBase @ 374 NONAME R3UNUSED ; IoUtils::CCommandBase::RunCommand(void)
-	RunCommand__Q27IoUtils12CCommandBasePC7TDesC16PQ27IoUtils12CEnvironment @ 375 NONAME R3UNUSED ; IoUtils::CCommandBase::RunCommand(TDesC16 const *, IoUtils::CEnvironment *)
-	RunCommand__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironment @ 376 NONAME ; IoUtils::CCommandBase::RunCommand(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *)
-	RunCommand__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironmentPQ27IoUtils20MCommandBaseObserver @ 377 NONAME ; IoUtils::CCommandBase::RunCommand(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *, IoUtils::MCommandBaseObserver *)
+	RunCommandL__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironment @ 373 NONAME ABSENT ; IoUtils::CCommandBase::RunCommandL(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *)
+	RunCommand__Q27IoUtils12CCommandBase @ 374 NONAME R3UNUSED ABSENT ; IoUtils::CCommandBase::RunCommand(void)
+	RunCommand__Q27IoUtils12CCommandBasePC7TDesC16PQ27IoUtils12CEnvironment @ 375 NONAME R3UNUSED ABSENT ; IoUtils::CCommandBase::RunCommand(TDesC16 const *, IoUtils::CEnvironment *)
+	RunCommand__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironment @ 376 NONAME ABSENT ; IoUtils::CCommandBase::RunCommand(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *)
+	RunCommand__Q27IoUtils12CCommandBaseR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3PC7TDesC16PQ27IoUtils12CEnvironmentPQ27IoUtils20MCommandBaseObserver @ 377 NONAME ABSENT ; IoUtils::CCommandBase::RunCommand(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &, TDesC16 const *, IoUtils::CEnvironment *, IoUtils::MCommandBaseObserver *)
 	RunError__Q27IoUtils12CCommandBasei @ 378 NONAME R3UNUSED ; IoUtils::CCommandBase::RunError(int)
 	RunL__Q27IoUtils12CCommandBase @ 379 NONAME R3UNUSED ; IoUtils::CCommandBase::RunL(void)
 	Run__Q27IoUtils13RChildProcessR14TRequestStatus @ 380 NONAME R3UNUSED ; IoUtils::RChildProcess::Run(TRequestStatus &)
@@ -519,4 +519,35 @@
 	SubCommand__CQ27IoUtils16CCommandInfoFileRC7TDesC16 @ 518 NONAME R3UNUSED ; IoUtils::CCommandInfoFile::SubCommand(TDesC16 const &) const
 	TypeDescription__Q27IoUtils18CBranchCommandBase @ 519 NONAME R3UNUSED ; IoUtils::CBranchCommandBase::TypeDescription(void)
 	__as__Q27IoUtils5TEnumRCQ27IoUtils5TEnum @ 520 NONAME R3UNUSED ; IoUtils::TEnum::operator=(IoUtils::TEnum const &)
+	AllSet__CQ27IoUtils20RCommandArgumentList @ 521 NONAME R3UNUSED ; IoUtils::RCommandArgumentList::AllSet(void) const
+	Cif__CQ27IoUtils12CCommandBase @ 522 NONAME R3UNUSED ; IoUtils::CCommandBase::Cif(void) const
+	Copyright__CQ27IoUtils16CCommandInfoFile @ 523 NONAME R3UNUSED ; IoUtils::CCommandInfoFile::Copyright(void) const
+	Count__CQ27IoUtils20RCommandArgumentList @ 524 NONAME R3UNUSED ; IoUtils::RCommandArgumentList::Count(void) const
+	CreateEnvironmentL__Q27IoUtils12CCommandBasePQ27IoUtils12CEnvironment @ 525 NONAME R3UNUSED ; IoUtils::CCommandBase::CreateEnvironmentL(IoUtils::CEnvironment *)
+	CreateSharedEnvironmentL__Q27IoUtils12CEnvironment @ 526 NONAME R3UNUSED ; IoUtils::CEnvironment::CreateSharedEnvironmentL(void)
+	CtrlCPressed__Q27IoUtils20MCommandExtensionsV2 @ 527 NONAME R3UNUSED ; IoUtils::MCommandExtensionsV2::CtrlCPressed(void)
+	EnumValueList__CQ27IoUtils6TValue @ 528 NONAME R3UNUSED ; IoUtils::TValue::EnumValueList(void) const
+	EnvVar__CQ27IoUtils6TValue @ 529 NONAME R3UNUSED ; IoUtils::TValue::EnvVar(void) const
+	ExtensionVersion__CQ27IoUtils20MCommandExtensionsV1 @ 530 NONAME R3UNUSED ; IoUtils::MCommandExtensionsV1::ExtensionVersion(void) const
+	ExtensionVersion__CQ27IoUtils20MCommandExtensionsV2 @ 531 NONAME R3UNUSED ; IoUtils::MCommandExtensionsV2::ExtensionVersion(void) const
+	ExternalizeLC__CQ27IoUtils12CEnvironment @ 532 NONAME R3UNUSED ; IoUtils::CEnvironment::ExternalizeLC(void) const
+	GetKeysL__CQ27IoUtils12CEnvironmentRt13RPointerArray1Z7HBufC16 @ 533 NONAME R3UNUSED ; IoUtils::CEnvironment::GetKeysL(RPointerArray<HBufC16> &) const
+	IoSession__C12TIoHandleSet @ 534 NONAME R3UNUSED ; TIoHandleSet::IoSession(void) const
+	KeyPressed__Q27IoUtils20MCommandExtensionsV2UiUi @ 535 NONAME R3UNUSED ; IoUtils::MCommandExtensionsV2::KeyPressed(unsigned int, unsigned int)
+	Normalize__Q27IoUtils10TFileName2R3RFs @ 536 NONAME R3UNUSED ; IoUtils::TFileName2::Normalize(RFs &)
+	ReadKey__Q27IoUtils12CCommandBase @ 537 NONAME R3UNUSED ; IoUtils::CCommandBase::ReadKey(void)
+	RemoveAll__Q27IoUtils12CEnvironment @ 538 NONAME R3UNUSED ; IoUtils::CEnvironment::RemoveAll(void)
+	Session__C9RIoHandle @ 539 NONAME R3UNUSED ; RIoHandle::Session(void) const
+	SetCif__Q27IoUtils12CCommandBaseRCQ27IoUtils16CCommandInfoFile @ 540 NONAME R3UNUSED ; IoUtils::CCommandBase::SetCif(IoUtils::CCommandInfoFile const &)
+	SetExtension__Q27IoUtils12CCommandBasePQ27IoUtils20MCommandExtensionsV1 @ 541 NONAME R3UNUSED ; IoUtils::CCommandBase::SetExtension(IoUtils::MCommandExtensionsV1 *)
+	SetLocalL__Q27IoUtils12CEnvironmentRC7TDesC16 @ 542 NONAME R3UNUSED ; IoUtils::CEnvironment::SetLocalL(TDesC16 const &)
+	Stderr__C12TIoHandleSet @ 543 NONAME R3UNUSED ; TIoHandleSet::Stderr(void) const
+	Stdin__C12TIoHandleSet @ 544 NONAME R3UNUSED ; TIoHandleSet::Stdin(void) const
+	Stdout__C12TIoHandleSet @ 545 NONAME R3UNUSED ; TIoHandleSet::Stdout(void) const
+	StringifyError__CQ27IoUtils20MCommandExtensionsV1i @ 546 NONAME R3UNUSED ; IoUtils::MCommandExtensionsV1::StringifyError(int) const
+	Type__CQ27IoUtils6TValue @ 547 NONAME R3UNUSED ; IoUtils::TValue::Type(void) const
+	ValuePtr__CQ27IoUtils6TValue @ 548 NONAME R3UNUSED ; IoUtils::TValue::ValuePtr(void) const
+	__12TIoHandleSetR10RIoSessionR13RIoReadHandleR14RIoWriteHandleT3 @ 549 NONAME ; TIoHandleSet::TIoHandleSet(RIoSession &, RIoReadHandle &, RIoWriteHandle &, RIoWriteHandle &)
+	__vc__CQ27IoUtils20RCommandArgumentListi @ 550 NONAME R3UNUSED ; IoUtils::RCommandArgumentList::operator[](int) const
+	AcceptsMultiple__CQ27IoUtils6TValue @ 551 NONAME R3UNUSED ; IoUtils::TValue::AcceptsMultiple(void) const
 
--- a/libraries/iosrv/client/command_base.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/iosrv/client/command_base.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -3632,7 +3632,9 @@
 	return iProcess;
 	}
 
-#define CASE_RETURN_LIT(XXX) case XXX: { _LIT(_KLit, #XXX); return &_KLit; }
+// Really should define a standard CASE_LIT macro that every compiler can handle...
+#include <fshell/descriptorutils.h>
+#define CASE_RETURN_LIT(x) case x: { static const LtkUtils::SLitC KName = DESC(#x); return &KName; }
 #define CASE_RETURN_LIT2(XXX, YYY) case XXX: { _LIT(_KLit, YYY); return &_KLit; }
 #define DEFAULT_RETURN_LIT(XXX) default: { _LIT(_KLit, XXX); return &_KLit; }
 	
--- a/libraries/ltkutils/BMARM/ltkutils-tcb.DEF	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/BMARM/ltkutils-tcb.DEF	Tue Sep 07 20:38:36 2010 +0100
@@ -167,4 +167,5 @@
 	FormatSize__8LtkUtilsR5TDes8x @ 166 NONAME ; LtkUtils::FormatSize(TDes8 &, long long)
 	FormatSize___8LtkUtilsR6TDes16x @ 167 NONAME ; LtkUtils::FormatSize_(TDes16 &, long long)
 	Description__CQ28LtkUtils16RAllocatorHelper @ 168 NONAME R3UNUSED ; LtkUtils::RAllocatorHelper::Description(void) const
+	GetSystemDrive__8LtkUtilsv @ 169 NONAME R3UNUSED ; LtkUtils::GetSystemDrive(void)
 
--- a/libraries/ltkutils/BMARM/ltkutils.DEF	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/BMARM/ltkutils.DEF	Tue Sep 07 20:38:36 2010 +0100
@@ -181,4 +181,5 @@
 	FormatSize__8LtkUtilsR5TDes8x @ 180 NONAME ; LtkUtils::FormatSize(TDes8 &, long long)
 	FormatSize___8LtkUtilsR6TDes16x @ 181 NONAME ; LtkUtils::FormatSize_(TDes16 &, long long)
 	Description__CQ28LtkUtils16RAllocatorHelper @ 182 NONAME R3UNUSED ; LtkUtils::RAllocatorHelper::Description(void) const
+	GetSystemDrive__8LtkUtilsv @ 183 NONAME R3UNUSED ; LtkUtils::GetSystemDrive(void)
 
--- a/libraries/ltkutils/bwins/ltkutils-tcb.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/bwins/ltkutils-tcb.def	Tue Sep 07 20:38:36 2010 +0100
@@ -152,4 +152,5 @@
 	?FormatSize@LtkUtils@@YAXAAVTDes8@@_J@Z @ 151 NONAME ; void LtkUtils::FormatSize(class TDes8 &, long long)
 	?FormatSize@LtkUtils@@YAXAAVTDes16@@_J@Z @ 152 NONAME ; void LtkUtils::FormatSize(class TDes16 &, long long)
 	?Description@RAllocatorHelper@LtkUtils@@QBEABVTDesC16@@XZ @ 153 NONAME ; class TDesC16 const & LtkUtils::RAllocatorHelper::Description(void) const
+	?GetSystemDrive@LtkUtils@@YADXZ @ 154 NONAME ; char LtkUtils::GetSystemDrive(void)
 
--- a/libraries/ltkutils/bwins/ltkutils.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/bwins/ltkutils.def	Tue Sep 07 20:38:36 2010 +0100
@@ -181,4 +181,5 @@
 	?FormatSize@LtkUtils@@YAXAAVTDes8@@_J@Z @ 180 NONAME ; void LtkUtils::FormatSize(class TDes8 &, long long)
 	?FormatSize@LtkUtils@@YAXAAVTDes16@@_J@Z @ 181 NONAME ; void LtkUtils::FormatSize(class TDes16 &, long long)
 	?Description@RAllocatorHelper@LtkUtils@@QBEABVTDesC16@@XZ @ 182 NONAME ; class TDesC16 const & LtkUtils::RAllocatorHelper::Description(void) const
+	?GetSystemDrive@LtkUtils@@YADXZ @ 183 NONAME ; char LtkUtils::GetSystemDrive(void)
 
--- a/libraries/ltkutils/eabi/ltkutils-tcb.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/eabi/ltkutils-tcb.def	Tue Sep 07 20:38:36 2010 +0100
@@ -182,4 +182,5 @@
 	_ZN8LtkUtils10FormatSizeER5TDes8x @ 181 NONAME
 	_ZN8LtkUtils10FormatSizeER6TDes16x @ 182 NONAME
 	_ZNK8LtkUtils16RAllocatorHelper11DescriptionEv @ 183 NONAME
+	_ZN8LtkUtils14GetSystemDriveEv @ 184 NONAME
 
--- a/libraries/ltkutils/eabi/ltkutils.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/eabi/ltkutils.def	Tue Sep 07 20:38:36 2010 +0100
@@ -218,4 +218,5 @@
 	_ZN8LtkUtils10FormatSizeER5TDes8x @ 217 NONAME
 	_ZN8LtkUtils10FormatSizeER6TDes16x @ 218 NONAME
 	_ZNK8LtkUtils16RAllocatorHelper11DescriptionEv @ 219 NONAME
+	_ZN8LtkUtils14GetSystemDriveEv @ 220 NONAME
 
--- a/libraries/ltkutils/inc/heaputils.h	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/inc/heaputils.h	Tue Sep 07 20:38:36 2010 +0100
@@ -9,7 +9,9 @@
 // Initial Contributors:
 // Accenture - Initial contribution
 //
-
+// Contributors:
+// Adrian Issott (Nokia) - Updates for kernel-side alloc helper
+//
 
 #ifndef FSHELL_HEAP_UTILS_H
 #define FSHELL_HEAP_UTILS_H
@@ -41,6 +43,7 @@
 public:
 	HUIMPORT_C RAllocatorHelper();
 #ifdef __KERNEL_MODE__
+	TLinAddr GetKernelAllocator(DChunk* aKernelChunk);
 	TInt OpenKernelHeap();
 #else
 	HUIMPORT_C TInt Open(RAllocator* aAllocator);
@@ -116,13 +119,19 @@
 
 protected:
 	TInt FinishConstruction();
-	TInt IdentifyAllocatorType(TBool aAllocatorIsUdeb);
+	TInt IdentifyAllocatorType(TBool aAllocatorIsUdeb, TBool aIsTheKernelHeap=EFalse);
 	TInt OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize);
 #ifndef __KERNEL_MODE__
 	static TInt EuserIsUdeb();
 #endif
 	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
 	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
+
+#ifndef __KERNEL_MODE__
+protected:
+#else
+public:
+#endif	
 	virtual TInt TryLock();
 	virtual void TryUnlock();
 
@@ -171,10 +180,10 @@
 
 #ifdef __KERNEL_MODE__
 
-class RKernelSideAllocatorHelper : public RAllocatorHelper
-	{
+class RUserAllocatorHelper : public RAllocatorHelper
+    {
 public:
-	RKernelSideAllocatorHelper();
+	RUserAllocatorHelper();
 	TInt OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb);
 	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
 	virtual void Close();
@@ -188,6 +197,24 @@
 	DThread* iThread;
 	};
 
+class RKernelCopyAllocatorHelper : public RAllocatorHelper
+	{
+public:
+	RKernelCopyAllocatorHelper();
+	TInt OpenCopiedHeap(DChunk* aOriginalChunk, DChunk* aCopiedChunk, TInt aOffset);
+	virtual DChunk* OpenUnderlyingChunk(); // Must be in CS
+	virtual void Close();
+
+protected:
+	virtual TInt ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const;
+	virtual TInt WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize);
+	virtual TInt TryLock();
+	virtual void TryUnlock();
+private:
+	DChunk* iCopiedChunk;
+	TInt iOffset; // from the original kernel heap to the copied heap
+	};
+
 #else
 
 class RProxyAllocatorHelper : public RAllocatorHelper
--- a/libraries/ltkutils/inc/ltkutils.h	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/inc/ltkutils.h	Tue Sep 07 20:38:36 2010 +0100
@@ -65,6 +65,9 @@
 	template <class T>
 	inline void CleanupResetPushL(T& aRef);
 
+
+	IMPORT_C char GetSystemDrive(); // 9.1 doesn't have RFs::GetSystemDrive()
+
 	/****
 	 * The functions below are not available if you're linking against ltkutils-tcb.dll. They
 	 * rely on being able to link against All -TCB dlls.
--- a/libraries/ltkutils/src/heaphackery.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/src/heaphackery.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -9,6 +9,10 @@
 // Initial Contributors:
 // Accenture - Initial contribution
 //
+// Contributors:
+// Adrian Issott (Nokia) - Updates for kernel-side alloc helper
+//
+
 #ifdef TEST_HYBRIDHEAP_ASSERTS
 #define private public
 #include <e32def.h>
@@ -23,7 +27,7 @@
 
 #include <kern_priv.h>
 #define MEM Kern
-__ASSERT_COMPILE(sizeof(LtkUtils::RKernelSideAllocatorHelper) == 10*4);
+__ASSERT_COMPILE(sizeof(LtkUtils::RUserAllocatorHelper) == 10*4);
 #define KERN_ENTER_CS() NKern::ThreadEnterCS()
 #define KERN_LEAVE_CS() NKern::ThreadLeaveCS()
 #define LOG(args...)
@@ -104,6 +108,23 @@
 
 #ifdef __KERNEL_MODE__
 
+TLinAddr LtkUtils::RAllocatorHelper::GetKernelAllocator(DChunk* aKernelChunk) 
+	{
+	TLinAddr allocatorAddress;
+#ifdef __WINS__
+	allocatorAddress = (TLinAddr)aKernelChunk->Base();
+#else
+	// Copied from P::KernelInfo
+	const TRomHeader& romHdr=Epoc::RomHeader();
+	const TRomEntry* primaryEntry=(const TRomEntry*)Kern::SuperPage().iPrimaryEntry;
+	const TRomImageHeader* primaryImageHeader=(const TRomImageHeader*)primaryEntry->iAddressLin;
+	TLinAddr stack = romHdr.iKernDataAddress + Kern::RoundToPageSize(romHdr.iTotalSvDataSize);
+	TLinAddr heap = stack + Kern::RoundToPageSize(primaryImageHeader->iStackSize);
+	allocatorAddress = heap;
+#endif
+	return allocatorAddress;
+	}
+
 TInt RAllocatorHelper::OpenKernelHeap()
 	{
 	_LIT(KName, "SvHeap");
@@ -123,19 +144,14 @@
 			}
 		}
 	iChunk = foundChunk;
-    chunkContainer->Signal();
-#ifdef __WINS__
-	TInt err = OpenChunkHeap((TLinAddr)foundChunk->Base(), 0); // It looks like DChunk::iBase/DChunk::iFixedBase should both be ok for the kernel chunk
-#else
-	// Copied from P::KernelInfo
-	const TRomHeader& romHdr=Epoc::RomHeader();
-	const TRomEntry* primaryEntry=(const TRomEntry*)Kern::SuperPage().iPrimaryEntry;
-	const TRomImageHeader* primaryImageHeader=(const TRomImageHeader*)primaryEntry->iAddressLin;
-	TLinAddr stack = romHdr.iKernDataAddress + Kern::RoundToPageSize(romHdr.iTotalSvDataSize);
-	TLinAddr heap = stack + Kern::RoundToPageSize(primaryImageHeader->iStackSize);
-	TInt err = OpenChunkHeap(heap, 0); // aChunkMaxSize is only used for trying the middle of the chunk for hybrid allocatorness, and the kernel heap doesn't use that (thankfully). So we can safely pass in zero.
+	chunkContainer->Signal();
+
+	iAllocatorAddress = GetKernelAllocator(foundChunk);
 
-#endif
+	// It looks like DChunk::iBase/DChunk::iFixedBase should both be ok for the kernel chunk
+	// aChunkMaxSize is only used for trying the middle of the chunk for hybrid allocatorness, and the kernel heap doesn't use that (thankfully). So we can safely pass in zero.
+	TInt err = OpenChunkHeap((TLinAddr)foundChunk->Base(), 0); 
+
 	if (!err) err = FinishConstruction();
 	NKern::ThreadLeaveCS();
 	return err;
@@ -288,11 +304,11 @@
 
 #ifdef __KERNEL_MODE__
 
-LtkUtils::RKernelSideAllocatorHelper::RKernelSideAllocatorHelper()
+LtkUtils::RUserAllocatorHelper::RUserAllocatorHelper()
 	: iThread(NULL)
 	{}
 
-void LtkUtils::RKernelSideAllocatorHelper::Close()
+void LtkUtils::RUserAllocatorHelper::Close()
 	{
 	NKern::ThreadEnterCS();
 	if (iThread)
@@ -304,27 +320,27 @@
 	NKern::ThreadLeaveCS();
 	}
 
-TInt LtkUtils::RKernelSideAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const
+TInt LtkUtils::RUserAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const
 	{
 	return Kern::ThreadRawRead(iThread, (const TAny*)aLocation, aResult, aSize);
 	}
 
-TInt LtkUtils::RKernelSideAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize)
+TInt LtkUtils::RUserAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize)
 	{
 	return Kern::ThreadRawWrite(iThread, (TAny*)aLocation, aData, aSize);
 	}
 
-TInt LtkUtils::RKernelSideAllocatorHelper::TryLock()
+TInt LtkUtils::RUserAllocatorHelper::TryLock()
 	{
 	return KErrNotSupported;
 	}
 
-void LtkUtils::RKernelSideAllocatorHelper::TryUnlock()
+void LtkUtils::RUserAllocatorHelper::TryUnlock()
 	{
 	// Not supported
 	}
 
-TInt LtkUtils::RKernelSideAllocatorHelper::OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb)
+TInt LtkUtils::RUserAllocatorHelper::OpenUserHeap(TUint aThreadId, TLinAddr aAllocatorAddress, TBool aEuserIsUdeb)
 	{
 	NKern::ThreadEnterCS();
 	DObjectCon* threads = Kern::Containers()[EThread];
@@ -344,34 +360,102 @@
 	return err;
 	}
 
+LtkUtils::RKernelCopyAllocatorHelper::RKernelCopyAllocatorHelper()
+	: iCopiedChunk(NULL), iOffset(0)
+	{}
+
+TInt LtkUtils::RKernelCopyAllocatorHelper::OpenCopiedHeap(DChunk* aOriginalChunk, DChunk* aCopiedChunk, TInt aOffset)
+	{
+	TInt err = aCopiedChunk->Open();
+	if (!err)
+		{
+		iCopiedChunk = aCopiedChunk;
+		iOffset = aOffset;
+
+		// We need to set iAllocatorAddress to point to the allocator in the original chunk and not the copy
+		// because all the internal pointers will be relative to that. Instead we use iOffset in the Read / Write Data 
+		// calls
+		iAllocatorAddress = GetKernelAllocator(aOriginalChunk);
+		
+		// It looks like DChunk::iBase/DChunk::iFixedBase should both be ok for the kernel chunk
+		// aChunkMaxSize is only used for trying the middle of the chunk for hybrid allocatorness, and the kernel heap doesn't use that (thankfully). So we can safely pass in zero.
+		err = OpenChunkHeap((TLinAddr)aCopiedChunk->Base(), 0);
+		}
+	
+	return err;
+	}
+
+DChunk* LtkUtils::RKernelCopyAllocatorHelper::OpenUnderlyingChunk()
+	{
+	// We should never get here
+	__NK_ASSERT_ALWAYS(EFalse);
+	return NULL;
+	}
+
+void LtkUtils::RKernelCopyAllocatorHelper::Close()
+	{
+	if (iCopiedChunk)
+		{
+		NKern::ThreadEnterCS();
+		iCopiedChunk->Close(NULL);
+		iCopiedChunk = NULL;
+		NKern::ThreadLeaveCS();
+		}
+	iOffset = 0;
+	RAllocatorHelper::Close();
+	}
+
+TInt LtkUtils::RKernelCopyAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const
+	{
+	memcpy(aResult, (const TAny*)(aLocation+iOffset), aSize);
+	return KErrNone;
+	}
+
+TInt LtkUtils::RKernelCopyAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize)
+	{
+	memcpy((TAny*)(aLocation+iOffset), aData, aSize);
+	return KErrNone;
+	}
+
+TInt LtkUtils::RKernelCopyAllocatorHelper::TryLock()
+	{
+	return KErrNotSupported;
+	}
+
+void LtkUtils::RKernelCopyAllocatorHelper::TryUnlock()
+	{
+	// Not supported
+	}
+
 #endif // __KERNEL_MODE__
 
 TInt RAllocatorHelper::OpenChunkHeap(TLinAddr aChunkBase, TInt aChunkMaxSize)
 	{
-	iAllocatorAddress = aChunkBase;
 #ifdef __KERNEL_MODE__
 	// Must be in CS
 	// Assumes that this only ever gets called for the kernel heap. Otherwise goes through RKernelSideAllocatorHelper::OpenUserHeap.
 	TInt udeb = EFalse; // We can't figure this out until after we've got the heap
+	TBool isTheKernelHeap = ETrue;
 #else
 	// Assumes the chunk isn't the kernel heap. It's not a good idea to try messing with the kernel heap from user side...
 	TInt udeb = EuserIsUdeb();
 	if (udeb < 0) return udeb; // error
+	TBool isTheKernelHeap = EFalse;
 #endif
 
-	TInt err = IdentifyAllocatorType(udeb);
+	TInt err = IdentifyAllocatorType(udeb, isTheKernelHeap);
 	if (err == KErrNone && iAllocatorType == EAllocator)
 		{
 		// We've no reason to assume it's an allocator because we don't know the iAllocatorAddress actually is an RAllocator*
 		err = KErrNotFound;
 		}
-	if (err)
+	if (err && aChunkMaxSize > 0)
 		{
 		TInt oldErr = err;
 		TAllocatorType oldType = iAllocatorType;
 		// Try middle of chunk, in case it's an RHybridHeap
 		iAllocatorAddress += aChunkMaxSize / 2;
-		err = IdentifyAllocatorType(udeb);
+		err = IdentifyAllocatorType(udeb, isTheKernelHeap);
 		if (err || iAllocatorType == EAllocator)
 			{
 			// No better than before
@@ -389,7 +473,7 @@
 		TInt err = kernelAllocator->DebugFunction(7, NULL, NULL); // 7 is RAllocator::TAllocDebugOp::EGetFail
 		if (err == 9999)
 			{
-			// udeb new
+			// udeb new hybrid heap
 			udeb = ETrue;
 			}
 		else if (err == KErrNotSupported)
@@ -397,7 +481,7 @@
 			// Old heap - fall back to slightly nasty non-thread-safe method
 			kernelAllocator->DebugFunction(RAllocator::ESetFail, (TAny*)RAllocator::EFailNext, (TAny*)1);
 			TAny* res = Kern::Alloc(4);
-			if (res) udeb = ETrue;
+			if (!res) udeb = ETrue;
 			Kern::Free(res);
 			}
 		else
@@ -408,7 +492,7 @@
 		// Put everything back
 		kernelAllocator->DebugFunction(RAllocator::ESetFail, (TAny*)RAllocator::ENone, (TAny*)0);
 		// And update the type now we know the udeb-ness for certain
-		err = IdentifyAllocatorType(udeb);
+		err = IdentifyAllocatorType(udeb, isTheKernelHeap);
 		}
 #endif
 	return err;
@@ -535,7 +619,7 @@
 	KERN_LEAVE_CS();
 	}
 
-TInt RAllocatorHelper::IdentifyAllocatorType(TBool aAllocatorIsUdeb)
+TInt RAllocatorHelper::IdentifyAllocatorType(TBool aAllocatorIsUdeb, TBool aIsTheKernelHeap)
 	{
 	iAllocatorType = EUnknown;
 
@@ -543,7 +627,9 @@
 	TInt err = ReadWord(iAllocatorAddress + _FOFF(RHackAllocator, iHandles), handlesPtr);
 
 	if (err) return err;
-	if (handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iChunkHandle) || handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iLock))
+	if (aIsTheKernelHeap || 
+		handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iChunkHandle) || 
+		handlesPtr == iAllocatorAddress + _FOFF(RHackHeap, iLock))
 		{
 		// It's an RHeap of some kind - I doubt any other RAllocator subclass will use iHandles in this way
 		TUint32 base = 0;
@@ -971,6 +1057,7 @@
 				return KErrCorrupt;
 				}
 			}
+		
 		while (pC!=pF)				// walk allocated cells up to next free cell
 			{
 			TInt l; // pC->len;
@@ -1450,6 +1537,7 @@
 		}
 	}
 
+// Really should be called TotalSizeForCellType(...)
 HUEXPORT_C TInt RAllocatorHelper::SizeForCellType(TExtendedCellType aType)
 	{
 	if (aType & EBadnessMask) return KErrArgument;
@@ -1596,7 +1684,7 @@
 	return iChunk;
 	}
 
-DChunk* LtkUtils::RKernelSideAllocatorHelper::OpenUnderlyingChunk()
+DChunk* LtkUtils::RUserAllocatorHelper::OpenUnderlyingChunk()
 	{
 	if (iAllocatorType != EUrelOldRHeap && iAllocatorType != EUdebOldRHeap && iAllocatorType != EUrelHybridHeap && iAllocatorType != EUdebHybridHeap) return NULL;
 	// Note RKernelSideAllocatorHelper doesn't use or access RAllocatorHelper::iChunk, because we figure out the chunk handle in a different way.
--- a/libraries/ltkutils/src/ltkhal.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/src/ltkhal.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -9,9 +9,12 @@
 // Initial Contributors:
 // Accenture - Initial contribution
 //
+#include <fshell/ltkutils.h>
 #include <fshell/ltkhal.h>
 #include <fshell/descriptorutils.h>
+#include <fshell/common.mmh>
 #include <HAL.h>
+#include <f32file.h>
 
 LtkUtils::CHalAttribute::CHalAttribute(TInt aAttribute, TInt aDeviceNumber, TInt aValue, TInt aError, const TDesC& aAttributeName, HBufC* aDescription)
 	: iAttribute(aAttribute), iDeviceNumber(aDeviceNumber), iValue(aValue), iError(aError), iAttributeName(aAttributeName), iDescription(aDescription)
@@ -341,3 +344,16 @@
 	CleanupStack::Pop(&buf); // attrib now owns its HBufC*
 	return attrib;
 	}
+
+EXPORT_C char LtkUtils::GetSystemDrive()
+	{
+#ifdef FSHELL_9_1_SUPPORT
+	TInt ch = EDriveC;
+	HAL::Get(HAL::ESystemDrive, ch);
+	return 'a' + ch;
+#else
+	TChar systemDrive = 'c';
+	RFs::DriveToChar(RFs::GetSystemDrive(), systemDrive);
+	return (char)(TUint)systemDrive;
+#endif
+	}
--- a/libraries/ltkutils/src/proxyallocatorhelper.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/libraries/ltkutils/src/proxyallocatorhelper.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -31,12 +31,20 @@
 #ifdef FSHELL_MEMORY_ACCESS_SUPPORT
 	TUint8* allocatorAddress;
 	TInt err = iMemoryAccess->GetAllocatorAddress(iThreadId, allocatorAddress);
-	if (!err)
+	if (err == KErrNone)
 		{
-		iAllocatorAddress = (TLinAddr)allocatorAddress;
-		TInt udeb = EuserIsUdeb();
-		if (udeb < 0) return udeb; // error
-		err = IdentifyAllocatorType(udeb);
+		if (allocatorAddress == NULL)
+			{
+			// If the thread has not yet been resumed it's valid for it not to have an allocator yet
+			err = KErrNotReady;
+			}
+		else
+			{
+			iAllocatorAddress = (TLinAddr)allocatorAddress;
+			TInt udeb = EuserIsUdeb();
+			if (udeb < 0) return udeb; // error
+			err = IdentifyAllocatorType(udeb);
+			}
 		}
 	return err;
 #else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/consoles/common/BMARM/consoleextensions.def	Tue Sep 07 20:38:36 2010 +0100
@@ -0,0 +1,10 @@
+EXPORTS
+	WriteStdErr__19MIosrvConsoleHelperRC7TDesC16 @ 1 NONAME R3UNUSED ; MIosrvConsoleHelper::WriteStdErr(TDesC16 const &)
+	Debug__C19MIosrvConsoleHelper @ 2 NONAME R3UNUSED ; MIosrvConsoleHelper::Debug(void) const
+	HandleConsoleCreationError__19MIosrvConsoleHelperRC7TDesC16i @ 3 NONAME R3UNUSED ; MIosrvConsoleHelper::HandleConsoleCreationError(TDesC16 const &, int)
+	MIosrvConsoleHelper_Extension__19MIosrvConsoleHelperUiRPvPv @ 4 NONAME ; MIosrvConsoleHelper::MIosrvConsoleHelper_Extension(unsigned int, void *&, void *)
+	Message__19MIosrvConsoleHelperQ219MIosrvConsoleHelper10TVerbosityGt11TRefByValue1ZC7TDesC16e @ 5 NONAME ; MIosrvConsoleHelper::Message(MIosrvConsoleHelper::TVerbosity, TRefByValue<TDesC16 const>,...)
+	SetDebug__19MIosrvConsoleHelperi @ 6 NONAME R3UNUSED ; MIosrvConsoleHelper::SetDebug(int)
+	UnderlyingConsole__C19MIosrvConsoleHelper @ 7 NONAME R3UNUSED ; MIosrvConsoleHelper::UnderlyingConsole(void) const
+	CleanupUnderlyingConsole__19MIosrvConsoleHelper @ 8 NONAME R3UNUSED ; MIosrvConsoleHelper::CleanupUnderlyingConsole(void)
+
--- a/plugins/consoles/terminalkeyboardcons/terminalkeyboardcons.cpp	Sat Aug 28 00:14:27 2010 +0100
+++ b/plugins/consoles/terminalkeyboardcons/terminalkeyboardcons.cpp	Tue Sep 07 20:38:36 2010 +0100
@@ -100,13 +100,14 @@
 		User::Leave(err);
 		}
 
-	// Idiotic driver only accepts connections from processes with nokia vid - like that will stop us
+	// Annoying driver only accepts connections from processes with nokia vid - like that will stop us
 	TUint originalVid = RProcess().VendorId();
 	RMemoryAccess memAccess;
 	User::LeaveIfError(memAccess.Open());
 	TProcessProperties props;
 	props.iVid = 0x101FB657;
-	RProcess me; me.Open(RProcess().Id());
+	RProcess me;
+	User::LeaveIfError(me.Open(RProcess().Id()));
 	memAccess.SetProcessProperties(me, props);
 
 	err = iDriver.Open();
--- a/plugins/consoles/terminalkeyboardcons/terminalkeyboardcons.mmp	Sat Aug 28 00:14:27 2010 +0100
+++ b/plugins/consoles/terminalkeyboardcons/terminalkeyboardcons.mmp	Tue Sep 07 20:38:36 2010 +0100
@@ -20,6 +20,7 @@
 userinclude		.
 userinclude		..\vt100cons\src\vt100 // For vtc_cursor_tracker.h
 #include <fshell/fsh_system_include.mmh>
+systeminclude	\epoc32\include\internal // this is where the tracecore headers live, and the platform paths macros don't consistantly include it across different versions of the platform...
 
 source			terminalkeyboardcons.cpp
 sourcepath		..\vt100cons\src\vt100
--- a/plugins/consoles/vt100cons/BMARM/vt100U.def	Sat Aug 28 00:14:27 2010 +0100
+++ b/plugins/consoles/vt100cons/BMARM/vt100U.def	Tue Sep 07 20:38:36 2010 +0100
@@ -9,7 +9,7 @@
 	GetKeyPress__25CVtConsoleInputControllerR9TKeyPressR14TRequestStatus @ 8 NONAME R3UNUSED ; CVtConsoleInputController::GetKeyPress(TKeyPress &, TRequestStatus &)
 	KeyCode__C15CVtcConsoleBase @ 9 NONAME R3UNUSED ; CVtcConsoleBase::KeyCode(void) const
 	KeyModifiers__C15CVtcConsoleBase @ 10 NONAME R3UNUSED ; CVtcConsoleBase::KeyModifiers(void) const
-	Message__15CVtcConsoleBaseQ215CVtcConsoleBase10TVerbosityGt11TRefByValue1ZC7TDesC16e @ 11 NONAME ; CVtcConsoleBase::Message(CVtcConsoleBase::TVerbosity, TRefByValue<TDesC16 const>,...)
+	Message__15CVtcConsoleBaseQ215CVtcConsoleBase10TVerbosityGt11TRefByValue1ZC7TDesC16e @ 11 NONAME ABSENT ; CVtcConsoleBase::Message(CVtcConsoleBase::TVerbosity, TRefByValue<TDesC16 const>,...)
 	NewLC__25CVtConsoleInputControllerR13MConsoleInputRQ28LtkUtils8CIniFile @ 12 NONAME R3UNUSED ; CVtConsoleInputController::NewLC(MConsoleInput &, LtkUtils::CIniFile &)
 	NewL__25CVtConsoleInputControllerR13MConsoleInputRQ28LtkUtils8CIniFile @ 13 NONAME R3UNUSED ; CVtConsoleInputController::NewL(MConsoleInput &, LtkUtils::CIniFile &)
 	NewL__26CVtConsoleOutputControllerR14MConsoleOutputRQ28LtkUtils8CIniFileRC5TSize @ 14 NONAME R3UNUSED ; CVtConsoleOutputController::NewL(MConsoleOutput &, LtkUtils::CIniFile &, TSize const &)
@@ -31,7 +31,8 @@
 	__15CVtcConsoleBase @ 30 NONAME R3UNUSED ; CVtcConsoleBase::CVtcConsoleBase(void)
 	__9TKeyPress @ 31 NONAME R3UNUSED ; TKeyPress::TKeyPress(void)
 	CancelGetKeyPress__25CVtConsoleInputController @ 32 NONAME R3UNUSED ; CVtConsoleInputController::CancelGetKeyPress(void)
-	Debug__15CVtcConsoleBase @ 33 NONAME R3UNUSED ; CVtcConsoleBase::Debug(void)
-	SetDebug__15CVtcConsoleBasei @ 34 NONAME R3UNUSED ; CVtcConsoleBase::SetDebug(int)
+	Debug__15CVtcConsoleBase @ 33 NONAME R3UNUSED ABSENT ; CVtcConsoleBase::Debug(void)
+	SetDebug__15CVtcConsoleBasei @ 34 NONAME R3UNUSED ABSENT ; CVtcConsoleBase::SetDebug(int)
 	ReadKeywordValuePair__15CVtcConsoleBaseR6TLex16R7TPtrC16T2 @ 35 NONAME R3UNUSED ; CVtcConsoleBase::ReadKeywordValuePair(TLex16 &, TPtrC16 &, TPtrC16 &)
+	ConstructL__15CVtcConsoleBaseRC7TDesC16i @ 36 NONAME R3UNUSED ; CVtcConsoleBase::ConstructL(TDesC16 const &, int)