2013-06-19 4 views
4

나는 DOS 헤더를 깊이 이해하려고 노력하고 있는데, 나는이 것들을 고수하고있다. 나는 유일한 필수 바이트가 MZ 서명과 PE 섹션에 대한 포인터 알고 있지만, 나는이 두 가지가 정확히 무엇인지 알고있다 : 대부분의 실행 '바이너리 코드에서DOS 헤더의 e_cblp 및 e_cp 란 무엇입니까?

USHORT e_cblp;   // Bytes on last page of file 
USHORT e_cp;   // Pages in file 

이 값은 각각 90H 및 03H입니다. 페이지는 512 바이트의 코드이므로 3 페이지가 있지만 어디에 있습니까? 파일에서 어디에서 찾을 수 있습니까? 512 바이트의 마지막 페이지에서이 90h (144) 바이트를 어떻게 확인할 수 있습니까?

이 정보는 DOS에서만 요청됩니다. 도스에서 실행되는 PE 파일의 유일한 코드는 DOS 스텁이며 3 페이지의 코드가 아니라 단지 64 바이트입니다. 그래서, 90h와 03h는 무엇을해야합니까? e_cblp=01he_cp=DOS header+DOS stub을 말할 수 없습니까?

답변

0

"전체"MZ 형식 실행 파일의 크기이며, 마지막 페이지의 마지막 바이트를 지나간 파일은 무시됩니다. MS-DOS가 MZ 형식의 실행 파일을로드하면이 제한까지 헤더의 뒤에 파일의 모든 내용이 복사됩니다. 따라서 대부분의 PECOFF 실행 파일이이 필드를 MS-DOS 스텁보다 큰 값으로 설정 한 사실은 실행 파일이 MS-DOS에서 실행될 때 PECOFF 헤더와 PECOFF 섹션 데이터의 일부가 메모리에로드된다는 것을 의미합니다.

Microsoft 링커 (및 Borland 또는 Watcom의 GNU 링커)가 사용하는 기본 DOS 스텁이 실제로는 크기가 작을 때 크기가 1168 바이트라고 말하는 이유를 모르겠습니다. Microsoft의 링커를 사용할 때 자신의 스텁을 제공하면 제공된 실행 파일의 크기가 사용됩니다. Windows는 PECOFF 실행 파일을로드 할 때이 값을 무시하는 것으로 보이며 기본 DOS 스텁에는 추가 데이터를 사용할 수 없습니다.

Microsoft의 링커를 사용하여 1024 바이트 길이의 유효한 PECOFF 실행 파일을 만들 수 있습니다. 이를 위해서는 실행 파일이 하나의 섹션 만 가지고 있고 그 크기가 512 바이트보다 작아야합니다. Windows가 실행 파일을 실행하고 실행하는 동안 MS-DOS는 파일 크기가 MZ 헤더에 지정된 크기 값보다 작기 때문에 거부합니다.