libraries/ltkutils/src/w32crack.cpp
changeset 0 7f656887cf89
child 69 849a0b46c767
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ltkutils/src/w32crack.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,122 @@
+// w32crack.cpp
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <fshell/common.mmh>
+#include <fshell/ltkutils.h>
+#include <e32base.h>
+#include <fshell/iocli.h>
+#include <w32std.h>
+#include <fshell/ioutils.h>
+#include <fshell/memoryaccess.h>
+
+//
+// LtkUtils::W32CrackL
+// loads the autometric logging engine, dlogev.dll, into wserv
+// enabling Autometric to monitor events from within wserv - key/pointer events, text drawn to screen etc
+//
+EXPORT_C void LtkUtils::W32CrackL()
+	{
+#ifndef FSHELL_WSERV_SUPPORT
+	User::Leave(KErrNotSupported);
+#else
+
+	// Check if P&S says it's already enabled, if so no need to do anything
+	if (W32CrackIsEnabled()) return;
+
+	_LIT(KWsIniFile, "z:\\system\\data\\wsini.ini");
+	_LIT(KCWsIniFile,"c:\\system\\data\\wsini.ini");
+	_LIT(KLogEv, "LOG EV\r\n");
+	
+	// Open z file
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	RFile file;
+	User::LeaveIfError(file.Open(fs, KWsIniFile, EFileRead));
+	CleanupClosePushL(file);
+
+	TInt size;
+	User::LeaveIfError(file.Size(size));
+
+	RBuf8 buf;
+	buf.CreateL(size + KLogEv().Size());
+	CleanupClosePushL(buf);
+	User::LeaveIfError(file.Read(buf));
+	TPtrC16 wptr((TUint16*)buf.Ptr(), buf.Size()/2);
+	buf.Insert(2, TPtrC8((TUint8*)KLogEv().Ptr(), KLogEv().Size())); // +2 to get past the BOM
+	TInt err = KErrNone;
+	err = fs.MkDirAll(KCWsIniFile); // mkdir c:\system\data\ in case it is not exist
+	if((err != KErrNone) && (err != KErrAlreadyExists))
+		{
+		User::Leave(err);
+		}
+	User::LeaveIfError(file.Replace(fs, KCWsIniFile, EFileWrite));
+	User::LeaveIfError(file.Write(buf));
+	CleanupStack::PopAndDestroy(2, &file); // file, buf
+	
+	err = RMemoryAccess::LoadDriver();
+	if ((err != KErrNone) && (err != KErrAlreadyExists))
+		{
+		User::Leave(err);
+		}
+	
+	RMemoryAccess memAccess;
+	User::LeaveIfError(memAccess.Open());
+	CleanupClosePushL(memAccess);
+	
+	RWsSession ws;
+	User::LeaveIfError(ws.Connect(fs));
+	CleanupClosePushL(ws);
+
+#ifdef __WINS__
+	// On wins the binary isn't renamed
+	_LIT(KWservMatch, "wserv*.exe*");
+#else
+	_LIT(KWservMatch, "EwSrv.exe*");
+#endif
+	TFindProcess find(KWservMatch);
+	TFullName name;
+	User::LeaveIfError(find.Next(name));
+	
+	RProcess wservProc;
+	User::LeaveIfError(wservProc.Open(find));
+	if (wservProc.ExitType() != EExitPending)
+		{
+		// in case wserv kicks off the preferred implementation in a new process then kills itself
+		// (is one retry enough or should we be looping here?)
+		wservProc.Close();
+		User::LeaveIfError(find.Next(name));
+		User::LeaveIfError(wservProc.Open(find));
+		}
+	CleanupClosePushL(wservProc);
+	name = wservProc.FileName();
+	name[0] = 'c';
+	TPtrC8 narrowName = name.Collapse();
+	User::LeaveIfError(memAccess.InPlaceSetProcessFileName(wservProc, narrowName));
+
+	// Now tell wserv to reload its wsini.ini and enable logging
+	ws.LogCommand(RWsSession::ELoggingEnable);
+	ws.Flush();
+	
+	// cleanup
+	CleanupStack::PopAndDestroy(4, &fs);
+
+#endif // FSHELL_WSERV_SUPPORT
+	}
+
+EXPORT_C TBool LtkUtils::W32CrackIsEnabled()
+	{
+	TInt enabled = EFalse;
+	TInt err = RProperty::Get(KW32CrackCategory, KW32CrackKey, enabled);
+	return (err == KErrNone && enabled);
+	}