signature 필드는 PE 파일 임을 나타내는 시그니처로, 4바이트로 구성되어 있고 항상 "PE\x0\x0" 값을 가진다. 또 앞에서 나온 e_lfanew 필드가 가르키는 오프셋 값에서부터 4바이트 값이며 WinNT.h에 다음과 같이 정의되어 있다.
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
해당 필드의 값을 비교하기 위해서는 앞에서 구한 IMAGE_DOS_HEADER 구조체의 e_lfanew 필드가 가리키는 오프셋만큼 파일 포인터를 이동시키고 해당 지점에서 4바이트를 DWORD 형으로 읽어와서 위의 매크로와 비교하면 된다.
PBYTE pIter = GET_NT_HEADER(m_pImgView);
DWORD dwSig = *((PDWORD)pIter);
if (dwSig != IMAGE_NT_SIGNATURE)
throw _T("PE 포맷을 가진 파일이 아닙니다.");
다음은 PEPlus 클래스에서 인라인 함수 정의를 통해 NT 시그니처를 체크하는 함수이다.
inline bool PEPlus::IsNTSignature(PBYTE pImgBase)
{
PIMAGE_NT_HEADERS pnh = (PIMAGE_NT_HEADERS)GET_NT_HDRPTR(pImgBase);
return (pnh->Signature == IMAGE_NT_SIGATURE);
}
DWORD BaseOfData; // 64비트에서는 존재하지 않음
DWORD SizeOfStackReserve; // 64비트 -> ULONGLONG
DWORD SizeOfStackCommit; // 64비트 -> ULONGLONG
DWORD SizeOfHeapReserve; // 64비트 -> ULONGLONG DWORD SizeOfHeapCommit; // 64비트 -> ULONGLONG