static inline NTSTATUS access_resource( HMODULE hmod, const IMAGE_RESOURCE_DATA_ENTRY *entry, void **ptr, ULONG *size ) #endif { NTSTATUS status; __TRY { ULONG dirsize; if (!RtlImageDirectoryEntryToData( hmod, TRUE, IMAGE_DIRECTORY_ENTRY_RESOURCE, &dirsize )) status = STATUS_RESOURCE_DATA_NOT_FOUND; else { if (ptr) { if (is_data_file_module(hmod)) { HMODULE mod = (HMODULE)((ULONG_PTR)hmod & ~1); *ptr = RtlImageRvaToVa( RtlImageNtHeader(mod), mod, entry->OffsetToData, NULL ); } else *ptr = (char *)hmod + entry->OffsetToData; } if (size) *size = entry->Size; status = STATUS_SUCCESS; } } __EXCEPT_PAGE_FAULT { return GetExceptionCode(); } __ENDTRY; return status; }
static NTSTATUS LdrpAccessResource( PVOID BaseAddress, IMAGE_RESOURCE_DATA_ENTRY *entry, void **ptr, ULONG *size ) #endif { NTSTATUS status = STATUS_SUCCESS; _SEH2_TRY { ULONG dirsize; if (!RtlImageDirectoryEntryToData( BaseAddress, TRUE, IMAGE_DIRECTORY_ENTRY_RESOURCE, &dirsize )) status = STATUS_RESOURCE_DATA_NOT_FOUND; else { if (ptr) { if (is_data_file_module(BaseAddress)) { PVOID mod = (PVOID)((ULONG_PTR)BaseAddress & ~1); *ptr = RtlImageRvaToVa( RtlImageNtHeader(mod), mod, entry->OffsetToData, NULL ); } else *ptr = (char *)BaseAddress + entry->OffsetToData; } if (size) *size = entry->Size; } } _SEH2_EXCEPT(page_fault(_SEH2_GetExceptionCode())) { status = _SEH2_GetExceptionCode(); } _SEH2_END; return status; }
/********************************************************************** * PE_LoadResource */ HGLOBAL PE_LoadResource( HMODULE hmod, HRSRC hRsrc ) { DWORD offset; const void *base = get_module_base( hmod ); if (!hRsrc || !base) return 0; offset = ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData; if (is_data_file_module(hmod)) return (HANDLE)get_data_file_ptr( base, offset ); else return (HANDLE)((char *)base + offset); }
/********************************************************************** * get_resdir * * Get the resource directory of a PE module */ static const IMAGE_RESOURCE_DIRECTORY* get_resdir( HMODULE hmod ) { const IMAGE_DATA_DIRECTORY *dir; const IMAGE_RESOURCE_DIRECTORY *ret = NULL; const void *base = get_module_base( hmod ); if (base) { dir = &PE_HEADER(base)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]; if (dir->Size && dir->VirtualAddress) { if (is_data_file_module(hmod)) ret = get_data_file_ptr( base, dir->VirtualAddress ); else ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress); } } return ret; }