Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты Системное прогр Сымбат.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
595.46 Кб
Скачать

Экзаменационный билет № 2

1. Основы программирования в операционной системе Windows.

2. Создание, закрытие объекта ядра.

3. Включение процесса в задание

Экзаменационный билет № 3

1. Именованные объекты

2. Синхронизация кучи

В NT для синхронизации доступа к кучам (глава 5) предусмотрены две функции — HeapLock и HeapUnlock. В каждой из этих функций единственным аргументом является дескриптор. Эти функции удобно применять в тех случаях, когда используется флаг HEAP_NO_SERIALIZE, или когда потоку необходимы права исключительного доступа к куче.

3. Указатели файлов. Определение размера файла

Указатели файлов

В Windows аналогично тому, как это предусмотрено в UNIX, библиотеке С и почти любой другой ОС, для каждого дескриптора открытого файла поддерживается указатель файла (file pointer), отмечающий позицию текущего байта в данном файле. Именно эта позиция служит отправной точкой для последующей передачи данных при выполнении очередной операции WriteFile или ReadFile, что сопровождается увеличением значения указателя файла на соответствующее количество переданных байт. При открытии файла путем вызова функции CreateFile указатель файла принимает нулевое значение, отмечающее начало файла, которое изменяется по мере чтения или записи каждого очередного байта. Ключевую роль в обеспечении возможности прямого доступа к данным, хранящимся в файле, играет функция SetFilePointer, позволяющая устанавливать значения указателя файла.

Функция SetFilePointer является первой из функций, на примере которых мы познакомимся с обработкой 64-битовых указателей файлов NTFS. Методы, основанные на этой функции, не всегда удобны в применении, и поэтому функцию SetFilePointer проще всего использовать в случае небольших файлов.

DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod)

Возвращаемое значение: младшее двойное слово (DWORD, беззнаковое) нового значения указателя файла. Старшая часть значения этого указателя помещается в двойное слово, на которое указывает указатель lpDistanceToMoveHigh (если он отличен от NULL). В случае неудачного завершения функция возвращает значение 0xFFFFFFFF.

Определение размера файла

Размер файла можно получить, используя значение указателя файла, возвращаемое функцией SetFilePointer, если при вызове этой функции задать количество байтов, на которое должен быть перемещен указатель файла, равным 0. Для этой же цели можно воспользоваться также функцией GetFileSize. 

DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)

Возвращаемое значение: младшая компонента размера файла. Значение 0xFFFFFFFF указывает на возможную ошибку; для проверки наличия ошибок следует использовать функцию GetLastError.

Обратите внимание, что для возвращения размера файла используется, по сути, тот же способ, что и для возвращения фактического указателя файла функцией SetFilePointer.

Функции GetFileSize и GetFileSizeEx (возвращающая 64-битовое значение размера файла в одном элементе данных) требуют указания дескриптора, открытого для файла. Для определения размера файла можно применять также имя файла. Функция GetCompressedFileSize возвращает размер сжатого файла, тогда как функция FindFirstFile, которая обсуждается в разделе "Атрибуты файлов и управление каталогами" далее в этой главе, предоставляет точный размер именованного файла.

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, функция может работать

только с файлами, длина которых не превышает 2 32 -2. Этот параметр

используется также для возврата старшей части указателя файла. Младшая

часть — это возвращаемое значение функции.

dwMoveMethod определяет один из следующих режимов перемещения:

• FILE_BEGIN — позиция нового указателя отсчитывается от начала файла,

и DistanceToMove интерпретируется как число без знака.

• FILE_CURRENT — указатель перемещается вперед или назад от текущей

позиции на расстояние, определяемое DistanceToMove, которое

интерпретируется как число со знаком. Положительное значение

соответствует перемещению вперед.

• FILE_END — позиция отсчитывается назад или вперед от конца файла.

Эту функцию можно применять для определения длины файла, указывая

нулевое перемещение с конца файла.

Метод представления 64-разрядных позиций вызывает трудности, поскольку функция может возвращать как позицию в файле, так и код ошибки. Например, предположим, что позиция в файле равна 2 32 -1 (т.е. 0xFFFFFFFF) и что в вызове функции также указана старшая часть перемещения. Выяснить, что возвращает функция — действительную позицию в файле или указание на ошибку, можно с помощью GetLastError, которая при отсутствии ошибки возвращает NO_ERROR. Э ТО объясняет, почему длина файлов ограничивается значением 2 32 - 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, PWIN32_FIND_DATA lpffd)

Функция FindNextFile возвращает FALSE либо при недопустимых

параметрах, либо если соответствие данному образцу уже нельзя найти. В

последнем случае GetLastError возвращает ERROR_NO_MORE_FILES.

Когда поиск закончен, закройте дескриптор поиска. Не используйте для

этого функцию CloseHandle. Для закрытия дескрипторов поиска

предназначена функция :

BOOL FindClose (HANDLE hFindFile)

Функция GetFileInformationByHandle позволяет получить ту же

информацию для определенного файла, указав его открытый дескриптор.