diff -r 0659d0e1a03c -r 1d28c8722707 userlibandfileserver/fileserver/shostmassstorage/msproxy/tmbr.cpp --- /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 +#include +#include + +#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(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(&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(&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; + } +