--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/shostmassstorage/msproxy/tmbr.cpp Tue Nov 02 15:29:23 2010 +0000
@@ -0,0 +1,104 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+//
+
+/** @file
+@internalTechnology
+*/
+
+#include <e32cmn.h>
+#include <e32des8.h>
+#include <partitions.h>
+
+#include "mscutils.h"
+#include "tmbr.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tmbrTraces.h"
+#endif
+
+
+TInt TMbr::GetPartition(TDes8& aMbrData, TMBRPartitionEntry& aPartitionEntry)
+ {
+ TUint8* buffer = const_cast<TUint8*>(aMbrData.Ptr());
+
+ // check first sector for a Master Boot Record
+ if (LittleEndian::Get16(&buffer[KMBRSignatureOffset]) != KMBRSignature)
+ {
+ OstTrace0(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_11,
+ "MBR not present");
+ return KErrNotFound;
+ }
+
+ memcpy(&buffer[0],&buffer[KMBRFirstPartitionOffset],(sizeof(TMBRPartitionEntry)<<2));
+ TMBRPartitionEntry* pe = reinterpret_cast<TMBRPartitionEntry*>(&buffer[0]);
+
+ TInt firstValidPartitionCount = -1;
+ TInt defaultPartitionNumber = -1;
+ TInt partitionCount = 0;
+ for (TInt i = 0; i < KMBRMaxPrimaryPartitions; i++, pe++)
+ {
+ if (pe->IsValidDosPartition() || pe->IsValidFAT32Partition() || pe->IsValidExFATPartition())
+ {
+ OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_12,
+ "Partition %d is recognized", i);
+ partitionCount++;
+
+ if (firstValidPartitionCount < 0)
+ firstValidPartitionCount = i;
+
+ if (pe->iX86BootIndicator == KBootIndicatorBootable)
+ {
+ OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_13,
+ "Partition %d is bootable", i);
+ defaultPartitionNumber = i;
+ break;
+ }
+ }
+ else
+ {
+ OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_14,
+ "Partition %d is invalid", i);
+ }
+ }
+
+ if (partitionCount > 0)
+ {
+ pe = reinterpret_cast<TMBRPartitionEntry*>(&buffer[0]);
+ TInt partitionIndex = firstValidPartitionCount;
+ if (defaultPartitionNumber > 0)
+ {
+ partitionIndex = defaultPartitionNumber;
+ }
+
+ OstTrace1(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_15,
+ "Using Partition %d", partitionIndex);
+
+ TMBRPartitionEntry& partitionEntry = pe[partitionIndex];
+ aPartitionEntry = partitionEntry;
+
+ OstTraceExt2(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_16,
+ "partitioncount = %d defaultpartition = %d",
+ partitionCount, partitionIndex);
+ OstTraceExt2(TRACE_SHOSTMASSSTORAGE_MBR, TMBR_17,
+ "iFirstSector = x%x iNumSectors = x%x",
+ partitionEntry.iFirstSector,
+ partitionEntry.iNumSectors);
+ }
+
+ return partitionCount;
+ }
+