os/kernelhwsrv/kerneltest/e32test/dll/t_xxver2.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // e32test\dll\t_xxver2.cpp
    15 // Overview:
    16 // Test matching algorithm for DLL versions. Test aspects of DLL and EXE files.
    17 // API Information:
    18 // RLibrary
    19 // Details:
    20 // - This test makes use of 4 versions of a single DLL, and 15 EXEs which link
    21 // against it.  The EXEs all have different reqirements on which DLL versions
    22 // are acceptable
    23 // - Test that the correct version of linked libraries are used (Run for each
    24 // EXE and for the 16 combinations in which the 4 versions of the DLL can be
    25 // available.  The test is performed with each EXE run in sequence, and again
    26 // with all of them run at the same time)
    27 // - Test that the correct version of dynamically loaded libraries are used and
    28 // the libary exports are as expected.  (Run for each DLL version and for the
    29 // 16 combinations of DLL availability)
    30 // - Test that RLibrary::GetInfo and RLibrary::GetInfoFromHeader return the
    31 // expected data for all DLLs and EXEs
    32 // Platforms/Drives/Compatibility:
    33 // All.
    34 // Assumptions/Requirement/Pre-requisites:
    35 // Failures and causes:
    36 // Base Port information:
    37 // 
    38 //
    39 
    40 #include <e32uid.h>
    41 #include <e32test.h>
    42 #include <f32file.h>
    43 #include <d_ldrtst.h>
    44 #include <f32image.h>
    45 
    46 RTest test(_L("T_XXVER2"));
    47 RFs	gFs;
    48 CFileMan* gFileMan;
    49 RLdrTest LdrTest;
    50 
    51 TBuf<8> SourcePath = _S16("Z:\\img\\");
    52 
    53 
    54 TFileName KDestPath()
    55 	{
    56 	_LIT(KDestPath, "C:\\system\\bin\\ver");
    57 	_LIT(KDestPathSysBin, "C:\\sys\\bin\\ver");
    58 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
    59 		return KDestPathSysBin();
    60 	else
    61 		return KDestPath();
    62 	}
    63 
    64 _LIT(KDllName0, "t_ver2{00010000}.dll");
    65 _LIT(KDllName1, "t_ver2{00010001}.dll");
    66 _LIT(KDllName2, "t_ver2{00020000}.dll");
    67 _LIT(KDllName3, "t_ver2.dll");
    68 
    69 const TDesC* const DllArray[] =
    70 	{
    71 	&KDllName0(),
    72 	&KDllName1(),
    73 	&KDllName2(),
    74 	&KDllName3()
    75 	};
    76 
    77 const TInt KNumDlls = sizeof(DllArray)/sizeof(const TDesC* const);
    78 
    79 const TInt DllVersion[KNumDlls] =
    80 	{
    81 	0x00010000,
    82 	0x00010001,
    83 	0x00020000,
    84 	0x00030000
    85 	};
    86 
    87 const TInt KNumTestVersions = 7;
    88 const TInt TestDllVersion[KNumTestVersions] =
    89 	{
    90 	0x00000000,
    91 	0x00010000,
    92 	0x00010001,
    93 	0x00010002,
    94 	0x00020000,
    95 	0x00030000,
    96 	0x00040000
    97 	};
    98 
    99 _LIT(KExeName0, "t_xver2a.exe");	// request 1.0 work with any
   100 _LIT(KExeName1, "t_xver2b.exe");	// request 1.0 work with 2.0 but not 3.0
   101 _LIT(KExeName2, "t_xver2c.exe");	// request 1.0 don't work with 2.0
   102 _LIT(KExeName3, "t_xver2d.exe");	// request 1.1 work with 1.0 but not 2.0
   103 _LIT(KExeName4, "t_xver2e.exe");	// request 1.1 work with any
   104 _LIT(KExeName5, "t_xver2f.exe");	// request 1.1 work with 2.0, 3.0 but not with 1.0
   105 _LIT(KExeName6, "t_xver2g.exe");	// request 1.1 don't work with 2.0, 3.0 or 1.0
   106 _LIT(KExeName7, "t_xver2h.exe");	// request 1.1 work with 1.0 and 2.0 but not 3.0
   107 _LIT(KExeName8, "t_xver2i.exe");	// request 1.1 work with 2.0 but not 3.0 or 1.0
   108 _LIT(KExeName9, "t_xver2j.exe");	// request 2.0 only use 1.0 exports
   109 _LIT(KExeName10, "t_xver2k.exe");	// request 2.0 only use 1.0, 1.1 exports
   110 _LIT(KExeName11, "t_xver2l.exe");	// request 2.0 use 2.0 exports work on 3.0
   111 _LIT(KExeName12, "t_xver2m.exe");	// request 2.0 use 2.0 exports, don't work on 3.0
   112 _LIT(KExeName13, "t_xver2n.exe");	// request 3.0 use 1.0 exports only
   113 _LIT(KExeName14, "t_xver2o.exe");	// request 3.0 use all
   114 
   115 const TDesC* const ExeArray[] =
   116 	{
   117 	&KExeName0(),
   118 	&KExeName1(),
   119 	&KExeName2(),
   120 	&KExeName3(),
   121 	&KExeName4(),
   122 	&KExeName5(),
   123 	&KExeName6(),
   124 	&KExeName7(),
   125 	&KExeName8(),
   126 	&KExeName9(),
   127 	&KExeName10(),
   128 	&KExeName11(),
   129 	&KExeName12(),
   130 	&KExeName13(),
   131 	&KExeName14()
   132 	};
   133 
   134 const TInt KNumExes = sizeof(ExeArray)/sizeof(const TDesC* const);
   135 
   136 const TInt ResultArray[KNumExes<<KNumDlls] =
   137 	{
   138 //	DLLs Present			A	B	C	D	E	F	G	H	I	J	K	L	M	N	O
   139 // None
   140 							-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,
   141 // 1.0
   142 							0,	0,	0,	0,	0,	-1,	-1,	0,	-1,	-1,	-1,	-1,	-1,	-1,	-1,
   143 // 1.1
   144 							1,	1,	1,	1,	1,	1,	1,	1,	1,	-1,	-1,	-1,	-1,	-1,	-1,
   145 // 1.0, 1.1
   146 							1,	1,	1,	1,	1,	1,	1,	1,	1,	-1,	-1,	-1,	-1,	-1,	-1,
   147 // 2.0
   148 							2,	2,	-1,	-1,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	-1,	-1,
   149 // 2.0, 1.0
   150 							0,	0,	0,	0,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	-1,	-1,
   151 // 2.0, 1.1
   152 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	-1,	-1,
   153 // 2.0, 1.1, 1.0
   154 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	-1,	-1,
   155 // 3.0
   156 							3,	-1,	-1,	-1,	3,	3,	-1,	-1,	-1,	3,	3,	3,	-1,	3,	3,
   157 // 3.0, 1.0
   158 							0,	0,	0,	0,	3,	3,	-1,	0,	-1,	3,	3,	3,	-1,	3,	3,
   159 // 3.0, 1.1
   160 							1,	1,	1,	1,	1,	1,	1,	1,	1,	3,	3,	3,	-1,	3,	3,
   161 // 3.0, 1.1, 1.0
   162 							1,	1,	1,	1,	1,	1,	1,	1,	1,	3,	3,	3,	-1,	3,	3,
   163 // 3.0, 2.0
   164 							2,	2,	-1,	-1,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	3,	3,
   165 // 3.0, 2.0, 1.0
   166 							0,	0,	0,	0,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	3,	3,
   167 // 3.0, 2.0, 1.1
   168 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	3,	3,
   169 // 3.0, 2.0, 1.1, 1.0
   170 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	3,	3
   171 //
   172 	};
   173 
   174 const TInt ResultArray2[KNumTestVersions<<KNumDlls] =
   175 	{
   176 //	DLLs Present			0.0	1.0	1.1	1.2	2.0	3.0	4.0
   177 // None
   178 							-1,	-1,	-1,	-1,	-1,	-1,	-1,
   179 // 1.0
   180 							-1,	0,	-1,	-1,	-1,	-1,	-1,
   181 // 1.1
   182 							-1,	1,	1,	-1,	-1,	-1,	-1,
   183 // 1.0, 1.1
   184 							-1,	1,	1,	-1,	-1,	-1,	-1,
   185 // 2.0
   186 							-1,	-1,	-1,	-1,	2,	-1,	-1,
   187 // 2.0, 1.0
   188 							-1,	0,	-1,	-1,	2,	-1,	-1,
   189 // 2.0, 1.1
   190 							-1,	1,	1,	-1,	2,	-1,	-1,
   191 // 2.0, 1.1, 1.0
   192 							-1,	1,	1,	-1,	2,	-1,	-1,
   193 // 3.0
   194 							-1,	-1,	-1,	-1,	-1,	3,	-1,
   195 // 3.0, 1.0
   196 							-1,	0,	-1,	-1,	-1,	3,	-1,
   197 // 3.0, 1.1
   198 							-1,	1,	1,	-1,	-1,	3,	-1,
   199 // 3.0, 1.1, 1.0
   200 							-1,	1,	1,	-1,	-1,	3,	-1,
   201 // 3.0, 2.0
   202 							-1,	-1,	-1,	-1,	2,	3,	-1,
   203 // 3.0, 2.0, 1.0
   204 							-1,	0,	-1,	-1,	2,	3,	-1,
   205 // 3.0, 2.0, 1.1
   206 							-1,	1,	1,	-1,	2,	3,	-1,
   207 // 3.0, 2.0, 1.1, 1.0
   208 							-1,	1,	1,	-1,	2,	3,	-1
   209 //
   210 	};
   211 
   212 struct SExportInfo
   213 	{
   214 	TInt	iTotal;
   215 	TInt	iHoles;
   216 	TInt	iHole[1];
   217 	};
   218 
   219 const TInt Dll0ExportInfo[] = {19,0};
   220 const TInt Dll1ExportInfo[] = {29,0};
   221 const TInt Dll2ExportInfo[] = {39,4,2,3,23,24};
   222 const TInt Dll3ExportInfo[] = {59,6,2,3,4,23,24,39};
   223 
   224 const SExportInfo* const DllExportInfo[KNumDlls] =
   225 	{
   226 	(const SExportInfo*)Dll0ExportInfo,
   227 	(const SExportInfo*)Dll1ExportInfo,
   228 	(const SExportInfo*)Dll2ExportInfo,
   229 	(const SExportInfo*)Dll3ExportInfo
   230 	};
   231 
   232 void CheckExports(TInt aDllNum, RLibrary aLib)
   233 	{
   234 	test.Printf(_L("Testing exports for DLL %d\n"), aDllNum);
   235 	const TFileName& fn = aLib.FileName();
   236 	test.Printf(_L("Filename %S\n"), &fn);
   237 	const SExportInfo* e = DllExportInfo[aDllNum];
   238 	TAny* libcs = LdrTest.LibraryCodeSeg(aLib.Handle());
   239 	test.Printf(_L("Code seg @%08x\n"), libcs);
   240 	test(libcs != NULL);
   241 	TInt n = e->iTotal;
   242 	TInt nh = e->iHoles;
   243 	TInt ord;
   244 	for (ord=1; ord<=n+1; ++ord)
   245 		{
   246 		TLibraryFunction f = aLib.Lookup(ord);
   247 		test.Printf(_L("Ord %3d->%08x\n"), ord, f);
   248 		if (ord>n)
   249 			{
   250 			test(!f);
   251 			continue;
   252 			}
   253 		TInt i;
   254 		for (i=0; i<nh && e->iHole[i]!=ord; ++i) {}
   255 		if (i<nh)
   256 			test(!f);	// hole
   257 		else
   258 			test(f!=NULL);
   259 		TAny* cs = LdrTest.CodeSegFromAddr((TLinAddr)f);
   260 		test(f ? (cs==libcs) : !cs);
   261 		}
   262 	}
   263 
   264 void CreateAndPopulateDir(TUint aMask)
   265 	{
   266 	test.Printf(_L("CreateAndPopulateDir %d\n"), aMask);
   267 	TFileName fn = KDestPath();
   268 	fn.AppendNumFixedWidth(aMask, EDecimal, 2);
   269 	fn.Append('\\');
   270 	TInt r = gFs.MkDirAll(fn);
   271 	test.Printf(_L("MkDir %S->%d\n"), &fn, r);
   272 	test(r==KErrNone || r==KErrAlreadyExists);
   273 	TFileName fn2 = fn;
   274 	fn2.Append(_L("*.*"));
   275 	TTime now;
   276 	now.HomeTime();
   277 	r = gFileMan->Attribs(fn2, 0, KEntryAttReadOnly|KEntryAttHidden|KEntryAttSystem|KEntryAttArchive, now);
   278 	test.Printf(_L("Attribs %S->%d\n"), &fn2, r);
   279 	r = gFileMan->Delete(fn2);
   280 	test.Printf(_L("Delete %S->%d\n"), &fn2, r);
   281 	TInt n = 0;
   282 	for (; aMask; aMask>>=1, ++n)
   283 		{
   284 		if (!(aMask & 1))
   285 			continue;
   286 		fn2 = fn;
   287 		fn2.Append(*DllArray[n]);
   288 		TFileName src = SourcePath;
   289 		src.Append(*DllArray[n]);
   290 		r = gFileMan->Copy(src, fn2);
   291 		test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
   292 		test(r == KErrNone);
   293 		}
   294 	for (n=0; n<KNumExes; ++n)
   295 		{
   296 		fn2 = fn;
   297 		fn2.Append(*ExeArray[n]);
   298 		TFileName src = SourcePath;
   299 		src.Append(*ExeArray[n]);
   300 		r = gFileMan->Copy(src, fn2);
   301 		test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
   302 		test(r == KErrNone);
   303 		}
   304 	}
   305 
   306 void RunExe(TUint aMask, TInt aExeNum)
   307 	{
   308 	test.Printf(_L("RunExe mask %d exenum %d\n"), aMask, aExeNum);
   309 	RProcess p;
   310 	TRequestStatus s;
   311 	TFileName fn = KDestPath();
   312 	fn.AppendNumFixedWidth(aMask, EDecimal, 2);
   313 	fn.Append('\\');
   314 	fn.Append(*ExeArray[aExeNum]);
   315 	TInt r = p.Create(fn, KNullDesC);
   316 	test.Printf(_L("Create %S->%d\n"), &fn, r);
   317 	TInt rix = aExeNum + KNumExes*TInt(aMask);
   318 	TInt expected = ResultArray[rix];
   319 	test.Printf(_L("RunExe expected %d\n"), expected);
   320 	if (expected<0)
   321 		{
   322 		test(r<0);
   323 		return;
   324 		}
   325 	p.Logon(s);
   326 	p.Resume();
   327 	User::WaitForRequest(s);
   328 	if (p.ExitType()!=EExitKill)
   329 		{
   330 		TInt et = p.ExitType();
   331 		TInt er = p.ExitReason();
   332 		const TDesC& ec = p.ExitCategory();
   333 		test.Printf(_L("Exit %d,%d,%S\n"), et, er, &ec);
   334 		test(0);
   335 		}
   336 	CLOSE_AND_WAIT(p);
   337 	test.Printf(_L("Return code %08x\n"), s.Int());
   338 	test(s.Int() == DllVersion[expected]);
   339 	}
   340 
   341 void RunExes(TUint aMask)
   342 	{
   343 	test.Printf(_L("RunExes mask %d\n"), aMask);
   344 	RProcess p[KNumExes];
   345 	TRequestStatus s[KNumExes];
   346 	TInt xn;
   347 	for (xn=0; xn<KNumExes; ++xn)
   348 		{
   349 		TFileName fn = KDestPath();
   350 		fn.AppendNumFixedWidth(aMask, EDecimal, 2);
   351 		fn.Append('\\');
   352 		fn.Append(*ExeArray[xn]);
   353 		TInt r = p[xn].Create(fn, KNullDesC);
   354 		test.Printf(_L("Create %S->%d\n"), &fn, r);
   355 		TInt rix = xn + KNumExes*TInt(aMask);
   356 		TInt expected = ResultArray[rix];
   357 		test.Printf(_L("RunExe expected %d\n"), expected);
   358 		if (expected<0)
   359 			{
   360 			test(r<0);
   361 			continue;
   362 			}
   363 		p[xn].Logon(s[xn]);
   364 		}
   365 	for (xn=0; xn<KNumExes; ++xn)
   366 		{
   367 		TInt rix = xn + KNumExes*TInt(aMask);
   368 		TInt expected = ResultArray[rix];
   369 		if (expected<0)
   370 			continue;
   371 		p[xn].Resume();
   372 		}
   373 	for (xn=0; xn<KNumExes; ++xn)
   374 		{
   375 		TInt rix = xn + KNumExes*TInt(aMask);
   376 		TInt expected = ResultArray[rix];
   377 		if (expected<0)
   378 			continue;
   379 		User::WaitForRequest(s[xn]);
   380 		if (p[xn].ExitType()!=EExitKill)
   381 			{
   382 			TInt et = p[xn].ExitType();
   383 			TInt er = p[xn].ExitReason();
   384 			const TDesC& ec = p[xn].ExitCategory();
   385 			test.Printf(_L("Exit %d,%d,%S\n"), et, er, &ec);
   386 			test(0);
   387 			}
   388 		CLOSE_AND_WAIT(p[xn]);
   389 		test.Printf(_L("Return code %08x\n"), s[xn].Int());
   390 		test(s[xn].Int() == DllVersion[expected]);
   391 		}
   392 	}
   393 
   394 void TestDynamic(TUint aMask, TInt aTN)
   395 	{
   396 	TUint32 ver = TestDllVersion[aTN];
   397 	TInt rix = aTN + KNumTestVersions*TInt(aMask);
   398 	TInt expected = ResultArray2[rix];
   399 	test.Printf(_L("ReqVer %08x Expected %d\n"), ver, expected);
   400 	TFileName path = KDestPath();
   401 	path.AppendNumFixedWidth(aMask, EDecimal, 2);
   402 	TFileName fn = path;
   403 	fn.Append(_L("\\T_VER2.DLL"));
   404 	RLibrary l;
   405 	TInt r = l.Load(fn, KNullDesC, TUidType(), ver);
   406 	test.Printf(_L("Load %S returns %d\n"), &fn, r);
   407 	if (expected<0)
   408 		{
   409 		test(r<0);
   410 		return;
   411 		}
   412 	TLibraryFunction f = l.Lookup(1);
   413 	test(f != 0);
   414 	TInt result = (*f)();
   415 	test.Printf(_L("Ord 1 returns %08x\n"), result);
   416 	test(result == DllVersion[expected]);
   417 	l.Close();
   418 	r = l.Load(_L("T_VER2.DLL"), path, TUidType(), ver);
   419 	test.Printf(_L("Load T_VER2.DLL path %S returns %d\n"), &path, r);
   420 	if (expected<0)
   421 		{
   422 		test(r<0);
   423 		return;
   424 		}
   425 	f = l.Lookup(1);
   426 	test(f != 0);
   427 	result = (*f)();
   428 	test.Printf(_L("Ord 1 returns %08x\n"), result);
   429 	test(result == DllVersion[expected]);
   430 	CheckExports(expected, l);
   431 	l.Close();
   432 	}
   433 
   434 void TestLibraryInfo(TInt aN)
   435 	{
   436 	TFileName fn;
   437 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
   438 		fn = _S16("C:\\sys\\bin\\ver15\\");
   439 	else
   440 		fn = _S16("C:\\system\\bin\\ver15\\");
   441 	fn += *DllArray[aN];
   442 	test.Printf(_L("Getting info for %S\n"), &fn);
   443 	TBool formHeader=EFalse;
   444 	for(;;)
   445 		{
   446 		RLibrary::TInfoV2 info;
   447 		TPckg<RLibrary::TInfoV2> infoBuf(info);
   448 		TInt r;
   449 		if(formHeader)
   450 			{
   451 			TUint8* buf;
   452 
   453 			RFs fs;
   454 			test(fs.Connect()==KErrNone);
   455 			RFile file;
   456 			test((r=file.Open(fs,fn,0))==KErrNone);
   457 			TInt size;
   458 			test((r=file.Size(size))==KErrNone);
   459 			if(size>RLibrary::KRequiredImageHeaderSize)
   460 				size=RLibrary::KRequiredImageHeaderSize;
   461 			buf=new TUint8[size];
   462 			test(buf!=0);
   463 			TPtr8 header(buf,size);
   464 			test((r=file.Read(header))==KErrNone);
   465 			file.Close();
   466 			fs.Close();
   467 
   468 			r = RLibrary::GetInfoFromHeader(header, infoBuf);
   469 			test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
   470 
   471 			delete buf;
   472 			}
   473 		else
   474 			{
   475 			r = RLibrary::GetInfo(fn, infoBuf);
   476 			test.Printf(_L("GetInfo returns %d\n"), r);
   477 			}
   478 
   479 		test(r==KErrNone);
   480 		const TUint32* uid = (const TUint32*)&info.iUids;
   481 		test.Printf(_L("VER  %08x\n"), info.iModuleVersion);
   482 		test.Printf(_L("UID1 %08x\n"), uid[0]);
   483 		test.Printf(_L("UID2 %08x\n"), uid[1]);
   484 		test.Printf(_L("UID3 %08x\n"), uid[2]);
   485 		test.Printf(_L("SID  %08x\n"), (TUint32)info.iSecurityInfo.iSecureId);
   486 		test.Printf(_L("VID  %08x\n"), (TUint32)info.iSecurityInfo.iVendorId);
   487 		test.Printf(_L("CAP0 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[0]);
   488 		test.Printf(_L("CAP1 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[1]);
   489 		TUint32 v = (TUint32)DllVersion[aN];
   490 		test(info.iModuleVersion == v);
   491 		test(uid[0] == (TUint32)KDynamicLibraryUidValue);
   492 		test(uid[2] == (TUint32)0x40abcdef);
   493 		TUint32 xsid = ((v>>16)<<4)|(v&0x0f)|0x89abcd00u;
   494 		test(info.iSecurityInfo.iSecureId == xsid);
   495 		TUint32 xvid = 0x01234500+(xsid&0xff);
   496 		test(info.iSecurityInfo.iVendorId == xvid);
   497 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[0]==0x0002aaab);
   498 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[1]==0);
   499 		if(formHeader)
   500 #if defined(__ARMCC__)
   501 			test(info.iHardwareFloatingPoint == EFpTypeVFPv2);
   502 #else
   503 			test(info.iHardwareFloatingPoint == EFpTypeNone);
   504 #endif
   505 
   506 		if(formHeader)
   507 			break;
   508 		formHeader = ETrue;
   509 		}
   510 	}
   511 
   512 void TestExeInfo(TInt aN)
   513 	{
   514 	TFileName fn;
   515 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
   516 		fn = _S16("C:\\sys\\bin\\ver15\\");
   517 	else
   518 		fn = _S16("C:\\system\\bin\\ver15\\");
   519 	fn += *ExeArray[aN];
   520 	test.Printf(_L("Getting info for %S\n"), &fn);
   521 	TBool formHeader=EFalse;
   522 	for(;;)
   523 		{
   524 		RLibrary::TInfoV2 info;
   525 		TPckg<RLibrary::TInfoV2> infoBuf(info);
   526 		TInt r;
   527 		if(formHeader)
   528 			{
   529 			TUint8* buf;
   530 
   531 			RFs fs;
   532 			test(fs.Connect()==KErrNone);
   533 			RFile file;
   534 			test((r=file.Open(fs,fn,0))==KErrNone);
   535 			TInt size;
   536 			test((r=file.Size(size))==KErrNone);
   537 			if(size>RLibrary::KRequiredImageHeaderSize)
   538 				size=RLibrary::KRequiredImageHeaderSize;
   539 			buf=new TUint8[size];
   540 			test(buf!=0);
   541 			TPtr8 header(buf,size);
   542 			test((r=file.Read(header))==KErrNone);
   543 			file.Close();
   544 			fs.Close();
   545 
   546 			r = RLibrary::GetInfoFromHeader(header, infoBuf);
   547 			test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
   548 
   549 			delete buf;
   550 			}
   551 		else
   552 			{
   553 			r = RLibrary::GetInfo(fn, infoBuf);
   554 			test.Printf(_L("GetInfo returns %d\n"), r);
   555 			}
   556 
   557 		test(r==KErrNone);
   558 		const TUint32* uid = (const TUint32*)&info.iUids;
   559 		test.Printf(_L("VER  %08x\n"), info.iModuleVersion);
   560 		test.Printf(_L("UID1 %08x\n"), uid[0]);
   561 		test.Printf(_L("UID2 %08x\n"), uid[1]);
   562 		test.Printf(_L("UID3 %08x\n"), uid[2]);
   563 		test.Printf(_L("SID  %08x\n"), (TUint32)info.iSecurityInfo.iSecureId);
   564 		test.Printf(_L("VID  %08x\n"), (TUint32)info.iSecurityInfo.iVendorId);
   565 		test.Printf(_L("CAP0 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[0]);
   566 		test.Printf(_L("CAP1 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[1]);
   567 	#if defined(__EABI__) && !defined(__X86__)
   568 		test(info.iModuleVersion == 0x000a0000);
   569 	#else
   570 		test(info.iModuleVersion == 0x00010000);
   571 	#endif
   572 		test(uid[0] == (TUint32)KExecutableImageUidValue);
   573 		TUint32 xuid3 = 0x40abcd61u + aN;
   574 		test(uid[2] == xuid3);
   575 		test(info.iSecurityInfo.iSecureId == xuid3);
   576 		TUint32 xvid = 0x01234500+(xuid3&0xff);
   577 		test(info.iSecurityInfo.iVendorId == xvid);
   578 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[0]==0x0002aaab);
   579 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[1]==0);
   580 		if(formHeader)
   581 			test(info.iHardwareFloatingPoint == EFpTypeNone);
   582 
   583 		if(formHeader)
   584 			break;
   585 		formHeader = ETrue;
   586 		}
   587 	}
   588 	
   589 void TestCompression(void)
   590 	{
   591 	
   592 	// Check target directory
   593 	TFileName fn;
   594 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
   595 		fn = _S16("c:\\sys\\bin\\");
   596 	else
   597 		fn = _S16("c:\\system\\bin\\");
   598 	
   599 	TInt r = gFs.MkDirAll(fn);
   600 	test.Printf(_L("MkDir %S->%d\n"), &fn, r);
   601 	test(r==KErrNone || r==KErrAlreadyExists);
   602 	
   603 	// Make copy from t_xxver2.exe to t_xxvercomp.exe 
   604 	fn.Append(_L("t_xxvercomp.exe"));
   605 	
   606 	TFileName fn2 = fn;
   607 	TTime now;
   608 	now.HomeTime();
   609 	r = gFileMan->Attribs(fn2, 0, KEntryAttReadOnly|KEntryAttHidden|KEntryAttSystem|KEntryAttArchive, now);
   610 	test.Printf(_L("Attribs %S->%d\n"), &fn2, r);
   611 	r = gFileMan->Delete(fn2);
   612 	test.Printf(_L("Delete %S->%d\n"), &fn2, r);
   613 
   614 	fn2 = fn;
   615 	TFileName src = SourcePath;
   616 	src.Append(*ExeArray[0]);
   617 	r = gFileMan->Copy(src, fn2);
   618 	test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
   619 	test(r == KErrNone);
   620 	
   621 	
   622 	// Check RLibrary::GetInfoFromHeader  on a correct executable
   623 	test.Printf(_L("fn:%S\n"), &fn);
   624 	
   625 	RLibrary::TInfoV2 info;
   626 	TPckg<RLibrary::TInfoV2> infoBuf(info);
   627 		
   628 	TUint8* buf;
   629 
   630 	RFs fs;
   631 	test(fs.Connect()==KErrNone);
   632 	RFile file;
   633 	r=file.Open(fs,fn,0);
   634 	test.Printf(_L("file.Open returns %d\n"), r);
   635 	test(r==KErrNone);
   636 	TInt size;
   637 	test((r=file.Size(size))==KErrNone);
   638 	if(size>RLibrary::KRequiredImageHeaderSize)
   639 		size=RLibrary::KRequiredImageHeaderSize;
   640 	buf=new TUint8[size];
   641 	test(buf!=0);
   642 	TPtr8 header(buf,size);
   643 	test((r=file.Read(header))==KErrNone);
   644 	file.Close();
   645 	
   646 
   647 	r = RLibrary::GetInfoFromHeader(header, infoBuf);
   648 	test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
   649 	test(r==KErrNone);
   650 
   651 
   652 	test.Printf(_L("Write invalid compression info into the header.\n"));
   653 	E32ImageHeader* e32Header = (E32ImageHeader*) buf;
   654 	
   655 	e32Header->iCompressionType = 0x00000001;
   656 	test((r=file.Open(fs,fn,EFileWrite))==KErrNone);
   657 	r=file.Write(header);
   658 	test.Printf(_L("file.Write returns %d\n"), r);
   659 	test(r==KErrNone);
   660 	file.Close();
   661 
   662 	// Check RLibrary::GetInfoFromHeader on a wrong compression method.
   663 	
   664 	r = RLibrary::GetInfoFromHeader(header, infoBuf);
   665 	test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
   666 	test(r==KErrCorrupt);
   667 
   668 
   669 	fs.Close();
   670 	delete buf;
   671 	
   672 	
   673 	
   674 	} // End of TestCompression()
   675 
   676 TInt E32Main()
   677 	{
   678 	test.Title();
   679 
   680 	// Turn off evil lazy dll unloading
   681 	RLoader l;
   682 	test(l.Connect()==KErrNone);
   683 	test(l.CancelLazyDllUnload()==KErrNone);
   684 	l.Close();
   685 
   686 	TBuf<256> cmdline;
   687 	User::CommandLine(cmdline);
   688 	TLex lex(cmdline);
   689 	TInt options[8];
   690 	TInt i;
   691 	memclr(options, sizeof(options));
   692 	for (i=0; i<8; ++i)
   693 		{
   694 		lex.SkipSpace();
   695 		if (lex.Eos())
   696 			break;
   697 		lex.Val(options[i]);
   698 		}
   699 	TUint tm = 0xffffffffu;
   700 	if (options[0])
   701 		tm = (TUint)options[0];
   702 
   703 	test.Start(_L("Create cleanup stack"));
   704 	CTrapCleanup* ct = CTrapCleanup::New();
   705 	test(ct!=0);
   706 	test.Next(_L("Connect to file server"));
   707 	TInt r = gFs.Connect();
   708 	test(r==KErrNone);
   709 	test.Next(_L("Create CFileMan"));
   710 	TRAP(r, gFileMan=CFileMan::NewL(gFs));
   711 	test(r==KErrNone);
   712 	test.Next(_L("Connect to test driver"));
   713 	r = User::LoadLogicalDevice(_L("d_ldrtst"));
   714 	test(r==KErrNone || r==KErrAlreadyExists);
   715 	r = LdrTest.Open();
   716 	test(r==KErrNone);
   717 	TFileName fn(RProcess().FileName());
   718 	test.Printf(_L("Process file name = %S\n"), &fn);
   719 	SourcePath[0] = fn[0];	// use same drive as this EXE
   720 
   721 	TUint mask;
   722 	TUint nmasks = 1u << KNumDlls;
   723 	for (mask=0; mask<nmasks; ++mask)
   724 		{
   725 		CreateAndPopulateDir(mask);
   726 		if (!(tm&1))
   727 			continue;
   728 		TInt n;
   729 		for (n=0; n<KNumExes; ++n)
   730 			{
   731 			RunExe(mask, n);
   732 			}
   733 		RunExes(mask);
   734 		}
   735 
   736 	if (tm & 2)
   737 		{
   738 		test.Next(_L("Test dynamic loading by version"));
   739 		for (mask=0; mask<nmasks; ++mask)
   740 			{
   741 			TInt n;
   742 			for (n=0; n<KNumTestVersions; ++n)
   743 				{
   744 				TestDynamic(mask, n);
   745 				}
   746 			}
   747 		}
   748 
   749 	if (tm & 4)
   750 		{
   751 		test.Next(_L("Test get library info"));
   752 		TInt n;
   753 		for (n=0; n<KNumDlls; ++n)
   754 			{
   755 			TestLibraryInfo(n);
   756 			}
   757 		for (n=0; n<KNumExes; ++n)
   758 			{
   759 			TestExeInfo(n);
   760 			}
   761 		}
   762 
   763 	if( tm & 8)
   764 		{
   765 		TestCompression();
   766 		}
   767 	
   768 	delete gFileMan;
   769 	gFs.Close();
   770 	delete ct;
   771 	LdrTest.Close();
   772 	test.End();
   773 	return KErrNone;
   774 	}
   775