DMD generated exes' size differ from PE headers

bobef aasd.aasdasd.asd.ad.ad.as.d.a at asdasdas.das.da.d.ad.sa.d
Wed Jan 27 00:27:26 PST 2010


Walter Bright Wrote:

> bobef wrote:
> > I'm walking the PE header sections to find out the file size. I find
> > the maximum PointerToRawData and add SizeOfRawData of the section to
> > find where the exe ends. It works with the files I've tested. When
> > compiling exe file with DMD 1.055 and -g there are additional four
> > bytes after the last section. Why is that? Is SizeOfRawData wrong or
> > there is something else at the end?
> 
> 
> I don't know. Could be alignment padding.

I found some article on MSDN that says that SizeOfRawData includes the alignment padding and something other was indicating the actual size, so this shouldn't be the case.

I do like this:

uint peFileSize(void[] data) {
	auto dos_header = cast(PIMAGE_DOS_HEADER)data;
	if(dos_header.e_magic != IMAGE_DOS_SIGNATURE) return -1;
	auto nt_header = cast(PIMAGE_NT_HEADERS)&data[dos_header.e_lfanew];
	if(nt_header.Signature != IMAGE_NT_SIGNATURE) return -1;

	uint maxpointer, exesize;
	PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(nt_header);
	for(uint i=0; i<nt_header.FileHeader.NumberOfSections; i++, section++) {
		if(section.PointerToRawData > maxpointer) {
			maxpointer = section.PointerToRawData;
			exesize = section.PointerToRawData + section.SizeOfRawData;
		}
	}
	return exesize;
}

and if I do 

exesize = section.PointerToRawData + section.SizeOfRawData + section.SizeOfRawData%nt_header.OptionalHeader.SectionAlignment;

then I get wrong results don't know why.



More information about the Digitalmars-d mailing list