На самом деле конвертировать довольно просто, но вы не можете использовать шаблоны в Delphi.Это просто добавление смещения к указателю, но смещение указывается в байтах, а не кратно базовому типу указателя.
Так что конвертируйте
ByteOffset<IMAGE_NT_HEADERS>(DosHeader, DosHeader->e_lfanew)
в
PIMAGE_NT_HEADERS(PAnsiChar(DosHeader)+DosHeader.e_lfanew)
Еще несколько примеров:
ExportDirectory := PIMAGE_EXPORT_DIRECTORY(PAnsiChar(DosHeader)+
NtHeader.OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
functions := PDWORD(PAnsiChar(DosHeader)+ExportDirectory->AddressOfFunctions);
и т. Д.