Files
RedHotRoast-ios/HybridCLRData/LocalIl2CppData-OSXEditor/il2cpp/libil2cpp/os/Win32/Image.cpp
T
2026-07-17 14:03:00 +08:00

100 lines
3.2 KiB
C++

#include "il2cpp-config.h"
#include "utils/Memory.h"
#if IL2CPP_TARGET_WINDOWS
#include "os/Image.h"
#include "WindowsHeaders.h"
#include <libloaderapi.h>
#include <cstdio>
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
namespace il2cpp
{
namespace os
{
namespace Image
{
static void InitializeManagedSection()
{
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(((char*)&__ImageBase) + __ImageBase.e_lfanew);
PIMAGE_SECTION_HEADER sectionHeader = (PIMAGE_SECTION_HEADER)((char*)&ntHeaders->OptionalHeader + ntHeaders->FileHeader.SizeOfOptionalHeader);
for (int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)
{
if (strncmp(IL2CPP_BINARY_SECTION_NAME, (char*)sectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME) == 0)
{
void* start = (char*)&__ImageBase + sectionHeader->VirtualAddress;
void* end = (char*)start + sectionHeader->Misc.VirtualSize;
SetManagedSectionStartAndEnd(start, end);
}
sectionHeader++;
}
}
void Initialize()
{
InitializeManagedSection();
}
void* GetImageBase()
{
return &__ImageBase;
}
#if IL2CPP_ENABLE_NATIVE_INSTRUCTION_POINTER_EMISSION
struct PdbInfo
{
DWORD Signature;
GUID Guid;
DWORD Age;
char PdbFileName[1];
};
char* GetImageUUID()
{
uintptr_t base_pointer = (uintptr_t)((char*)&__ImageBase);
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(base_pointer + __ImageBase.e_lfanew);
IMAGE_DATA_DIRECTORY* dir = &ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
IMAGE_DEBUG_DIRECTORY* dbg_dir = (IMAGE_DEBUG_DIRECTORY*)(base_pointer + dir->VirtualAddress);
if (IMAGE_DEBUG_TYPE_CODEVIEW == dbg_dir->Type)
{
PdbInfo* pdb_info = (PdbInfo*)(base_pointer + dbg_dir->AddressOfRawData);
char* uuid = static_cast<char*>(IL2CPP_MALLOC(41));
// Crash reporting expects the GUID without dashes (the format used by symbol servers)
_snprintf_s(uuid, 41, 40, "%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%X",
(unsigned char)(pdb_info->Guid.Data1 >> 24),
(unsigned char)(pdb_info->Guid.Data1 >> 16),
(unsigned char)(pdb_info->Guid.Data1 >> 8),
(unsigned char)pdb_info->Guid.Data1,
(unsigned char)(pdb_info->Guid.Data2 >> 8),
(unsigned char)pdb_info->Guid.Data2,
(unsigned char)(pdb_info->Guid.Data3 >> 8),
(unsigned char)pdb_info->Guid.Data3,
pdb_info->Guid.Data4[0], pdb_info->Guid.Data4[1], pdb_info->Guid.Data4[2], pdb_info->Guid.Data4[3],
pdb_info->Guid.Data4[4], pdb_info->Guid.Data4[5], pdb_info->Guid.Data4[6], pdb_info->Guid.Data4[7],
pdb_info->Age);
return uuid;
}
return NULL;
}
char* GetImageName()
{
char* name = static_cast<char*>(IL2CPP_MALLOC(MAX_PATH + 1));
GetModuleFileNameA((HMODULE)&__ImageBase, name, MAX_PATH + 1);
return name;
}
#endif
}
}
}
#endif