При выполнении данной лабораторной работы необходимо изучить и использовать следующие API- функции:
· Создание объекта FILE на базе существующего файла
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
Параметры этой API- функции:
lpFileName – имя открываемого файла;
dwDesiredAccess — GENERIC_READ, чтобы разрешить чтение с устройства. GENERIC_WRITE, чтобы разрешить запись на устройство (константы можно объединить).
Ноль, чтобы разрешить только получение информации об устройстве;
dwShareMode — 0 для запрета общего доступа, FILE_SHARE_READ и/или FILE_SHARE_WRITE для разрешения общего доступа к файлу;
lpSecurityAttributes — указатель на структуру, определяющую атрибуты безопасности файла (если они поддерживаются операционной системой);
dwCreationDistribution — одна из следующих констант: CREATE_NEW: создать файл. Если файл существует, происходит ошибка
CREATE_ALWAYS: создать файл. Предыдущий файл перезаписывается;
OPEN_EXISTING: открываемый файл должен существовать (обязательно используется для устройств)
OPEN_ALWAYS: создать файл, если он не существует TRUNCATE_EXISTING: существующий файл усекается до нулевой длины;
dwFlagsAndAttributes Long — комбинация следующих констант: FILE_ATTRIBUTE_ARCHIVE: установить архивный атрибут; FILE__ATTRIBUTE_COMPRESSED: помечает файл как подлежащий сжатию или задает сжатие для файлов каталога по умолчанию;
FILE_ATTRIBUTE_NORMAL: другие атрибуты файла не заданы;
FILE_ATTRJBUTE_HIDDEN: файл или каталог является скрытым;
FILE_ATTRIBUTE_READONLY: файл доступен только для чтения;
FILE_ATTRIBUTE_SYSTEM: файл является системным; FILE_FLAG_WRITE_THROUGH: операционная система не откладывает операции записи в файл; FILE_FLAG_OVERLAPPED: разрешить перекрывающиеся операции с файлом;
FILE_FLAG_NO_BUFFERING: запретить промежуточную буферизацию файла. Адреса буферов должны выравниваться по границам секторов для текущего тома; FILE_FLAG_RANDOM_ACCESS: буферизация файла оптимизируется для произвольного доступа;
|
FILE_FLAG_SEQUENTIAL_SCAN: буферизация файла оптимизируется для последовательного доступа;
FILE_FLAG_DELETE_ON_CL0SE: при закрытии последнего открытого дескриптора файл удаляется. Идеально подходит для временных файлов;
В Windows NT в комбинацию также можно включить следующие флаги: SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATI0N,SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTTVE_ONLY;
hTemplateFile — если параметр не равен нулю, он содержит дескриптор файла, с которого будут скопированы расширенные атрибуты нового файла.
Возвращаемое значение - дескриптор файла в случае успеха. INVALID_HANDLE_VALUE при ошибке. Устанавливает информацию GetLastError. Даже если функция завершилась успешно, но файл существовал и был задан флаг CREATE_ALWAYS или OPEN_ALWAYS, GetLastError возвращает ERROR_ALREADY_EXISTS.
Далее приведена структура, определяющая атрибуты безопасности файла:
typedef struct _SECURITY_ATTRIBUTES { // sa
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
· Создание объекта файлового отображения File-mapping
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
Рассмотрим параметры этой API- функции:
hFile – дескриптор файла, для которого создается отображение;
lpFileMappingAttributes — SECUR1TY_ATTRIBLITES — объект безопасности, используемый при создании файлового отображения. NULL для использования стандартных атрибутов безопасности;
flProtect — одна из следующих констант:
PAGE_READONLY: созданное файловое отображение доступно только для чтения;
|
PAGE_READWRITE: файловое отображение доступно для чтения и записи;
PAGE_WRITECQPY: разрешается копирование при записи; Также в комбинацию могут включаться следующие константы: SЕС_СОММГГ: для страниц секции выделяется физическое место в памяти или файле подкачки;
SEC_IMAGE: файл является исполняемым;
SEC_RESERVE: для страниц секции резервируется виртуальная память без фактического выделения.
dwMaximumSizeHigh — максимальный размер файлового отображения (старшие 32 бита);
dwMaximumSizeLow — максимальный размер файлового отображения (младшие 32 бита); Если параметры dwMaximumSizeHigh и dwMaximumSizeLow одновременно равны нулю, используется фактический размер файла на диске;
lpName — имя объекта файлового отображения. Если файловое отображение с заданным именем уже существует, функция открывает его.
Возвращаемое значение - дескриптор созданного объекта файлового отображения. Ноль в случае ошибки. Устанавливает информацию GetLastError. Даже если функция завершилась успешно, но возвращенный манипулятор принадлежит существующему объекту фазового отображения, GetLastError возвращает ERROR_ALREADY_EXISTS. В этом случае размер файлового отображении определяется размером существующего объекта, а не параметрами функции.
· Функция отображает объект файлового отображения в адресное пространство текущего процесса.
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
Рассмотрим параметры этой API- функции:
hFileMappingObject – дескриптор объекта файлового отображения;
dwDesiredAccess — одна из следующих констант:
|
FILE_MAP_WRITE: отображение доступно для чтения и записи. Объект файлового отображения должен быть создан с флагом PAGE_READWRITE;
FILE_MAP_READ: отображение доступно только для чтения. Объект файлового отображения должен быть создан с флагом PAGE_READ или PAGE_READWRITE; FILE_MAP_ALL_ACCESS: то же, что FILE_MAP_WRITE HLE_MAP_COPY: копирование при записи. В Windows 95 Обьект файлового отображения должен быть создан c флагом PAGE_WRITECOPY;
dwFileOffsetHigh — старшие 32 бита смещения в файле, с которого начинается отображение;
dwFileOffsetLow — младшие 32 бита смещения в файле, с которого начинается отображение;
dwNumberOfBytesToMap — количество отображаемых байт в файле. Ноль, чтобы использовать весь объект файлового отображения;
Возвращаемое значение - начальный адрес отображения в памяти. Ноль при ошибке. Устанавливает информацию GetLastError.
Комментарии: dwOffsetLow и dwOffsetHigh должны содержать смещение с учетом гранулярности выделения памяти в системе. Другими словами, если гранулярность памяти в системе равна 64 Кбайт (выделяемые блоки выравниваются по границе 64 Кбайт), значение должно быть кратно 64 Кбайт. Чтобы получить гранулярность выделения памяти в системе, воспользуйтесь функцией GetSystemlnfo. В большинстве приложений передается ноль, чтобы отображение начиналось с начала файла. Параметр IpBaseAddress также должен быть кратен значению гранулярности.
· Функция закрывает объект ядра. К числу объектов ядра относятся объекты файлов,файловых отображений, процессов, потоков, безопасности и синхронизации.
BOOL CloseHandle(
HANDLE hObject // дескриптор закрывамого объекта.
);
Возвращаемое значение - ненулевое значение в случае успеха, ноль при ошибке. Устанавливает информацию GetLastError.
Комментарии: Объекты ядра удаляются лишь после того, как будут закрыты все ссылки на них.
· Функция прекращает отображение объекта в адресное пространство текущего процесса.
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress // базовый адрес отображения, установленного ранее функцией MapViewOfFile
);
VOID CopyMemory (
PVOID Destination, // address of copy destination
CONST VOID *Source, // address of block to copy
DWORD Length // size, in bytes, of block to copy
);
СОДЕРЖАНИЕ ОТЧЕТА
1. Наименование лабораторной работы, ее цель.
2. Результаты исследования ОС с использованием Системного монитора (Monitor из пункта Administrative Tools):
· определить количество процессов, потоков, дескрипторов в ОС, изменить их число, запуская на выполнение новые приложения;
· определить процент работы в пользовательском режиме (% User Time), процент работы в привилегированном режиме (% Privileged Time) и процент времени бездействия при выполнении, связанными с интенсивными графическими операциями (например, откройте Windows Pain);
· включить в отчет полученные графики и привести их объяснение.
3. Разработанное программное обеспечение приложения, реализующего следующую задачу:
· Создать текстовый файл (можно с использованием notepad).
· Создать объект File на базе созданного в предыдущем пункте файла, используя АРI-функцию CreateFile. Вывести значение дескриптора объекта File.
· Используя дескриптор объекта File-mapping, а также API-функцию MapViewOf File отобразить части файла в память. Данная функция назначает область виртуальной памяти, выделяемой этому файлу. Базовый адрес выделенной области памяти является дескриптором представления этой области в виде отображения файла.
· Используя базовый адрес и функцию CopyMemory прочитайте информацию из отображаемого файла. Измените регистр текста в тестовом файле и запишите информацию в тот же файл.
· Закрыть все дескрипторы.
На экране должны фиксироваться все этапы работы созданного приложения.
4. Примеры разработанных приложений (результаты и тексты программ).