Автор: SLV. Дата публикации: 19.08.2004
Эта статья является продолжением моей статьи про то, как написать корректор контрсуммы на Дельфях. В ней будет показан немного другой способ решения вышеупомянутой проблемы (возможно даже более простой). Так же мы не будем использовать дополнительных модулей (pelib), которые активно использовался нами в предыдущей программе. Да ещё наша сегодняшняя программа будет написана на сплошном API, значит её размер будет порядка 30 килобайт! Ну чтож, ближе к делу. Для начала я расскажу вам, какую API мы будем использовать, а далее будет предложен тщательно откомментированный исходник.
Вот главная функция в нашей проге:
Если функция выполнена успешно, то возвращаемое ею значение будет равно CHECKSUM_SUCCESS. В ином случае возвращаемое значение будет равно одному из тех, которые указаны в таблице:
Вроде всё понятно, теперь можно программировать…
Спасибо за интерес к статье...
Написание корректора контрсуммы... на Delphi 2
Эта статья является продолжением моей статьи про то, как написать корректор контрсуммы на Дельфях. В ней будет показан немного другой способ решения вышеупомянутой проблемы (возможно даже более простой). Так же мы не будем использовать дополнительных модулей (pelib), которые активно использовался нами в предыдущей программе. Да ещё наша сегодняшняя программа будет написана на сплошном API, значит её размер будет порядка 30 килобайт! Ну чтож, ближе к делу. Для начала я расскажу вам, какую API мы будем использовать, а далее будет предложен тщательно откомментированный исходник.
Вот главная функция в нашей проге:
ULONG MapFileAndCheckSumA( ; Функция вычисляет котнтрсумму обозначенного файла
IN LPSTR Filename, ; Имя файла
OUT LPDWORD HeaderSum, ; CheckSum из IMAGE_NT_HEADERS->OptionalHeader
OUT LPDWORD CheckSum ; Верная сумма
);
Если функция выполнена успешно, то возвращаемое ею значение будет равно CHECKSUM_SUCCESS. В ином случае возвращаемое значение будет равно одному из тех, которые указаны в таблице:
Значение Причина краха функции
CHECKSUM_OPEN_FAILURE Невозможно открыть файл.
CHECKSUM_MAP_FAILURE Невозможно создать mapped объект.
CHECKSUM_MAPVIEW_FAILURE Невозможно выполнить функцию MapViewOfFile.
CHECKSUM_UNICODE_FAILURE Невозможно конвертировать имя файла в строку формата Unicode,
Вроде всё понятно, теперь можно программировать…
program CheckSum2;
uses Windows, ImageHlp; // Минимум модулей – минимальный размер программы
function IsFileExists(_FileName:string):boolean; // Функция для проверки существования файла
var
hFile:THandle;
begin
hFile:=CreateFileA(PChar(_FileName),GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if hFile=INVALID_HANDLE_VALUE then // Создаётся существующий файл, если он валиден, то файл есть
begin
Result:=false;
CloseHandle(hFile);
Exit;
end;
Result:=true;
CloseHandle(hFile);
end;
function MACF(_FileName:string):boolean; // Map and check sum mapped file :)
var
hs,cs:Cardinal; // Переменные для хранения сумм из хедера и из API
res:DWORD; // Результат выполнения API
okMsg:string;
begin
res:=MapFileAndCheckSumA(PChar(_FileName),hs,cs);
case res of // Удобная конструкция, аналог switch в C++
CHECKSUM_SUCCESS: // Если всё OK, то
begin
Result:=true;
okMsg:=’Checksum successfyll corrected’ + #10 + #13 + ‘Header sum: ‘ + IntToStr(hs) + ‘; Real sum: ‘ + IntToStr(cs);
writeln(PChar(okMsg));
Exit;
end;
CHECKSUM_OPEN_FAILURE: // Далее идёт проверка всех исключительных ситуаций (одна даже лишняя, //догадайтесь какая)...
begin
Result:=false;
writeln(‘File access error (file not found or not ready)’);
Exit;
end;
CHECKSUM_MAP_FAILURE:
begin
Result:=false;
writeln(‘Can not to create mapped object...’);
Exit;
end;
CHECKSUM_MAPVIEW_FAILURE:
begin
Result:=false;
writeln(‘Can not map view of file...’);
Exit;
end;
CHECKSUM_UNICODE_FAILURE:
begin
Result:=false;
writeln(‘Can not to convert file name to Unicode string’);
Exit;
end;
end;
procedure Main; // Собственно главная процедура. В C++ она называлась бы void Main(void) (для общего //развития ;)
var
ErrMsg:string;
begin
if ParamStr(0)=’’ then // Если прога запущена без параметров
begin
writeln(‘CheckSum v1.1 by SLV/[ROCK]... Usage: CheckSum.exe file’);
Exit;
end;
writeln(‘CheckSum v1.1 by SLV/[ROCK]...’); // Понты =)
if not IsFileExists(ParamStr(0)) then // Юзаем свежесозданную функцию...
begin
ErrMsg:=’File: ‘ + ParamStr(0) + ‘ is not ready or not found...’;
writeln(PChar(ErrMsg));
Exit;
end;
MACF(ParamStr(0));
ExitProcess(0); // На всякий случай...
end;
begin
Main;
end;
Спасибо за интерес к статье...
Комментарии |
Добавил: Larry Дата: 11.03.2007 Пример из данной статьи подсчитывает контрольную сумму, но не записывает её в файл. |
Добавление комментария |