![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по РЕ формату
SPeller © (2004-02-18 14:50:00)Подскажите пожалуйста, каково назначение каталогов данных DELAY_IMPORT и BOUND_IMPORT ?
SPeller (2004-02-21 15:32:00) [1]Спасибо! :)
Игорь Шевченко (2004-02-21 12:40:00) [2]
{
Модуль: HSImageUtils
Описание: Набор утилит для работы с исполняемыми файлами.
Автор: Игорь Шевченко
Дата создания: 22.02.2003
История изменений:
}
unit HSImageUtils;
interface
type
THSBinaryType = (hsbtError, hsbtWin32, hsbtWin16, hsbtDos16, hsbtCom,
hsbtVxd, hsbtW3, hsBtUnknown);
function HSGetBinaryType (const FileName : String) : THSBinaryType;
function HSBinaryTypeToString (Value : THSBinaryType) : String;
implementation
uses
Windows, SysUtils, HSFileMapper;
const
HSBinaryTypeStrings : array[THSBinaryType] of String = (
'Error', 'Win32', 'Win16', 'MSDOS', 'COM', 'VxD', 'W3', 'Unknown'
);
IMAGE_W3_SIGNATURE = $3357; { W3 }
function HSGetBinaryType (const FileName : String) : THSBinaryType;
type
PIMAGE_DOS_HEADER = ^IMAGE_DOS_HEADER;
PIMAGE_NT_HEADERS = PImageNtHeaders;
var
Mapper : THSFileMapper;
DosHeader : PIMAGE_DOS_HEADER;
FileHeader : PIMAGE_NT_HEADERS;
begin
Result := hsbtError;
Mapper := THSFileMapper.Create (FileName);
try
if (Mapper.Map[0] <> 'M') or (Mapper.Map[1] <> 'Z') then begin
if UpperCase(ExtractFileExt(FileName)) = '.COM' then
Result := hsbtCom;
Exit;
end else if Mapper.FileSize >= SizeOf(IMAGE_DOS_HEADER) then begin
DosHeader := PIMAGE_DOS_HEADER(Mapper.Map);
if (DosHeader^._lfanew > $40) { Matt Pietrek } and
(DWORD(DosHeader^._lfanew) < Mapper.FileSize - SizeOf(WORD)) then begin
FileHeader := PIMAGE_NT_HEADERS(DWORD(DosHeader) +
DWORD(DosHeader^._lfanew));
if FileHeader^.Signature = IMAGE_NT_SIGNATURE then
Result := hsbtWin32
else if WORD(FileHeader^.Signature) = IMAGE_OS2_SIGNATURE then
Result := hsbtWin16
else if WORD(FileHeader^.Signature) = IMAGE_VXD_SIGNATURE then
Result := hsbtVxd
else if WORD(FileHeader^.Signature) = IMAGE_W3_SIGNATURE then
Result := hsbtW3
else
Result := hsbtUnknown;
end else
Result := hsbtDos16;
end;
finally
Mapper.Free();
end;
end;
function HSBinaryTypeToString (Value : THSBinaryType) : String;
begin
Result := HSBinaryTypeStrings[Value];
end;
end.
SPeller (2004-02-21 12:16:00) [3]Может есть ограничения на длину DOS-stub, чтобы если этот лимит превышен в поле _lfanew, то сразу знать что формат файла не тот какой нужен?
SPeller (2004-02-21 12:13:00) [4]Параллельный вопрос:
Есть файлы досовского формата, которые тоже начинаются с MZ, но попытка узнать тип файла не удаётся - данные в поле TImageDosHeader._lfanew оказываются мягко говоря, не теми какие нужны. Как отличить такой файл от других? РЕ, NE и подобные хоть определяются таким же способок как и PE.
SPeller (2004-02-19 05:42:00) [5]Большое спасибо! Всё понял.
AKul (2004-02-18 15:58:00) [6]
> SPeller © (18.02.04 14:50)
DELAY_IMPORT - содержит данные для отложенной загрузки DLL, т.е. библиотеки не загружается и не линкуется при загрузке екзешника, а подключается только при первом вызове ее функции.
BOUND_IMPORT - хранятся "правильные" адреса импортируемых функций, т.е. линковка не требуется - DLL загружается в адресное пространство, а адреса импортируемых функций уже известны. Само собой базовый адрес DLL (да и RVA ее экспортируемых функций...) должен быть таким же, как при составлении BoundImport'а (для этих целей хранятся временные штампы DLL).
P.S. Прошу прощения, если я что-то подзабыл...
MBo (2004-02-18 15:25:00) [7]про DELAY_IMPORT - у Рихтера немного написано об отложенной загрузке.