그것은, 변환 실제로 매우 간단하지만, 당신은 델파이에서 템플릿을 사용할 수 없습니다. 포인터에 오프셋을 추가하는 것 뿐이지 만 오프셋은 포인터 기본 형식의 배수가 아닌 바이트 단위로 지정됩니다.
그래서
PIMAGE_NT_HEADERS(PAnsiChar(DosHeader)+DosHeader.e_lfanew)
좀 더 예에
ByteOffset<IMAGE_NT_HEADERS>(DosHeader, DosHeader->e_lfanew)
변환 : 등등
ExportDirectory := PIMAGE_EXPORT_DIRECTORY(PAnsiChar(DosHeader)+
NtHeader.OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
functions := PDWORD(PAnsiChar(DosHeader)+ExportDirectory->AddressOfFunctions);
하고 있습니다.
type
ByteOffset<DestType, SrcType> = class
public
type
PSrcType = ^SrcType;
PDestType = ^DestType;
class function At(ptr: PSrcType; offset: NativeInt): PDestType;
end;
class function ByteOffset<DestType, SrcType>.At(ptr: PSrcType; offset: NativeInt): PDestType;
begin
Result := PDestType(PByte(ptr) + offset);
end;
:
델파이에는 템플릿이없고 코드를 직접 변환 할 수 없습니다. 진행하려면 코드가 어떻게 사용되고 있는지 확인해야합니다. –
@DavidHeffernan이 코드는이 함수에서 사용됩니다. http://pastebin.com/7d9N1J2c "eat_hook" – paulohr
이 기능은 복잡해 보일 수 있지만 pointee 형식과 관계없이 포인터에 오프셋을 추가하기 만합니다. – ereOn