
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
10.2 Управление каталогами
Создание или удаление каталога выполняется двумя простыми функциями.
BOOL CreateDirectory ( LPCTSTR lpszPath,
LPSECURITY___ATTRIBUTES lpsa) ;
BOOL RemoveDirectory (LPCTSTR lpszPath)
lpszPath указывает на строку с завершающим нулем, содержащую имя каталога, который должен быть создан или удален. Второй параметр (атрибуты безопасности) пока должен быть равен NULL. Удалить можно только пустой каталог.
Эта функция устанавливает каталог:
BOOL SetCurrentDirectory (LPCTSTR lpszCurDir)
lpszCurDir — путь к новому текущему каталогу. Это может быть относительный путь или полностью уточненный путь.
Следующая функция возвращает в буфер, заданный программистом, полностью уточненный путь.
DWORD GetCurrentDirectory (DWORD cchCurDir, LPTSTR lpszCurDir)
Возвращаемое значение: длина строки возвращенного пути или требуемый размер буфера, если он недостаточно велик; нуль при неудаче.
Параметры
cchCurDir — длина в символах (не в байтах) буфера для имени каталога. Длина должна учитывать завершающий нулевой символ. lpszCurDir указывает на буфер, в который записывается строка пути.
Возможности файловых систем не ограничиваются последовательной обработкой; они также могут обеспечивать прямой доступ, блокировку файлов, работу с каталогами и управление атрибутами файлов.
Указатели файлов
Windows для каждого открытого файла поддерживает указатель файла, обозначающий позицию текущего байта в файле. Следующая операция WriteFile или ReadFile начинает последовательное перемещение данных в файл или из файла с этой позиции и увеличивает указатель файла на количество переданных байтов. При открытии файла функцией CreateFile указатель обнуляется, указывая на начало файла, и продвигается вперед с каждой последующей операцией чтения или записи. Первое, что необходимо для прямого доступа к файлу, — это возможность установить указатель файла на произвольную позицию. Для этого предназначена функция SetFilePointer.
Данная функция демонстрирует, как Windows работает с 64-разрядной системой NTFS. Но эта методика не всегда хорошо подходит для SetFilePointer, поэтому SetFilePointer лучше всего применять для небольших файлов.
DWORD SetFilePointer ( HANDLE hFile, LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
Возвращаемое значение: младшая часть (DWORD без знака) нового указателя файла. Старшая часть нового указателя передается значению DWORD, на которое указывает lpDistanceToMoveHigh (если это не пустой указатель). В случае, ошибки функция возвращает значение 0xFFFFFFFF.
Параметры
hFile — дескриптор открытого файла с доступом для чтения или записи (или для обеих операций).
lDistanceToMove — значение, на которое перемещается указатель (типа long сo знаком), или позиция файла (без знака), в зависимости от значения dwMoveMethod.
lpDistanceToMoveHigh указывает на старшую часть значения перемещения. Если этот указатель равен NULL, функция может работать только с файлами, длина которых не превышает 232-2. Этот параметр используется также для возврата старшей части указателя файла. Младшая часть — это возвращаемое значение функции.
dwMoveMethod определяет один из следующих режимов перемещения:
FILE_BEGIN — позиция нового указателя отсчитывается от начала файла, и DistanceToMove интерпретируется как число без знака.
FILE_CURRENT — указатель перемещается вперед или назад от текущей позиции на расстояние, определяемое DistanceToMove, которое интерпретируется как число со знаком. Положительное значение соответствует перемещению вперед.
FILE_END — позиция отсчитывается назад или вперед от конца файла.
Эту функцию можно применять для определения длины файла, указывая нулевое перемещение с конца файла.
Метод представления 64-разрядных позиций вызывает трудности, поскольку функция может возвращать как позицию в файле, так и код ошибки. Например, предположим, что позиция в файле равна 232-1 (т.е. 0xFFFFFFFF) и что в вызове функции также указана старшая часть перемещения. Выяснить, что возвращает функция — действительную позицию в файле или указание на ошибку, можно с помощью GetLastError, которая при отсутствии ошибки возвращает NO_ERROR. Это объясняет, почему длина файлов ограничивается значением 232 - 2 байт, когда старшая часть перемещения не указана.
Другая причина затруднений состоит в том, что старшая и младшая части перемещения разделены и обрабатываются по-разному. Младшая часть адреса передается по значению и возвращается как значение функции, а старшая передается по ссылке как в функцию, так и из нее.
Атрибуты файлов и работа с каталогами
В каталоге можно искать файлы и другие каталоги, удовлетворяющие указанному образцу имени, а также получать атрибуты файлов. Для этого необходим дескриптор поиска, который возвращается функцией FindFirstFile. Для получения нужных файлов служит функция FindNextFile, а для завершения поиска — FindClose.
HANDLE FindFirstFile ( LPCSTSTR lpszSearchFile,
LPWIN32__FIND_DATA lpffd)
Возвращаемое значение: дескриптор поиска. INVALID_HANDLE_VALUE указывает на неудачу.
FindFirstFile ищет соответствие имени как среди файлов, так и среди подкаталогов. Возвращаемый дескриптор используется в последующем поиске.
Параметры
lpszSearchFile указывает на каталог или полное имя, которое может содержать подстановочные знаки (? и *).
lpffd указывает на структуру 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 cAlternateFiiename [14];
} WIN32_FIND_DATA;
dwFileAttributes можно проверить на соответствие значениям, приведенным в описании CreateFile. Далее следуют три значения времени (время создания файла, время последнего доступа и последней записи). Поля размера файла, содержащие его текущую длину, не требуют пояснений.
cFileName — это не полное имя, а собственно имя файла.
cAlternateFile — версия имени файла для DOS формата 8.3 (включая точку). Это то же сокращение имени файла, которое отображается в проводнике Windows. Оба имени — строки с завершающим нулем.
Часто требуется найти в каталоге файлы, имена которых удовлетворяют образцу, содержащему подстановочные знаки ? и *. Для этого нужно получить из FindFirstFile дескриптор поиска, который содержит информацию об искомом имени, и вызвать функцию FindNextFile.
BOOL FindNextFile ( HANDLE hFindFile, LPWIN32_FIND_DATA lpffd)
Функция FindNextFile возвращает FALSE либо при недопустимых параметрах, либо если соответствие данному образцу уже нельзя найти. В последнем случае GetLastError возвращает ERROR_NO_MORE_FILES.
Когда поиск закончен, закройте дескриптор поиска. Не используйте для этого функцию CloseHandle. Для закрытия дескрипторов поиска предназначена функция:
BOOL FindClose (HANDLE hFindFile)
Функция GetFileInformationByHandle позволяет получить ту же информацию для определенного файла, указав его открытый дескриптор.