- •Минобрнауки россии
- •Е.В. Грачева Системное программное обеспечение персональных эвм
- •1 Программирование в операционной среде
- •1.1 Программирование в среде однозадачной операционной системы
- •1.2 Программирование в среде ос Windows
- •1.2.1 Основные понятия
- •1.2.2 Программный интерфейс
- •1.2.2.1 Сообщения, очередь сообщений
- •1.2.2.2 Процедура окна
- •1.2.3 Использование динамических библиотек
- •1.2.3.1.Описание api-функции LoadLibrary
- •1.2.3.2 Описание функции GetProcAddress
- •1.2.3.3 Описание функции FreeLibrary
- •1.2.4 Описание некоторых api-функций
- •1.2.4.1.Функции для создания пользовательского интерфейса
- •1.2.4.1.1 Ввод данных с клавиатуры
- •1.2.4.1.2 Ввод данных с помощью "мыши"
- •1.2.4.1.3 Диалоговые окна
- •1.2.4.2 Функции для получения информации о системе
- •1.2.4.2.1 Информация об аппаратной конфигурации
- •1.2.4.2.3 Конфигурация ос
- •1.2.4.2.4 Системные параметры
- •1.2.4.2.5 Внешний вид системных элементов
- •1.2.4.3 Функции управления памятью
- •1.2.4.3.1 Основные функции управления памятью
- •1.2.4.4.Функции управления файлами
- •1.2.4.4 Функции управления некоторыми устройствами
- •Контрольные вопросы
- •35. Охарактеризовать функцию для определения конфигурации ос
- •36. Охарактеризовать функции об установке системных параметров.
- •2.Ассемблеры
- •2.1 Архитектура процессоров ia-32
- •2.1.1.Основная исполнительная среда микропроцессора с архитектурой ia32
- •2.1.2 Режимы работы и используемая модель памяти процессоров с архитектурой ia32
- •2.1.3 Архитектура ia-32 системного уровня
- •2.2.Программирование на языке ассемблера
- •2.2.1 Метки
- •2.2.2 Директивы
- •2.2.3 Формат команды
- •2.2.4 Система команд микропроцессоров с архитектурой ia32
- •2.2.4.1 Команды пересылки данных
- •Ins строка, dx
- •2.2.4.2 Арифметические операции
- •2.2.4.3 Операции сдвига
- •2.2.4.4 Битовые операции
- •2.2.4.5 Команды для организации циклов
- •1.3.1.1 Команды сравнения
- •2.2.4.6 Команды передачи управления
- •2.2.4.7 Системные команды
- •2.2.4.8 Команды математического сопроцессора
- •2.2.5 Технология программирования
- •2.3 Макроязыки
- •3.Трансляторы
- •3.1 Структура компиляторов и интерпретаторов, лексический, синтаксический и семантический анализаторы, генератор кода
- •3.1.1.Распределение памяти, виды переменных
- •3.1.2.Статическое и динамическое связывание
- •3.2 Загрузчики
- •3.2.1 Функции загрузчика
- •3.2.1 Настраивающий и динамический загрузчики
- •3.3 Подключение библиотек
- •4. Формальные языки и грамматики
- •4.1 Типы грамматик
- •4.1.1 Вывод цепочек
- •4.1.2 Конечный и магазинный автоматы, распознаватели и преобразователи, построение автомата по заданной грамматике
- •Приложения Приложение а
- •Оглавление
- •4. Формальные языки и грамматики
1.2.4.2.3 Конфигурация ос
Инициализационные файлы, файлы помощи и приложения Windows находятся в каталоге Windows. В общем случае, этот каталог может находиться где угодно, поэтому в некоторых случаях может возникнуть задача поиска каталога Windows. Путь к этому каталогу можно найти с помощью функции GetWindowsDirectory.
В качестве входного параметра этой функции задаются: указатель на буфер (строку), в которую будет занесен искомый путь и размер этого буфера в символах не включая завершающий эту строку 0. С учетом того, что функция GetWindowsDirectory существует как в Unicode (GetWindowsDirectoryW), так и в ANSI (GetWindowsDirectoryA) форматах, размер символа будет разным - для Unicode он составит 16 бит, для ANSI - 8 бит.
Таким образом, в сегменте данных объявляются необходимые данные
PATH_BUF DB 255 DUP (0); буфер данных для хранения строки с адресом каталога Windows
PATH_LEN DD 255; длина буфера данных для хранения строки с адресом каталога Windows
А в тексте программы вызов функции осуществляется следующим образом:
PUSH PATH_LEN;
PUSH OFFSET PATH_BUF;
CALL GetWindowsDirectoryA@8;
Динамические библиотеки, драйвера и шрифты хранятся в системном каталоге Windows (обычно System32). Определить путь к системному каталогу Windows можно с помощью функции GetSystemDirectory. Данная функция аналогична функции GetWindowsDirectory. Использовать ее можно следующим образом:
Содержимое сегмента данных не изменяется:
PATH_BUF DB 255 DUP (0); буфер данных для хранения строки с адресом систменого каталога Windows
PATH_LEN DD 255; длина буфера данных для хранения строки с адресом системного каталога Windows
А в тексте программы вызов функции осуществляется следующим образом:
PUSH PATH_LEN;
PUSH OFFSET PATH_BUF;
CALL GetSystemDirectoryA@8;
Для определения имени пользователя, в настоящее время работающего с ОС и от имени которого запускается поток, содержащий функцию определения имени пользователя, используется функция GetUserName. Имя пользователя - это либо имя под которым он начал сеанс, либо полное имя пользователя. В качестве входного параметра задается размер строки и указатель на строку, хранящую имя пользователя. Размер строки выражается в символах. В этой же переменной функция возвращает реальное число символов, из которых состоит имя пользователя. Поскольку функция GetUserName может быть использована как в Unicode (GetUserNameW), так и в ANSI (GetUserNameA) версиях, длина строки символов в байтах может представлять собой разные значения. Максимальное число символов, используемое для задания имени пользователя, определено в заголовочном файле Lmcons.h, поставляемом в составе среды проектирования Microsoft Visual Studio, равным 256. Исходя из этого значения и следует задавать максимальную длину имени пользователя.
Таким образом, в сегменте данных объявляются необходимые данные
NAME_BUF DB 255 DUP (0); буфер данных для хранения строки с именем пользователя
NAME_LEN DD 257; длина буфера данных для хранения строки с именем пользователя - максимальный размер (256) +1
А в тексте программы вызов функции осуществляется следующим образом:
PUSH NAME_LEN;
PUSH OFFSET NAME_BUF;
CALL GetUserNameA@8;
В случае успешного выполнения функции GetUserName в буферной строке будет находиться цепочка символов - имя пользователя, в переменной NAME_LEN - число символов, составляющих имя пользователя, включая 0, а в регистре EAX - ненулевое значение. Если функции GetUserName успешно выполниться не удалось (задан слишком маленький буфер или по каким-то другим причинам) то в регистре EAX будет возвращен 0.
