Update contrib.
1 // Copyright (c) 2008-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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // f32test\loader\security\t_fuzzldr.cpp
18 #define __E32TEST_EXTENSION__
28 const TInt KFuzzImages = 5;
29 const TInt KRandomFieldIterations = 8;
30 const TTimeIntervalMicroSeconds32 KDllTimeout = 10 * 1000000;
32 #define FUZZFIELD(OBJ, NAME) { (const TText*)(L ## #OBJ L"." L ## #NAME), sizeof(((OBJ*)8)->NAME), _FOFF(OBJ, NAME) }
33 #define DUMBFIELD(NAME, SIZE, OFFSET) { (const TText*)L ## NAME, SIZE, OFFSET }
34 #define FUZZEND { NULL, 0, 0 }
43 const SFuzzField HeaderFields[] =
45 FUZZFIELD(E32ImageHeaderV, iUid1),
46 FUZZFIELD(E32ImageHeaderV, iUid2),
47 FUZZFIELD(E32ImageHeaderV, iUid3),
48 FUZZFIELD(E32ImageHeaderV, iUidChecksum),
49 FUZZFIELD(E32ImageHeaderV, iSignature),
50 FUZZFIELD(E32ImageHeaderV, iHeaderCrc),
51 FUZZFIELD(E32ImageHeaderV, iModuleVersion),
52 FUZZFIELD(E32ImageHeaderV, iCompressionType),
53 FUZZFIELD(E32ImageHeaderV, iToolsVersion.iMajor),
54 FUZZFIELD(E32ImageHeaderV, iToolsVersion.iMinor),
55 FUZZFIELD(E32ImageHeaderV, iToolsVersion.iBuild),
56 FUZZFIELD(E32ImageHeaderV, iTimeLo),
57 FUZZFIELD(E32ImageHeaderV, iTimeHi),
58 FUZZFIELD(E32ImageHeaderV, iFlags),
59 FUZZFIELD(E32ImageHeaderV, iCodeSize),
60 FUZZFIELD(E32ImageHeaderV, iDataSize),
61 FUZZFIELD(E32ImageHeaderV, iHeapSizeMin),
62 FUZZFIELD(E32ImageHeaderV, iHeapSizeMax),
63 FUZZFIELD(E32ImageHeaderV, iStackSize),
64 FUZZFIELD(E32ImageHeaderV, iBssSize),
65 FUZZFIELD(E32ImageHeaderV, iEntryPoint),
66 FUZZFIELD(E32ImageHeaderV, iCodeBase),
67 FUZZFIELD(E32ImageHeaderV, iDataBase),
68 FUZZFIELD(E32ImageHeaderV, iDllRefTableCount),
69 FUZZFIELD(E32ImageHeaderV, iExportDirOffset),
70 FUZZFIELD(E32ImageHeaderV, iExportDirCount),
71 FUZZFIELD(E32ImageHeaderV, iTextSize),
72 FUZZFIELD(E32ImageHeaderV, iCodeOffset),
73 FUZZFIELD(E32ImageHeaderV, iDataOffset),
74 FUZZFIELD(E32ImageHeaderV, iImportOffset),
75 FUZZFIELD(E32ImageHeaderV, iCodeRelocOffset),
76 FUZZFIELD(E32ImageHeaderV, iDataRelocOffset),
77 FUZZFIELD(E32ImageHeaderV, iProcessPriority),
78 FUZZFIELD(E32ImageHeaderV, iCpuIdentifier),
79 FUZZFIELD(E32ImageHeaderV, iUncompressedSize),
80 FUZZFIELD(E32ImageHeaderV, iS.iSecureId),
81 FUZZFIELD(E32ImageHeaderV, iS.iVendorId),
82 FUZZFIELD(E32ImageHeaderV, iS.iCaps.iCaps[0]),
83 FUZZFIELD(E32ImageHeaderV, iS.iCaps.iCaps[1]),
84 FUZZFIELD(E32ImageHeaderV, iExceptionDescriptor),
85 FUZZFIELD(E32ImageHeaderV, iSpare2),
86 FUZZFIELD(E32ImageHeaderV, iExportDescSize),
87 FUZZFIELD(E32ImageHeaderV, iExportDescType),
88 FUZZFIELD(E32ImageHeaderV, iExportDesc[0]),
92 const SFuzzField ImportSectionFields[] =
94 FUZZFIELD(E32ImportSection, iSize),
98 const SFuzzField ImportBlockFields[] =
100 FUZZFIELD(E32ImportBlock, iOffsetOfDllName), // we should fuzz the string also
101 FUZZFIELD(E32ImportBlock, iNumberOfImports),
105 const SFuzzField ImportEntryFields[] =
107 DUMBFIELD("import", 4, 0),
111 const SFuzzField RelocSectionFields[] =
113 FUZZFIELD(E32RelocSection, iSize),
114 FUZZFIELD(E32RelocSection, iNumberOfRelocs),
118 const SFuzzField RelocBlockFields[] =
120 FUZZFIELD(E32RelocBlock, iPageOffset),
121 FUZZFIELD(E32RelocBlock, iBlockSize),
125 const SFuzzField RelocEntryFields[] =
127 DUMBFIELD("reloc", 2, 0),
131 const SFuzzField ExportEntryFields[] =
133 DUMBFIELD("export", 4, 0),
137 const SFuzzField CompressedDataFields[] =
139 DUMBFIELD("data1", 4, 0),
140 DUMBFIELD("data2", 4, 4),
141 DUMBFIELD("data3", 4, 16),
142 DUMBFIELD("data4", 4, 64),
143 DUMBFIELD("data5", 4, 256),
144 DUMBFIELD("data6", 4, 1024),
145 DUMBFIELD("data7", 4, 4096),
149 // Values to try for different sizes, signed here but can be interpreted as either
150 // each will also try the smaller sizes' values
151 const TInt8 Values8[] = { KMinTInt8, -100, -10, -2, -1, 0, 1, 2, 10, 100, KMaxTInt8 };
152 const TInt Values8Count = sizeof(Values8)/sizeof(TInt8);
153 const TInt16 Values16[] = { KMinTInt16, -10000, -256, -255, 128, 255, 256, 10000, KMaxTInt16 };
154 const TInt Values16Count = sizeof(Values16)/sizeof(TInt16);
155 const TInt32 Values32[] = { KMinTInt32, -1000000000, -65536, -65535, 32768, 65535, 65536, 268435455, 268435456, 1000000000, KMaxTInt32 };
156 const TInt Values32Count = sizeof(Values32)/sizeof(TInt32);
157 const TInt ValuesCount[] = { 0, Values8Count, Values8Count+Values16Count, 0, Values8Count+Values16Count+Values32Count };
158 const TInt Offsets[] = { 1, 2, 4, 16, -1, -2, -4, -16 };
159 const TInt OffsetsCount = sizeof(Offsets)/sizeof(TInt);
161 // Regular boring definitions and stuff
163 RTest test(_L("T_FUZZLDR"));
167 _LIT(KOrigDir, "Z:\\sys\\bin\\");
168 _LIT(KSysBin, ":\\sys\\bin\\");
169 _LIT(KSysHash, ":\\sys\\hash\\");
170 _LIT(KImageName, "fuzzv");
171 _LIT(KExeExt, ".exe");
172 _LIT(KDllExt, ".dll");
173 _LIT(KMyself, "t_fuzzldr");
174 _LIT(KSlaveArg, "-l ");
185 E32ImageHeaderV* Header;
186 E32ImageHeaderV* CleanHeader;
191 TUint8* CleanFileData;
192 TPtr8 CleanFileDes(CleanFileData, 0);
194 TPtr8 FileDes(FileData, 0);
196 TChar Drive = '?', InternalDrive = '?', RemovableDrive = '?';
199 TBool Forever = EFalse;
201 typedef void (*TFieldFuzzer)(const SFuzzField*, TInt);
228 TUint32 Rand(TUint32 aLimit)
230 TUint64 temp = (TUint64)Rand() * (TUint64)aLimit;
231 return (TUint32)(temp>>32);
235 void PrepareName(TInt aNum, TBool aDll)
238 Original += KImageName;
239 Original.AppendNum(aNum);
240 Original += aDll ? KDllExt : KExeExt;
242 Current.Append(Drive);
244 Current += KImageName;
245 Current.AppendNum(aNum);
246 Current += aDll ? KDllExt : KExeExt;
249 Hash.AppendNum(aNum);
250 Hash += aDll ? KDllExt : KExeExt;
254 void PrepareProvidedName()
257 Original += Provided;
259 Current.Append(Drive);
269 Mem::Copy(FileData, CleanFileData, FileSize);
275 test_KErrNone(File.Open(TheFs, Original, EFileRead));
276 test_KErrNone(File.Size(FileSize));
277 OutFileSize = FileSize;
278 CleanFileData = new TUint8[FileSize];
279 test_NotNull(CleanFileData);
280 FileData = new TUint8[FileSize];
281 EndOfFile = FileData + FileSize;
282 test_NotNull(FileData);
283 CleanFileDes.Set(CleanFileData, 0, FileSize);
284 test_KErrNone(File.Read(CleanFileDes));
286 Header = (E32ImageHeaderV*)FileData;
287 CleanHeader = (E32ImageHeaderV*)CleanFileData;
288 FileDes.Set(FileData, FileSize, FileSize);
290 test(CleanHeader->iUid1==(TUint32)KExecutableImageUidValue || CleanHeader->iUid1==(TUint32)KDynamicLibraryUidValue);
291 LoadDll = CleanHeader->iUid1==(TUint32)KDynamicLibraryUidValue;
298 delete[] CleanFileData;
302 void RecalcChecksums()
304 if (Header->iUidChecksum == CleanHeader->iUidChecksum)
306 TUidType uids = *(const TUidType*)Header;
307 TCheckedUid chkuid(uids);
308 const TUint32* pChkUid = (const TUint32*)&chkuid;
309 Header->iUidChecksum = pChkUid[3];
311 if (Header->iHeaderCrc == CleanHeader->iHeaderCrc)
313 Header->iHeaderCrc = KImageCrcInitialiser;
315 Mem::Crc32(crc, Header, sizeof(E32ImageHeaderV));
316 Header->iHeaderCrc = crc;
324 test_KErrNone(File.Replace(TheFs, Current, EFileWrite));
325 test_KErrNone(File.Write(FileDes, OutFileSize));
326 test_KErrNone(File.Flush());
328 if (Drive == RemovableDrive)
330 TPtrC8 data(FileData, OutFileSize);
332 Hasher->Update(data);
333 TBuf8<SHA1_HASH> hashVal = Hasher->Final();
334 test_KErrNone(File.Replace(TheFs, Hash, EFileWrite));
335 test_KErrNone(File.Write(hashVal));
336 test_KErrNone(File.Flush());
344 args.Copy(KSlaveArg);
345 args.Append(Current);
346 test_KErrNone(p.Create(KMyself, args));
347 TRequestStatus logon, rendez, timeout;
349 p.Rendezvous(rendez);
351 User::WaitForRequest(rendez);
352 test(rendez==KErrNone);
353 Timer.After(timeout, KDllTimeout);
354 User::WaitForRequest(logon, timeout);
355 if (logon == KRequestPending)
358 User::WaitForRequest(logon);
363 User::WaitForRequest(timeout);
366 // we don't check the return code as passing it back makes the log output
367 // super spammy with KPANIC on - it prints for every nonzero return code.
368 if (Verbose) test.Printf(_L("\n"));
372 r = p.Create(Current, KNullDesC);
375 if (Verbose) test.Printf(_L("=> %d\n"), r);
381 template <typename T> void SetFieldTo(const SFuzzField* aField, T aSetTo, SetMode aMode)
383 T* field = (T*)(Target + aField->offset);
384 if ((TUint8*)field >= EndOfFile)
386 if (Verbose) test.Printf(_L("skipping, eof "));
389 if (aMode == ESetOffset)
391 else if (aMode == ESetRandom)
393 else if (aMode == ESetXor)
396 if (Verbose) test.Printf(_L("%d "), aSetTo);
400 void SetField(const SFuzzField* aField, TInt aValue, ValueMode aMode)
402 if (aMode < EValList)
407 SetFieldTo<TInt8>(aField, aValue, (SetMode)aMode);
410 SetFieldTo<TInt16>(aField, aValue, (SetMode)aMode);
413 SetFieldTo<TInt32>(aField, aValue, (SetMode)aMode);
417 else if (aMode == EValList)
422 SetFieldTo<TInt8>(aField, Values8[aValue], ESetLiteral);
425 if (aValue < ValuesCount[1])
426 SetFieldTo<TInt16>(aField, Values8[aValue], ESetLiteral);
428 SetFieldTo<TInt16>(aField, Values16[aValue-ValuesCount[1]], ESetLiteral);
431 if (aValue < ValuesCount[1])
432 SetFieldTo<TInt32>(aField, Values8[aValue], ESetLiteral);
433 else if (aValue < ValuesCount[2])
434 SetFieldTo<TInt32>(aField, Values16[aValue-ValuesCount[1]], ESetLiteral);
436 SetFieldTo<TInt32>(aField, Values32[aValue-ValuesCount[2]], ESetLiteral);
440 else if (aMode == EValOffsetList)
445 SetFieldTo<TInt8>(aField, Offsets[aValue], ESetOffset);
448 SetFieldTo<TInt16>(aField, Offsets[aValue], ESetOffset);
451 SetFieldTo<TInt32>(aField, Offsets[aValue], ESetOffset);
458 void FuzzFieldsDeterministically(const SFuzzField* aFields, TInt aOffset)
460 Target = FileData + aOffset;
463 while (aFields[++f].name)
465 test.Printf(_L("FIELD: %s ...\n"), aFields[f].name);
467 if (Verbose) test.Next(_L("Using preset values"));
468 for (v = 0; v < ValuesCount[aFields[f].size]; ++v)
471 SetField(&aFields[f], v, EValList);
474 if (Verbose) test.Next(_L("Using preset offsets"));
475 for (v = 0; v < OffsetsCount; ++v)
478 SetField(&aFields[f], v, EValOffsetList);
481 if (Verbose) test.Next(_L("Flipping single bits"));
482 for (v = 0; v < aFields[f].size*8; ++v)
485 SetField(&aFields[f], 1<<v, EValXor);
488 if (Verbose) test.Next(_L("Inverting"));
490 SetField(&aFields[f], 0xffffffffu, EValXor);
493 // things that are offsets all go below, pointless on
495 if (aFields[f].size == 4)
497 if (Verbose) test.Next(_L("Using filesize relative values"));
498 for (v = FileSize-4; v <= FileSize+4; ++v)
501 SetField(&aFields[f], v, EValLiteral);
504 if (Verbose) test.Next(_L("Using code-end relative values"));
505 TInt codeend = CleanHeader->iCodeSize + CleanHeader->iCodeOffset;
506 for (v = codeend-4; v <= codeend+4; ++v)
509 SetField(&aFields[f], v, EValLiteral);
517 void FuzzFieldsRandomly(const SFuzzField* aFields, TInt aOffset)
519 Target = FileData + aOffset;
522 while (aFields[f].name)
524 test.Printf(_L("FIELD: %s ... (random)\n"), aFields[f].name);
526 for (v = 0; v < KRandomFieldIterations; ++v)
529 SetField(&aFields[f], 0, EValRandom);
537 void FuzzBlockRandomly(TInt aOffset, TInt aSize)
541 Target = FileData + aOffset;
543 test.Printf(_L("FIELD: random words in data\n"));
545 for (v = 0; v < KRandomFieldIterations * 4; ++v)
548 field.offset = Rand(aSize);
549 if (Verbose) test.Printf(_L("@ %d, "), field.offset);
550 SetField(&field, 0, EValRandom);
556 void FuzzFile(TBool aRandom)
559 before.UniversalTime();
562 TFieldFuzzer FuzzFields = aRandom ? FuzzFieldsRandomly : FuzzFieldsDeterministically;
565 FuzzFields(HeaderFields, 0);
567 if (CleanHeader->iCompressionType == KFormatNotCompressed)
570 TInt offset = CleanHeader->iImportOffset;
573 FuzzFields(ImportSectionFields, offset);
574 offset += sizeof(E32ImportSection);
575 FuzzFields(ImportBlockFields, offset);
576 offset += sizeof(E32ImportBlock);
577 FuzzFields(ImportEntryFields, offset);
581 offset = CleanHeader->iCodeRelocOffset;
584 FuzzFields(RelocSectionFields, offset);
585 offset += sizeof(E32RelocSection);
586 FuzzFields(RelocBlockFields, offset);
587 offset += sizeof(E32RelocBlock);
588 FuzzFields(RelocEntryFields, offset);
592 offset = CleanHeader->iDataRelocOffset;
595 FuzzFields(RelocSectionFields, offset);
596 offset += sizeof(E32RelocSection);
597 FuzzFields(RelocBlockFields, offset);
598 offset += sizeof(E32RelocBlock);
599 FuzzFields(RelocEntryFields, offset);
603 offset = CleanHeader->iExportDirOffset;
606 FuzzFields(ExportEntryFields, offset);
613 // random bits of the compressed data
614 FuzzBlockRandomly(CleanHeader->iCodeOffset, FileSize - CleanHeader->iCodeOffset);
618 // arbitrary bits of the compressed data
619 FuzzFields(CompressedDataFields, CleanHeader->iCodeOffset);
624 after.UniversalTime();
625 TTimeIntervalSeconds interval;
626 after.SecondsFrom(before, interval);
627 test.Printf(_L("Took %d seconds\n"), interval.Int());
631 void FuzzTruncateTo(TInt size)
633 OutFileSize = size - 4;
634 if (Verbose) test.Printf(_L("%d "), OutFileSize);
636 OutFileSize = size - 1;
637 if (Verbose) test.Printf(_L("%d "), OutFileSize);
639 if (size == FileSize)
642 if (Verbose) test.Printf(_L("%d "), OutFileSize);
644 OutFileSize = size + 1;
645 if (Verbose) test.Printf(_L("%d "), OutFileSize);
647 OutFileSize = size + 4;
648 if (Verbose) test.Printf(_L("%d "), OutFileSize);
656 before.UniversalTime();
659 FuzzTruncateTo(CleanHeader->iCodeOffset);
660 if (CleanHeader->iCompressionType == KFormatNotCompressed)
661 FuzzTruncateTo(CleanHeader->iCodeOffset+CleanHeader->iCodeSize);
662 FuzzTruncateTo(FileSize);
665 after.UniversalTime();
666 TTimeIntervalSeconds interval;
667 after.SecondsFrom(before, interval);
668 test.Printf(_L("Took %d seconds\n"), interval.Int());
672 void FuzzAllTestImages()
675 Drive = InternalDrive;
676 test.Next(_L("Fuzzing deterministically"));
677 for (i=1; i<=KFuzzImages; ++i)
679 test.Next(_L("Next binary..."));
680 test.Printf(_L("Fuzzing exe %d\n"), i);
681 PrepareName(i, EFalse);
684 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
685 test.Next(_L("Next binary..."));
686 test.Printf(_L("Fuzzing dll %d\n"), i);
687 PrepareName(i, ETrue);
690 Drive = RemovableDrive;
691 test.Next(_L("Fuzzing deterministically on removable media"));
692 for (i=1; i<=KFuzzImages; ++i)
694 test.Next(_L("Next binary..."));
695 test.Printf(_L("Fuzzing exe %d\n"), i);
696 PrepareName(i, EFalse);
699 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
700 test.Next(_L("Next binary..."));
701 test.Printf(_L("Fuzzing dll %d\n"), i);
702 PrepareName(i, ETrue);
705 Drive = InternalDrive;
706 test.Next(_L("Fuzzing by truncation"));
707 for (i=1; i<=KFuzzImages; ++i)
709 test.Next(_L("Next binary..."));
710 test.Printf(_L("Fuzzing exe %d\n"), i);
711 PrepareName(i, EFalse);
714 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
715 test.Next(_L("Next binary..."));
716 test.Printf(_L("Fuzzing dll %d\n"), i);
717 PrepareName(i, ETrue);
720 Drive = RemovableDrive;
721 test.Next(_L("Fuzzing by truncation on removable media"));
722 for (i=1; i<=KFuzzImages; ++i)
724 test.Next(_L("Next binary..."));
725 test.Printf(_L("Fuzzing exe %d\n"), i);
726 PrepareName(i, EFalse);
729 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
730 test.Next(_L("Next binary..."));
731 test.Printf(_L("Fuzzing dll %d\n"), i);
732 PrepareName(i, ETrue);
735 test.Next(_L("Fuzzing randomly"));
738 for (i=1; i<=KFuzzImages; ++i)
740 Drive = InternalDrive;
741 test.Next(_L("Next binary..."));
742 test.Printf(_L("Fuzzing exe %d\n"), i);
743 PrepareName(i, EFalse);
746 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
747 test.Next(_L("Next binary..."));
748 test.Printf(_L("Fuzzing dll %d\n"), i);
749 PrepareName(i, ETrue);
751 Drive = RemovableDrive;
752 test.Next(_L("Next binary..."));
753 test.Printf(_L("Fuzzing exe %d on removable media\n"), i);
754 PrepareName(i, EFalse);
757 continue; // DLL 5 doesn't exist because toolchain doesn't like DLLs with no exports
758 test.Next(_L("Next binary..."));
759 test.Printf(_L("Fuzzing dll %d on removable media\n"), i);
760 PrepareName(i, ETrue);
768 void FuzzProvidedImage()
770 test.Printf(_L("Fuzzing file %S\n"), &Provided);
771 PrepareProvidedName();
772 Drive = InternalDrive;
773 test.Next(_L("Fuzzing deterministically"));
775 Drive = RemovableDrive;
776 test.Next(_L("Fuzzing deterministically on removable media"));
778 test.Next(_L("Fuzzing by truncation"));
780 Drive = RemovableDrive;
781 test.Next(_L("Fuzzing by truncation on removable media"));
783 test.Next(_L("Fuzzing randomly"));
786 Drive = InternalDrive;
787 test.Next(_L("Internal drive"));
789 Drive = RemovableDrive;
790 test.Next(_L("Removable drive"));
797 GLDEF_C TInt E32Main()
799 // default to verbose unless the fasttest trace flag is on
800 Verbose = (UserSvr::DebugMask(2)&0x00000002) == 0;
803 User::CommandLine(cmd);
810 TChar next = lex.Peek();
811 if (next == '-' || next == '/')
825 // being used as a slave to load a DLL
826 TPtrC libname(lex.NextToken());
828 RProcess::Rendezvous(KErrNone);
835 test_KErrNone(lex.Val(Seed, EHex));
836 test.Printf(_L("Using supplied random seed %08x\n"), Seed);
846 // filename, at least i assume it is :)
847 Provided.Copy(lex.NextToken());
852 test.Next(_L("Setup"));
854 CTrapCleanup* cleanup;
855 cleanup=CTrapCleanup::New();
860 time.UniversalTime();
861 Seed = (TUint32)time.Int64();
862 test.Printf(_L("Random seed is %08x\n"), Seed);
865 test_KErrNone(TheFs.Connect());
866 test_TRAP(FileMan=CFileMan::NewL(TheFs));
867 test_KErrNone(Timer.CreateLocal());
868 test_TRAP(Hasher=CSHA1::NewL());
869 HashDir.Append(TheFs.GetSystemDriveChar());
870 HashDir.Append(KSysHash);
871 TInt r = TheFs.MkDirAll(HashDir);
872 test(r == KErrNone || r == KErrAlreadyExists);
874 // Find some interesting drives
875 for (TInt driveno = EDriveA; driveno <= EDriveZ; ++driveno)
878 test_KErrNone(TheFs.Drive(di, driveno));
879 if (di.iType == EMediaNotPresent)
882 test_KErrNone(TheFs.DriveToChar(driveno, drivechar));
883 if ((di.iDriveAtt & KDriveAttInternal) && InternalDrive == '?')
884 InternalDrive = drivechar;
885 else if ((di.iDriveAtt & KDriveAttRemovable) && RemovableDrive == '?')
886 RemovableDrive = drivechar;
891 fn.Append(drivechar);
894 test(r == KErrNone || r == KErrAlreadyExists);
896 test.Printf(_L("Using %c as internal drive, %c as removable\n"), (TUint)InternalDrive, (TUint)RemovableDrive);
898 // Turn off evil lazy dll unloading
900 test_KErrNone(l.Connect());
901 test_KErrNone(l.CancelLazyDllUnload());
904 test.Start(_L("Fuzzing loader"));
905 if (Provided.Length() == 0)