Hi All,
I am trying to convert the following C++ code to C#.
pExportDir = (PIMAGE_EXPORT_DIRECTORY)GetPtrFromRVA(exportsStartRVA, pNTHeader, pImageBase);
C# Syntax (Toggle Plain Text)
The above function will return a "ExportDirectory" structure. Which is working fine in C++. I wrote the same function in C# like belowCode:template <class T> LPVOID GetPtrFromRVA( DWORD rva, T* pNTHeader, PBYTE imageBase ) // 'T' = PIMAGE_NT_HEADERS { PIMAGE_SECTION_HEADER pSectionHdr; INT delta; INT delta2; pSectionHdr = GetEnclosingSectionHeader( rva, pNTHeader ); if ( !pSectionHdr ) return 0; delta = (INT)(pSectionHdr->VirtualAddress-pSectionHdr->PointerToRawData); delta2 = (INT)( imageBase + rva - delta ); return (PVOID) ( imageBase + rva - delta ); }
export_table = GetPtrFromRVA <IMAGE_EXPORT_DIRECTORY>(ExportTable_rva, _sectionHeaders[0], _dosHeader.e_magic);
C# Syntax (Toggle Plain Text)
Please see the attachments for the C++ and C# outputs i am getting....Code:public T GetPtrFromRVA<T>(UInt32 ExportTable_rva, IMAGE_SECTION_HEADER _sectionHeaders, UInt16 magic) { IMAGE_SECTION_HEADER textsectionHeader; int delta; textsectionHeader = GetEnclosingSectionHeader(ExportTable_rva, _sectionHeaders); //if (textsectionHeader == null) // return 0; delta = (int)(_sectionHeaders.VirtualAddress - _sectionHeaders.PointerToRawData); GCHandle handle = GCHandle.Alloc((magic + ExportTable_rva - delta), GCHandleType.Pinned); T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); // Deallocate pointer handle.Free(); return theStructure; }


Reply With Quote
Bookmarks