#include <windows.h>
#include <stdio.h>
DWORD GetPEFileRealSize(LPCTSTR lpszFile)
{
DWORD dwSize = 0;
int i = 0;
HANDLE hFile = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPBYTE lpBuffer = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
PIMAGE_DOS_HEADER pImgDosHeader = (PIMAGE_DOS_HEADER)lpBuffer;
PIMAGE_NT_HEADERS32 pImgNtHeaders = (PIMAGE_NT_HEADERS32) (lpBuffer + pImgDosHeader->e_lfanew);
PIMAGE_SECTION_HEADER pImgSecHeader = (PIMAGE_SECTION_HEADER) (pImgNtHeaders + 1);
DWORD al = pImgNtHeaders->OptionalHeader.FileAlignment;
dwSize = pImgDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32) + pImgNtHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
if (dwSize%al)
dwSize = (dwSize / al) * al + al;
for (i = 0; i < pImgNtHeaders->FileHeader.NumberOfSections; i++)
dwSize += pImgSecHeader[i].SizeOfRawData;
UnmapViewOfFile(lpBuffer);
CloseHandle(hMap);
CloseHandle(hFile);
}
return dwSize;
}
int main(int argc, char *argv[])
{
printf("%x\n", GetPEFileRealSize(argv[0]));
return 0;
}
C语言 PE文件获取自身大小
最新推荐文章于 2023-09-20 16:04:08 发布