15014830eSSaleem Abdulrasool //===-- ObjectFileCOFF.cpp ------------------------------------------------===//
25014830eSSaleem Abdulrasool //
35014830eSSaleem Abdulrasool // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45014830eSSaleem Abdulrasool // See https://llvm.org/LICENSE.txt for license information.
55014830eSSaleem Abdulrasool // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65014830eSSaleem Abdulrasool //
75014830eSSaleem Abdulrasool //===----------------------------------------------------------------------===//
85014830eSSaleem Abdulrasool
95014830eSSaleem Abdulrasool #include "ObjectFileCOFF.h"
105014830eSSaleem Abdulrasool
115014830eSSaleem Abdulrasool #include "lldb/Core/Module.h"
125014830eSSaleem Abdulrasool #include "lldb/Core/ModuleSpec.h"
135014830eSSaleem Abdulrasool #include "lldb/Core/PluginManager.h"
145014830eSSaleem Abdulrasool #include "lldb/Utility/LLDBLog.h"
155014830eSSaleem Abdulrasool
165014830eSSaleem Abdulrasool #include "llvm/Support/Error.h"
175014830eSSaleem Abdulrasool #include "llvm/Support/FormatAdapters.h"
185014830eSSaleem Abdulrasool
195014830eSSaleem Abdulrasool using namespace lldb;
205014830eSSaleem Abdulrasool using namespace lldb_private;
215014830eSSaleem Abdulrasool
225014830eSSaleem Abdulrasool using namespace llvm;
235014830eSSaleem Abdulrasool using namespace llvm::object;
245014830eSSaleem Abdulrasool
IsCOFFObjectFile(const DataBufferSP & data)255014830eSSaleem Abdulrasool static bool IsCOFFObjectFile(const DataBufferSP &data) {
265014830eSSaleem Abdulrasool return identify_magic(toStringRef(data->GetData())) ==
275014830eSSaleem Abdulrasool file_magic::coff_object;
285014830eSSaleem Abdulrasool }
295014830eSSaleem Abdulrasool
305014830eSSaleem Abdulrasool LLDB_PLUGIN_DEFINE(ObjectFileCOFF)
315014830eSSaleem Abdulrasool
325014830eSSaleem Abdulrasool char ObjectFileCOFF::ID;
335014830eSSaleem Abdulrasool
345014830eSSaleem Abdulrasool ObjectFileCOFF::~ObjectFileCOFF() = default;
355014830eSSaleem Abdulrasool
Initialize()365014830eSSaleem Abdulrasool void ObjectFileCOFF::Initialize() {
375014830eSSaleem Abdulrasool PluginManager::RegisterPlugin(GetPluginNameStatic(),
385014830eSSaleem Abdulrasool GetPluginDescriptionStatic(), CreateInstance,
395014830eSSaleem Abdulrasool CreateMemoryInstance, GetModuleSpecifications);
405014830eSSaleem Abdulrasool }
415014830eSSaleem Abdulrasool
Terminate()425014830eSSaleem Abdulrasool void ObjectFileCOFF::Terminate() {
435014830eSSaleem Abdulrasool PluginManager::UnregisterPlugin(CreateInstance);
445014830eSSaleem Abdulrasool }
455014830eSSaleem Abdulrasool
465014830eSSaleem Abdulrasool lldb_private::ObjectFile *
CreateInstance(const ModuleSP & module_sp,DataBufferSP data_sp,offset_t data_offset,const FileSpec * file,offset_t file_offset,offset_t length)475014830eSSaleem Abdulrasool ObjectFileCOFF::CreateInstance(const ModuleSP &module_sp, DataBufferSP data_sp,
485014830eSSaleem Abdulrasool offset_t data_offset, const FileSpec *file,
495014830eSSaleem Abdulrasool offset_t file_offset, offset_t length) {
505014830eSSaleem Abdulrasool Log *log = GetLog(LLDBLog::Object);
515014830eSSaleem Abdulrasool
525014830eSSaleem Abdulrasool if (!data_sp) {
535014830eSSaleem Abdulrasool data_sp = MapFileData(*file, length, file_offset);
545014830eSSaleem Abdulrasool if (!data_sp) {
555014830eSSaleem Abdulrasool LLDB_LOG(log,
565014830eSSaleem Abdulrasool "Failed to create ObjectFileCOFF instance: cannot read file {0}",
575014830eSSaleem Abdulrasool file->GetPath());
585014830eSSaleem Abdulrasool return nullptr;
595014830eSSaleem Abdulrasool }
605014830eSSaleem Abdulrasool data_offset = 0;
615014830eSSaleem Abdulrasool }
625014830eSSaleem Abdulrasool
635014830eSSaleem Abdulrasool assert(data_sp && "must have mapped file at this point");
645014830eSSaleem Abdulrasool
655014830eSSaleem Abdulrasool if (!IsCOFFObjectFile(data_sp))
665014830eSSaleem Abdulrasool return nullptr;
675014830eSSaleem Abdulrasool
685014830eSSaleem Abdulrasool if (data_sp->GetByteSize() < length) {
695014830eSSaleem Abdulrasool data_sp = MapFileData(*file, length, file_offset);
705014830eSSaleem Abdulrasool if (!data_sp) {
715014830eSSaleem Abdulrasool LLDB_LOG(log,
725014830eSSaleem Abdulrasool "Failed to create ObjectFileCOFF instance: cannot read file {0}",
735014830eSSaleem Abdulrasool file->GetPath());
745014830eSSaleem Abdulrasool return nullptr;
755014830eSSaleem Abdulrasool }
765014830eSSaleem Abdulrasool data_offset = 0;
775014830eSSaleem Abdulrasool }
785014830eSSaleem Abdulrasool
795014830eSSaleem Abdulrasool
805014830eSSaleem Abdulrasool MemoryBufferRef buffer{toStringRef(data_sp->GetData()),
815014830eSSaleem Abdulrasool file->GetFilename().GetStringRef()};
825014830eSSaleem Abdulrasool
835014830eSSaleem Abdulrasool Expected<std::unique_ptr<Binary>> binary = createBinary(buffer);
845014830eSSaleem Abdulrasool if (!binary) {
855014830eSSaleem Abdulrasool LLDB_LOG_ERROR(log, binary.takeError(),
865014830eSSaleem Abdulrasool "Failed to create binary for file ({1}): {0}",
875014830eSSaleem Abdulrasool file->GetPath());
885014830eSSaleem Abdulrasool return nullptr;
895014830eSSaleem Abdulrasool }
905014830eSSaleem Abdulrasool
915014830eSSaleem Abdulrasool LLDB_LOG(log, "ObjectFileCOFF::ObjectFileCOFF module = {1} ({2}), file = {3}",
925014830eSSaleem Abdulrasool module_sp.get(), module_sp->GetSpecificationDescription(),
935014830eSSaleem Abdulrasool file->GetPath());
945014830eSSaleem Abdulrasool
955014830eSSaleem Abdulrasool return new ObjectFileCOFF(unique_dyn_cast<COFFObjectFile>(std::move(*binary)),
965014830eSSaleem Abdulrasool module_sp, data_sp, data_offset, file, file_offset,
975014830eSSaleem Abdulrasool length);
985014830eSSaleem Abdulrasool }
995014830eSSaleem Abdulrasool
CreateMemoryInstance(const ModuleSP & module_sp,WritableDataBufferSP data_sp,const ProcessSP & process_sp,addr_t header)1005014830eSSaleem Abdulrasool lldb_private::ObjectFile *ObjectFileCOFF::CreateMemoryInstance(
1015014830eSSaleem Abdulrasool const ModuleSP &module_sp, WritableDataBufferSP data_sp,
1025014830eSSaleem Abdulrasool const ProcessSP &process_sp, addr_t header) {
1035014830eSSaleem Abdulrasool // FIXME: do we need to worry about construction from a memory region?
1045014830eSSaleem Abdulrasool return nullptr;
1055014830eSSaleem Abdulrasool }
1065014830eSSaleem Abdulrasool
GetModuleSpecifications(const FileSpec & file,DataBufferSP & data_sp,offset_t data_offset,offset_t file_offset,offset_t length,ModuleSpecList & specs)1075014830eSSaleem Abdulrasool size_t ObjectFileCOFF::GetModuleSpecifications(
1085014830eSSaleem Abdulrasool const FileSpec &file, DataBufferSP &data_sp, offset_t data_offset,
1095014830eSSaleem Abdulrasool offset_t file_offset, offset_t length, ModuleSpecList &specs) {
1105014830eSSaleem Abdulrasool if (!IsCOFFObjectFile(data_sp))
1115014830eSSaleem Abdulrasool return 0;
1125014830eSSaleem Abdulrasool
1135014830eSSaleem Abdulrasool MemoryBufferRef buffer{toStringRef(data_sp->GetData()),
1145014830eSSaleem Abdulrasool file.GetFilename().GetStringRef()};
1155014830eSSaleem Abdulrasool Expected<std::unique_ptr<Binary>> binary = createBinary(buffer);
1165014830eSSaleem Abdulrasool if (!binary) {
1175014830eSSaleem Abdulrasool Log *log = GetLog(LLDBLog::Object);
1185014830eSSaleem Abdulrasool LLDB_LOG_ERROR(log, binary.takeError(),
1195014830eSSaleem Abdulrasool "Failed to create binary for file ({1}): {0}",
1205014830eSSaleem Abdulrasool file.GetFilename());
1215014830eSSaleem Abdulrasool return 0;
1225014830eSSaleem Abdulrasool }
1235014830eSSaleem Abdulrasool
1245014830eSSaleem Abdulrasool std::unique_ptr<COFFObjectFile> object =
1255014830eSSaleem Abdulrasool unique_dyn_cast<COFFObjectFile>(std::move(*binary));
1265014830eSSaleem Abdulrasool switch (static_cast<COFF::MachineTypes>(object->getMachine())) {
1275014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_I386:
1285014830eSSaleem Abdulrasool specs.Append(ModuleSpec(file, ArchSpec("i686-unknown-windows-msvc")));
1295014830eSSaleem Abdulrasool return 1;
1305014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_AMD64:
1315014830eSSaleem Abdulrasool specs.Append(ModuleSpec(file, ArchSpec("x86_64-unknown-windows-msvc")));
1325014830eSSaleem Abdulrasool return 1;
1335014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_ARMNT:
1345014830eSSaleem Abdulrasool specs.Append(ModuleSpec(file, ArchSpec("armv7-unknown-windows-msvc")));
1355014830eSSaleem Abdulrasool return 1;
1365014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_ARM64:
1375014830eSSaleem Abdulrasool specs.Append(ModuleSpec(file, ArchSpec("aarch64-unknown-windows-msvc")));
1385014830eSSaleem Abdulrasool return 1;
1395014830eSSaleem Abdulrasool default:
1405014830eSSaleem Abdulrasool return 0;
1415014830eSSaleem Abdulrasool }
1425014830eSSaleem Abdulrasool }
1435014830eSSaleem Abdulrasool
Dump(Stream * stream)1445014830eSSaleem Abdulrasool void ObjectFileCOFF::Dump(Stream *stream) {
1455014830eSSaleem Abdulrasool ModuleSP module(GetModule());
1465014830eSSaleem Abdulrasool if (!module)
1475014830eSSaleem Abdulrasool return;
1485014830eSSaleem Abdulrasool
1495014830eSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(module->GetMutex());
1505014830eSSaleem Abdulrasool
1515014830eSSaleem Abdulrasool stream->Printf("%p: ", static_cast<void *>(this));
1525014830eSSaleem Abdulrasool stream->Indent();
1535014830eSSaleem Abdulrasool stream->PutCString("ObjectFileCOFF");
1545014830eSSaleem Abdulrasool *stream << ", file = '" << m_file
1555014830eSSaleem Abdulrasool << "', arch = " << GetArchitecture().GetArchitectureName() << '\n';
1565014830eSSaleem Abdulrasool
1575014830eSSaleem Abdulrasool if (SectionList *sections = GetSectionList())
1585014830eSSaleem Abdulrasool sections->Dump(stream->AsRawOstream(), stream->GetIndentLevel(), nullptr,
1595014830eSSaleem Abdulrasool true, std::numeric_limits<uint32_t>::max());
1605014830eSSaleem Abdulrasool }
1615014830eSSaleem Abdulrasool
GetAddressByteSize() const1625014830eSSaleem Abdulrasool uint32_t ObjectFileCOFF::GetAddressByteSize() const {
1635014830eSSaleem Abdulrasool return const_cast<ObjectFileCOFF *>(this)->GetArchitecture().GetAddressByteSize();
1645014830eSSaleem Abdulrasool }
1655014830eSSaleem Abdulrasool
GetArchitecture()1665014830eSSaleem Abdulrasool ArchSpec ObjectFileCOFF::GetArchitecture() {
1675014830eSSaleem Abdulrasool switch (static_cast<COFF::MachineTypes>(m_object->getMachine())) {
1685014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_I386:
1695014830eSSaleem Abdulrasool return ArchSpec("i686-unknown-windows-msvc");
1705014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_AMD64:
1715014830eSSaleem Abdulrasool return ArchSpec("x86_64-unknown-windows-msvc");
1725014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_ARMNT:
1735014830eSSaleem Abdulrasool return ArchSpec("armv7-unknown-windows-msvc");
1745014830eSSaleem Abdulrasool case COFF::IMAGE_FILE_MACHINE_ARM64:
1755014830eSSaleem Abdulrasool return ArchSpec("aarch64-unknown-windows-msvc");
1765014830eSSaleem Abdulrasool default:
1775014830eSSaleem Abdulrasool return ArchSpec();
1785014830eSSaleem Abdulrasool }
1795014830eSSaleem Abdulrasool }
1805014830eSSaleem Abdulrasool
CreateSections(lldb_private::SectionList & sections)1815014830eSSaleem Abdulrasool void ObjectFileCOFF::CreateSections(lldb_private::SectionList §ions) {
1825014830eSSaleem Abdulrasool if (m_sections_up)
1835014830eSSaleem Abdulrasool return;
1845014830eSSaleem Abdulrasool
1855014830eSSaleem Abdulrasool m_sections_up = std::make_unique<SectionList>();
1865014830eSSaleem Abdulrasool ModuleSP module(GetModule());
1875014830eSSaleem Abdulrasool if (!module)
1885014830eSSaleem Abdulrasool return;
1895014830eSSaleem Abdulrasool
1905014830eSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(module->GetMutex());
1915014830eSSaleem Abdulrasool
1925014830eSSaleem Abdulrasool auto SectionType = [](StringRef Name,
1935014830eSSaleem Abdulrasool const coff_section *Section) -> lldb::SectionType {
1945014830eSSaleem Abdulrasool lldb::SectionType type =
1955014830eSSaleem Abdulrasool StringSwitch<lldb::SectionType>(Name)
1965014830eSSaleem Abdulrasool // DWARF Debug Sections
1975014830eSSaleem Abdulrasool .Case(".debug_abbrev", eSectionTypeDWARFDebugAbbrev)
1985014830eSSaleem Abdulrasool .Case(".debug_info", eSectionTypeDWARFDebugInfo)
1995014830eSSaleem Abdulrasool .Case(".debug_line", eSectionTypeDWARFDebugLine)
2005014830eSSaleem Abdulrasool .Case(".debug_pubnames", eSectionTypeDWARFDebugPubNames)
2015014830eSSaleem Abdulrasool .Case(".debug_pubtypes", eSectionTypeDWARFDebugPubTypes)
2025014830eSSaleem Abdulrasool .Case(".debug_str", eSectionTypeDWARFDebugStr)
2035014830eSSaleem Abdulrasool // CodeView Debug Sections: .debug$S, .debug$T
2045014830eSSaleem Abdulrasool .StartsWith(".debug$", eSectionTypeDebug)
2055014830eSSaleem Abdulrasool .Case("clangast", eSectionTypeOther)
2065014830eSSaleem Abdulrasool .Default(eSectionTypeInvalid);
2075014830eSSaleem Abdulrasool if (type != eSectionTypeInvalid)
2085014830eSSaleem Abdulrasool return type;
2095014830eSSaleem Abdulrasool
2105014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_CNT_CODE)
2115014830eSSaleem Abdulrasool return eSectionTypeCode;
2125014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
2135014830eSSaleem Abdulrasool return eSectionTypeData;
2145014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
2155014830eSSaleem Abdulrasool return Section->SizeOfRawData ? eSectionTypeData : eSectionTypeZeroFill;
2165014830eSSaleem Abdulrasool return eSectionTypeOther;
2175014830eSSaleem Abdulrasool };
2185014830eSSaleem Abdulrasool auto Permissions = [](const object::coff_section *Section) -> uint32_t {
2195014830eSSaleem Abdulrasool uint32_t permissions = 0;
2205014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_MEM_EXECUTE)
2215014830eSSaleem Abdulrasool permissions |= lldb::ePermissionsExecutable;
2225014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_MEM_READ)
2235014830eSSaleem Abdulrasool permissions |= lldb::ePermissionsReadable;
2245014830eSSaleem Abdulrasool if (Section->Characteristics & COFF::IMAGE_SCN_MEM_WRITE)
2255014830eSSaleem Abdulrasool permissions |= lldb::ePermissionsWritable;
2265014830eSSaleem Abdulrasool return permissions;
2275014830eSSaleem Abdulrasool };
2285014830eSSaleem Abdulrasool
2295014830eSSaleem Abdulrasool for (const auto &SecRef : m_object->sections()) {
2305014830eSSaleem Abdulrasool const auto COFFSection = m_object->getCOFFSection(SecRef);
2315014830eSSaleem Abdulrasool
2325014830eSSaleem Abdulrasool llvm::Expected<StringRef> Name = SecRef.getName();
2335014830eSSaleem Abdulrasool StringRef SectionName = Name ? *Name : COFFSection->Name;
2345014830eSSaleem Abdulrasool if (!Name)
2355014830eSSaleem Abdulrasool consumeError(Name.takeError());
2365014830eSSaleem Abdulrasool
2375014830eSSaleem Abdulrasool SectionSP section =
2385014830eSSaleem Abdulrasool std::make_unique<Section>(module, this,
2395014830eSSaleem Abdulrasool static_cast<user_id_t>(SecRef.getIndex()),
2405014830eSSaleem Abdulrasool ConstString(SectionName),
2415014830eSSaleem Abdulrasool SectionType(SectionName, COFFSection),
2425014830eSSaleem Abdulrasool COFFSection->VirtualAddress,
2435014830eSSaleem Abdulrasool COFFSection->VirtualSize,
2445014830eSSaleem Abdulrasool COFFSection->PointerToRawData,
2455014830eSSaleem Abdulrasool COFFSection->SizeOfRawData,
2465014830eSSaleem Abdulrasool COFFSection->getAlignment(),
2475014830eSSaleem Abdulrasool 0);
2485014830eSSaleem Abdulrasool section->SetPermissions(Permissions(COFFSection));
2495014830eSSaleem Abdulrasool
2505014830eSSaleem Abdulrasool m_sections_up->AddSection(section);
2515014830eSSaleem Abdulrasool sections.AddSection(section);
2525014830eSSaleem Abdulrasool }
2535014830eSSaleem Abdulrasool }
2545014830eSSaleem Abdulrasool
ParseSymtab(lldb_private::Symtab & symtab)2555014830eSSaleem Abdulrasool void ObjectFileCOFF::ParseSymtab(lldb_private::Symtab &symtab) {
2565014830eSSaleem Abdulrasool Log *log = GetLog(LLDBLog::Object);
2575014830eSSaleem Abdulrasool
2585014830eSSaleem Abdulrasool SectionList *sections = GetSectionList();
2595014830eSSaleem Abdulrasool symtab.Reserve(symtab.GetNumSymbols() + m_object->getNumberOfSymbols());
2605014830eSSaleem Abdulrasool
2615014830eSSaleem Abdulrasool auto SymbolType = [](const COFFSymbolRef &Symbol) -> lldb::SymbolType {
2625014830eSSaleem Abdulrasool if (Symbol.getComplexType() == COFF::IMAGE_SYM_DTYPE_FUNCTION)
2635014830eSSaleem Abdulrasool return eSymbolTypeCode;
2645014830eSSaleem Abdulrasool if (Symbol.getBaseType() == COFF::IMAGE_SYM_TYPE_NULL &&
2655014830eSSaleem Abdulrasool Symbol.getComplexType() == COFF::IMAGE_SYM_DTYPE_NULL)
2665014830eSSaleem Abdulrasool return eSymbolTypeData;
2675014830eSSaleem Abdulrasool return eSymbolTypeInvalid;
2685014830eSSaleem Abdulrasool };
2695014830eSSaleem Abdulrasool
2705014830eSSaleem Abdulrasool for (const auto &SymRef : m_object->symbols()) {
2715014830eSSaleem Abdulrasool const auto COFFSymRef = m_object->getCOFFSymbol(SymRef);
2725014830eSSaleem Abdulrasool
2735014830eSSaleem Abdulrasool Expected<StringRef> NameOrErr = SymRef.getName();
274*43db8ac8SStefan Gränitz if (!NameOrErr) {
275*43db8ac8SStefan Gränitz LLDB_LOG_ERROR(log, NameOrErr.takeError(),
276*43db8ac8SStefan Gränitz "ObjectFileCOFF: failed to get symbol name: {0}");
2775014830eSSaleem Abdulrasool continue;
2785014830eSSaleem Abdulrasool }
2795014830eSSaleem Abdulrasool
2805014830eSSaleem Abdulrasool Symbol symbol;
2815014830eSSaleem Abdulrasool symbol.GetMangled().SetValue(ConstString(*NameOrErr));
2825014830eSSaleem Abdulrasool
2835014830eSSaleem Abdulrasool int16_t SecIdx = static_cast<int16_t>(COFFSymRef.getSectionNumber());
2845014830eSSaleem Abdulrasool if (SecIdx == COFF::IMAGE_SYM_ABSOLUTE) {
2855014830eSSaleem Abdulrasool symbol.GetAddressRef() = Address{COFFSymRef.getValue()};
2865014830eSSaleem Abdulrasool symbol.SetType(eSymbolTypeAbsolute);
2875014830eSSaleem Abdulrasool } else if (SecIdx >= 1) {
2885014830eSSaleem Abdulrasool symbol.GetAddressRef() = Address(sections->GetSectionAtIndex(SecIdx - 1),
2895014830eSSaleem Abdulrasool COFFSymRef.getValue());
2905014830eSSaleem Abdulrasool symbol.SetType(SymbolType(COFFSymRef));
2915014830eSSaleem Abdulrasool }
2925014830eSSaleem Abdulrasool
2935014830eSSaleem Abdulrasool symtab.AddSymbol(symbol);
2945014830eSSaleem Abdulrasool }
2955014830eSSaleem Abdulrasool
2965014830eSSaleem Abdulrasool LLDB_LOG(log, "ObjectFileCOFF::ParseSymtab processed {0} symbols",
2975014830eSSaleem Abdulrasool m_object->getNumberOfSymbols());
2985014830eSSaleem Abdulrasool }
2995014830eSSaleem Abdulrasool
ParseHeader()3005014830eSSaleem Abdulrasool bool ObjectFileCOFF::ParseHeader() {
3015014830eSSaleem Abdulrasool ModuleSP module(GetModule());
3025014830eSSaleem Abdulrasool if (!module)
3035014830eSSaleem Abdulrasool return false;
3045014830eSSaleem Abdulrasool
3055014830eSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(module->GetMutex());
3065014830eSSaleem Abdulrasool
3075014830eSSaleem Abdulrasool m_data.SetByteOrder(eByteOrderLittle);
3085014830eSSaleem Abdulrasool m_data.SetAddressByteSize(GetAddressByteSize());
3095014830eSSaleem Abdulrasool
3105014830eSSaleem Abdulrasool return true;
3115014830eSSaleem Abdulrasool }
312