Форум о защите от: хакеров, взлом, раскрутка, хакер, вирусы, взлом программы, взлом паролей, взлом вконтакте, взлом icq, раскрутка сайта, взлом скачать, взлом почты, взлом ru, проги взлома, хакер, программа взлома, трояны, программирование

Хакер, взлом, программа, сайт, форум, информатика, железо, разгон, раскрутка, SEO, защита, безопасность, взломать, как взломать, взлом icq, взлом вконтакте, взлом программ, одноклассники, взлом почты, взлом аськи
Текущее время: 18-05, 22:49

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: WinApi - работа с файлами
СообщениеДобавлено: 02-03, 17:33 
Не в сети
<b><font color=red>Admin</font></b>
Аватара пользователя

Зарегистрирован: 22-05, 15:38
Сообщения: 1901
В течении нескольких статей я познакомлю тебя с основными функциями WinApi. Не пугайся, в этом нет ничего сложного. Я сам когда первый раз услышал про WinApi (Delphi я изучаю с октября 2007 года) перепугался до полного ужаса и стал параноиком, на неделю=) Шучу... WinApi - это всеголиш набор библиотечных функций виндовс. В статьях я буду приводить примеры на дельфи и на C++... C++ я знаю слабо, но все же для любителей именно этого языка программирования, я нашел помучал гугл малехо=)

Итак... преступим...
------------->
Первая функция, с которой я хочу вас познакомить CopyFile...
Она копирует файл в новое место, при этом старый файл не затирает...
Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для С/С++

BOOL CopyFile(
LPCTSTR lpExistingFileName, // Указатель на файл, который надо копировать
LPCTSTR lpNewFileName, // Указатель на имя файла, куда надо копировать
BOOL bFailIfExists // Чё делать если файл уже существует.
);

Для Delphi

function CopyFile(
lpExistingFileName, // Указатель на файл, который надо копировать
lpNewFileName: PChar; // Указатель на имя файла, куда надо копировать
bFailIfExists: BOOL // Чё делать если файл уже существует.
): BOOL; stdcall;

Первый и второй параметр содержат полные имена к файлам. Третий параматр указывает, что нужно делать, если файл уже существует. Если он равен TRUE, то произойдёт ошибка, если FALSE, то существующий файл будет перезаписан.

Вот сразу примерчик на дельфи:
CopyFile('test1.txt', 'c:text1.txt', false); - если не указать путь к файлу, то он будет искаться в директории в которой находиться программа... Если все пучком то функция вернет true иначе false
<-------------
------------->
Следующая CreateDirectory
Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.

Для С/С++

BOOL CreateDirectory(
LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории
LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты
);

Для Delphi

function CreateDirectory(
lpPathName: PChar; // Указатель на строку содержащую путь к новой директории
lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты
): BOOL; stdcall;
Если все нормально, то функция вернет true
<-------------
------------->
Есть еще одна функция, которая расширяет возможности предыдущей CreateDirectoryEx

Для С/С++

BOOL CreateDirectoryEx(
LPCTSTR lpTemplateDirectory,// Указатель на директорию-шаблон
LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории
LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты
);

Для Delphi

function CreateDirectoryEx(
lpPathName: PChar; // Указатель на строку содержащую путь к шаблону
lpPathName: PChar; // Указатель на строку содержащую путь к новой директории
lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты
): BOOL; stdcall;

Возвращает true при успешном исходе)
<-------------
------------->
Следующая функция CreateFile
Функция создаёт указатель на новое устройство типа:
Файл
Канал
mailslot (почтовый канал)
комуникационный ресурс (например COM порт)
дисковые устройства (только для Windows NT)
консоли
директории (открывает их)

Функция умеет открывать и создавать новые файлы.

Для С/С++

HANDLE CreateFile(
LPCTSTR lpFileName, // Указатель на имя файла (устройства)
DWORD dwDesiredAccess, //Параметры доступа
DWORD dwShareMode, //Разделяемый доступ
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //безопасность
DWORD dwCreationDistribution,// Описание
DWORD dwFlagsAndAttributes, // Атрибуты файла
HANDLE hTemplateFile // Файл шаблона
);

Для Delphi

function CreateFile(
lpFileName: PChar; // Указатель на имя файла (устройства)
dwDesiredAccess, //Параметры доступа
dwShareMode: DWORD; //Разделяемый доступ
lpSecurityAttributes: PSecurityAttributes; //безопасность
dwCreationDisposition, // Описание
dwFlagsAndAttributes: DWORD; // Атрибуты файла
hTemplateFile: THandle // Файл шаблона
): THandle; stdcall;

Функция не легкая, поэтому тут я подробно распишу все параметры
lpFileName - Указатель на строку содержащую имя создаваемого файла или устройства.
dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько):
GENERIC_READ - получить доступ к чтению
GENERIC_WRITE - получить доступ к записи
dwShareMode - флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять достум между процессами. Это значит, как будет делится доступ к файлу с другими прогами если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько):
FILE_SHARE_DELETE - другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT).
FILE_SHARE_READ - другим процессам разрешается только читать файл
FILE_SHARE_WRITE - другим процессам разрешается только писать в файл
lpSecurityAttributes - указатель на структуру типа SECURITY_ATTRIBUTES. Этот параметр используется только в Windows NT, в Win9x он игнорируется.
dwCreationDistribution - описывает, что делать с файлом если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация недопускается):
CREATE_NEW - создать новый файл. Если он уже существует, то произойдёт ошибка
CREATE_ALWAYS - а я сказал создать новый файл. Если файл существует, то он будет перезаписан (обнулён).
OPEN_EXISTING - открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка.
OPEN_ALWAYS - а я сказал открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW.
TRUNCATE_EXISTING - открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка.
dwFlagsAndAttributes - атрибуты создаваемого файла. Параметр может принимать комбинацию из значений:
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_ARCHIVE - архивный
FILE_ATTRIBUTE_COMPRESSED - сжатый
FILE_ATTRIBUTE_HIDDEN - скрытый
FILE_ATTRIBUTE_NORMAL - нормальный
FILE_ATTRIBUTE_OFFLINE - данные файла недоступны
FILE_ATTRIBUTE_READONLY - только для чтения
FILE_ATTRIBUTE_SYSTEM - системный
FILE_ATTRIBUTE_TEMPORARY - временный
FILE_FLAG_WRITE_THROUGH - возможность записи в файл через кэш.
FILE_FLAG_NO_BUFFERING - нельзя использовать буферы или кэш
FILE_FLAG_RANDOM_ACCESS - случайный доступ. Используется для оптимизации кэша
FILE_FLAG_SEQUENTIAL_SCAN - доступ к файлу может быть последовательный от начала до конца
FILE_FLAG_DELETE_ON_CLOSE - операционная система должна удалить файл, когда все указатели на файл будут закрыты
FILE_FLAG_BACKUP_SEMANTICS - Backup файл, т.е. файл резервного копирования.
FILE_FLAG_POSIX_SEMANTICS - доступ осуществляется в POSIX стандарте.
SECURITY_SQOS_PRESENT
SECURITY_ANONYMOUS - анонимный доступ
SECURITY_IDENTIFICATION - идентификационный доступ
SECURITY_IMPERSONATION - персональный доступ
SECURITY_DELEGATION - колективный доступ
SECURITY_CONTEXT_TRACKING - динамический режим доступа
SECURITY_EFFECTIVE_ONLY - ограничение груп и привелегий
hTemplateFile - файл шаблона

Если функция выполнилась без проблем, то она возвращает указатель на открытое (созданное) устройства. Через этот указатель ты получаешь доступ к файлу.

Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE.
<-------------
------------->
Следующая функция простенькая, но её часто используют всякие там червячки(лично в основе моего первого червяка лежала именно эта функция DeleteFile =)))
Для С/С++

BOOL DeleteFile(
LPCTSTR lpFileName // Указатель на строку с полным именем файла
);

Для Delphi

function DeleteFile(
lpFileName: PChar// Указатель на строку с полным именем файла
): BOOL; stdcall;

Если всё ничтяк, то функция вернёт TRUE
<-------------
------------->
Следующий набор функция достаточно сложновати предназначен он для поиска определенных файлов на венике пользователя (эти функции тоже использовались в моем первом червячке)))

FindFirstFile
Функция запускает поиск файла в указанной директории.
Для С/С++

HANDLE FindFirstFile(
LPCTSTR lpFileName, // Строка содержащая путь для поиска файлов.
LPWIN32_FIND_DATA lpFindFileData // Информация о файле
);

Для Delphi

function FindFirstFile(
lpFileName: PChar; // Строка содержащая путь для поиска файлов.
var lpFindFileData: TWIN32FindData // Информация о файле
): THandle; stdcall;

Я предлагаю рассмотреть параметры подробнее
lpFileName - строка содержащая путь для поиска файла. Эта строка может указывать наконкретный файл типа 'c:filename.txt' или может хранить шаблон 'c:*.txt'. Если ты указываешь шаблон, то это даёт возможность перечислить все файлы удовлетворяющие шаблону.
lpFindFileData - структура WIN32_FIND_DATA, в которую будет записана инфа о найденом файле.

Расмотрим структуру WIN32_FIND_DATA немного подробнее:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; // Атрибуты файла
FILETIME ftCreationTime; // Время создания
FILETIME ftLastAccessTime; //Время последнего доступа
FILETIME ftLastWriteTime; //Время последней записи в файл
DWORD nFileSizeHigh; //Верхний байт размера файла
DWORD nFileSizeLow; //Нижний байт размера файла
DWORD dwReserved0; //Зарезервировано
DWORD dwReserved1; //Зарезервировано
TCHAR cFileName[ MAX_PATH ]; //Имя файла
TCHAR cAlternateFileName[ 14 ]; //Имя файла для отображения в DOS (8:3)
} WIN32_FIND_DATA;

Атрибутами файла может быть комбинация из флагов:
FILE_ATTRIBUTE_ARCHIVE - архивный
FILE_ATTRIBUTE_COMPRESSED - сжатый
FILE_ATTRIBUTE_HIDDEN - скрытый
FILE_ATTRIBUTE_NORMAL - нормальный
FILE_ATTRIBUTE_OFFLINE - данные файла недоступны
FILE_ATTRIBUTE_READONLY - только для чтения
FILE_ATTRIBUTE_SYSTEM - системный
FILE_ATTRIBUTE_TEMPORARY - временный

Размер файла разложен на два байта. Чтоб получить полный размер файла нужно выполнить действие (FInfo.nFileSizeHigh * MAXDWORD) + FInfo.nFileSizeLow. Это не самый эффективный (эффективнее сдвигать), но самый понятный способ.

Функция возвращает указатель на найденный файл, если нет то возврат будет типа ERROR_NO_MORE_FILES.
<-------------
------------->
Следующая функция опять связана с поиском файлов на венике... Это FindNextFile
Она продолжает поиск начатый с помощью FindFirstFile.

Для С/С++

BOOL FindNextFile(
HANDLE hFindFile, // Указатель на файл из предыдущего поиска
LPWIN32_FIND_DATA lpFindFileData // Информация о файле
);

Для Delphi

function FindNextFile(
hFindFile: THandle; // Указатель на файл из предыдущего поиска
var lpFindFileData: TWIN32FindData // Информация о файле
): BOOL; stdcall;

Со вторым параметром всё ясно, он такой же, как и у FindFirstFile. А вот первый - это указатель на файл из предыдущего поиска. Он нужен, чтобы функция FindNextFile знала на каком файле ты остановил поиск и какой надо найти следующим. Немного позже мы расмотрим реальный пример, чтобы тебе стало понятнее.
Если всё ничтяк, то функция вернёт TRUE
<-------------
------------->
И завершающая функция для предыдущих двух FindClose
Функция завершает поиск файлов.

Для С/С++

BOOL FindClose(
HANDLE hFindFile // Указатель на последний найденный файл
);

Для Delphi

function FindClose(
hFindFile: THandle // Указатель на последний найденный файл
): BOOL; stdcall;

При не летальном исходе возвратит true
<-------------
Код:
И сразу небольшой примерчик, для использования первых трех функций
var
FileName: string;
FindHandle:THandle;
SearchRec:TWIN32FindData;
begin
try
FindHandle := FindFirstFile('c:*.*', SearchRec);
if SearchRec.FindHandle <> INVALID_HANDLE_VALUE then
repeat
FileName:=SearchRec.cFileName
until FindNextFile(FindHandle,SearchRec)=false;
finally
Windows.FindClose(FindHandle);
end;
end;
Впринципе ничего особо тяжкого, стоит лишь немного напрячь мозги(если таковы имеюццо=))

------------->
Следующая функция, с которой я тебя познакомлю будет GetCurrentDirectory
Она очень проста, и возвращает директорию, с которой работает твоя прога! Подчеркиваю "С которой", а не " В которой"

Для С/С++

DWORD GetCurrentDirectory(
DWORD nBufferLength, // Размер буфера, в котором будет храниться путь
LPTSTR lpBuffer // Сам буфер
);

Для Delphi

function GetCurrentDirectory(
nBufferLength: DWORD; // Размер буфера, в котором будет храниться путь
lpBuffer: PChar // Сам буфер
): DWORD; stdcall;

Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт длину lpBuffer в котором хранится путь текущей директории.
<-------------
Пока на сегодня все... В этой статье в основном функции для работы с файлами, но ничего страшно - это знать надо, хорошему программисту... Вы спросите меня "А на кой фиг нужна эта самая WinApi?" для тех кто в танке я отвечу, что знание WinApi очень нужны, а еще с помощью WinApi можно писать программы маленького размера, именно так, мой первый червячек весил 14КБ))) Спешиал фор HackZona)


Автор poput4ik


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by Forumenko © 2006–2014
Русская поддержка phpBB