Windows для профессионалов
Введение
Сегодняшние Windows-платформы
Ядро Windows 2000
Ядро Windows 98
Ядро Windows CE
Завтрашние Windows-платформы (64-разрядная Windows 2000)
Что нового в четвертом издании
В этой книге нет ошибок
Содержимое компакт-диска и требования к системе
Материалы для обязательного чтения
Вы тоже можете это сделать
Программа-пример ErrorShow
Глава 2 - Unicode
Наборы символов
Одно- и двухбайтовые наборы символов
Unicode: набор широких символов
Почему Unicode?
Windows 2000 и Unicode
Windows 98 и Unicode
Windows CE и Unicode
В чью пользу счет?
Unicode и СОМ
Как писать программу с использованием Unicode
Unicode и библиотека С
Типы данных, определенные в Windows для Unicode
Unicode- и ANSI-функции в Windows
Строковые функции Windows
Создание программ, способных использовать и ANSI, и Unicode
Ресурсы
Текстовые файлы
Перекодировка строк из Unicode в ANSI и обратно
Глава 3 - Объекты ядра
Что такое объект ядра
Учет пользователей объектов ядра
Защита
Таблица описателей объектов ядра
Создание объекта ядра
Закрытие объекта ядра
Совместное использование объектов ядра несколькими процессами
Наследование описателей объекта
Именованные объекты
Дублирование описателей объектов
Глава 4 - Процессы
Ваше первое Windows-приложение
Описатель экземпляра процесса
Описатель предыдущего экземпляра процесса
Командная строка процесса
Переменные окружения
Привязка к процессорам
Режим обработки ошибок
Текущие диск и каталог для процесса
Текущие каталоги для процесса
Определение версии системы
Функция CreateProcess
Параметры pszApplicationName и pszCommandLine
Параметры psaProcess, psaThread и blnheritHandles
Параметр fdwCreate
Параметр pvEnvironment
Параметр pszCurDir
Параметр psiStartlnfo
Параметр ppiProclnfo
Завершение процесса
Возврат управления входной функцией первичного потока
Функция ExitProcess
Функция TerminateProcess
Когда все потоки процесса уходят
Что происходит при завершении процесса
Дочерние процессы
Запуск обособленных дочерних процессов
Перечисление процессов, выполняемых в системе
Программа-пример Processlnfo
Глава 5 - Задания
Определение ограничений, налагаемых на процессы в задании
Включение процесса в задание
Завершение всех процессов в задании
Получение статистической информации о задании
Уведомления заданий
Программа-пример JobLab
Глава 6 - Базовые сведения о потоках
В каких случаях потоки создаются
И в каких случаях потоки не создаются
Ваша первая функция потока
Функция CreateThread
Параметр psa
Параметр cbStack
Параметры pfnStartAddr и pvParam
Параметр pdwThreadlD
Завершение потока
Возврат управления функцией потока
Функция ExitThread
Функция TerminateThread
Если завершается процесс
Что происходит при завершении потока
Кое-что о внутреннем устройстве потока
Windows для профессионалов
Некоторые соображения по библиотеке С/С++Ой, вместо _beginthreadex я по ошибке вызвал CreateThread
Библиотечные функции, которые лучше не вызывать
Как узнать о себе
Преобразование псевдоописателя в настоящий описатель
Глава 7 - Планирование потоков, приоритет и привязка к процессорам
Приостановка и возобновление потоков
Приостановка и возобновление процессов
Функция Sleep
Переключение потоков
Определение периодов выполнения потока
Структура CONTEXT
Приоритеты потоков
Абстрагирование приоритетов
Программирование приоритетов
Динамическое изменение уровня приоритета потока
Подстройка планировщика для активного процесса
Программа-пример Scheduling Lab
Привязка потоков к процессорам
Глава 8 - Синхронизация потоков в пользовательском режиме
Атомарный доступ: семейство Inferlockect-функций
Кэш-линии
Более сложные методы синхронизации потоков
Худшее, что можно сделать
Критические секции
Критические секции: важное дополнение
Критические секции и спин-блокировка
Критические секции и обработка ошибок
Несколько полезных приемов
ГЛАВA 9 Синхронизация потоков с использованием объектов ядра
Wait-функции
Побочные эффекты успешного ожидания
События
Программа-пример Handshake
Ожидаемые таймеры
Ожидаемые таймеры и АРС-очередь
И еще кое-что о таймерах
Семафоры
Мьютексы
Отказ от объекта-мьютекса
Мьютексы и критические секции
Программа-пример Queue
Сводная таблица объектов, используемых для синхронизации потоков
Другие функции, применяемые в синхронизации потоков
Асинхронный ввод-вывод на устройствах
Функция WaitForlnputldle
Функция MsgWaitForMultipleObjects(Ex)
Функция WaitForDebugEvent
Функция SignalObjectAndWait
Глава 10 - Полезные средства для синхронизации потоков
Реализация критической секции: объект-оптекс
Программа-пример Optex
Создание инверсных семафоров и типов данных, безопасных в многопоточной среде
Программа-пример lnterlockedType
Синхронизация в сценарии "один писатель/группа читателей"
Программа-пример SWMRG
Реализация функции WaitForMultipleExpressions
Программа-пример WaitForMultExp
Глава 11 - Пулы потоков
Сценарий 1: асинхронный вызов функций
Сценарий 2: вызов функций через определенные интервалы времени
Программа-пример TimedMsgBox
Сценарий 3: вызов функций при освобождении отдельных объектов ядра
Сценарий 4; вызов функций по завершении запросов на асинхронный ввод-вывод
ГЛАВА 12 Волокна
Работа с волокнами
Windows для профессионалов
Программа-пример CounterВиртуальное адресное пространство процесса
Как адресное пространство разбивается на разделы
Раздел для выявления нулевых указателей (Windows 2000 и Windows 98)
Раздел для совместимости с программами DOS и 16-разрядной Windows (только Windows 98)
Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98)
Закрытый раздел размером 64 Кб (только Windows 2000)
Раздел для общих MMF (только Windows 98)
Раздел для кода и данных режима ядра (Windows 2000 и Windows 98)
Регионы в адресном пространстве
Передача региону физической памяти
Физическая память и страничный файл
Физическая память в страничном файле не хранится
Атрибуты защиты
Защита типа "копирование при записи"
Специальные флаги атрибутов защиты
Подводя итоги
Блоки внутри регионов
Особенности адресного пространства в Windows 98
Выравнивание данных
Глава 14 - Исследование виртуальной памяти
Системная информация
Программа-пример SysInfo
Статус виртуальной памяти
Программа-пример VMStat
Определение состояния адресного пространства
Функция VMQuery
Программа-пример VMMap
Глава 15 - Использование виртуальной памяти в приложениях
Резервирование региона в адресном пространстве
Передача памяти зарезервированному региону
Резервирование региона с одновременной передачей физической памяти
В какой момент региону передают физическую память
Возврат физической памяти и освобождение региона
В какой момент физическую память возвращают системе
Программа-пример VMAIloc
Изменение атрибутов защиты
Сброс содержимого физической памяти
Программа-пример MemReset
Механизм Address Windowing Extensions (только Windows 2000)
Программа-пример AWE
Глава 16 - Стек потока
Стек потока в Windows 98
Функция из библиотеки С/С++ для контроля стека
Программа-пример Summation
ГЛАВА 17 Проецируемые в память файлы
Проецирование в память EXE- и DLL-файлов
Статические данные не разделяются несколькими экземплярами EXE или DLL
Статические данные разделяются несколькими экземплярами EXE или DLL
Программа-пример Applnst
Файлы данных, проецируемые в память
Метод 1: один файл, один буфер
Метод 2: два файла, один буфер
Метод 3: один файл, два буфера
Метод 4: один файл и никаких буферов
Использование проецируемых в память файлов
Этап1: создание или открытие объекта ядра "файл"
Этап 2: создание объекта ядра "проекция файла"
Этап 3: проецирование файловых данных на адресное пространство процесса
Этап 4: отключение файла данных от адресного пространства процесса
Этапы 5 и 6: закрытие объектов "проекция файла" и "файл"
Программа-пример FileRev
Обработка больших файлов
Проецируемые файлы и когерентность
Базовый адрес файла, проецируемого в память
Особенности проецирования файлов на разных платформах
Совместный доступ процессов к данным через механизм проецирования
Файлы, проецируемые на физическую память из страничного файла
Программа-пример MMFShare
Частичная передача физической памяти проецируемым файлам
Программа-пример MMFSparse
ГЛАВА 18 Динамически распределяемая память
Стандартная куча процесса
Дополнительные кучи в процессе
Защита компонентов
Более эффективное управление памятью
Локальный доступ
Исключение издержек, связанных с синхронизацией потоков
Быстрое освобождение всей памяти в куче
Создание дополнительной кучи
Выделение блока памяти из кучи
Изменение размера блока
Определение размера блока
Освобождение блока
Уничтожение кучи
Использование куч в программах на С++
Другие функции управления кучами
Глава 19 - DLL: основы
DLL и адресное пространство процесса
Общая картина
Создание DLL-модуля
Что такое экспорт
Windows для профессионалов
Создание DLL для использования с другими средствами разработки (отличными от Visual C++)Создание ЕХЕ-модуля
Что такое импорт
Выполнение ЕХЕ-модуля
ГЛАВA 20 DLL: более сложные методы программирования
Явная загрузка DLL и связывание идентификаторов
Явная загрузка DLL
Явная выгрузка DLL
Явное подключение экспортируемого идентификатора
Функция входа/выхода
Уведомление DLL_PROCESS_ATTACH
Уведомление DLL_PROCESS_DETACH
Уведомление DLL_THREAD_ATTACH
Уведомление DLL_THREAD_DETACH
Как система упорядочивает вызовы DIIMain
Функция DllMain и библиотека С/С++
Отложенная загрузка DLL
Программа-пример DelayLoadApp
Переадресация вызовов функций
Известные DLL
Перенаправление DLL
Модификация базовых адресов модулей
Связывание модулей
Глава 21 - Локальная память потока
Динамическая локальная память потока
Использование динамической TLS
Статическая локальная память потока
ГЛАВА 22 Внедрение DLL и перехват API-вызовов
Пример внедрения DLL
Внедрение DLL c использованием реестра
Внедрение DLL с помощью ловушек
Утилита для сохранения позиций элементов на рабочем столе
Внедрение DLL с помощью удаленных потоков
Программа-пример lnjLib
Библиотека lmgWalk.dll
Внедрение троянской DLL
Внедрение DLL как отладчика
Внедрение кода в среде Windows 98 через проецируемый в память файл
Внедрение кода через функцию CreateProcess
Перехват API-вызовов: пример
Перехват API-вызовов подменой кода
Перехват API-вызовов с использованием раздела импорта
Программа-пример LastMsgBoxlnfo
Глава 23 - Обработчики завершения
Примеры использования обработчиков завершения
Funcenstein1
Funcenstein2
Проверьте себя: FuncaDoodleDoo
Funcarama1
Funcarama4: последний рубеж
И еще о блоке finally
Программа-пример SEHTerm
Глава 24 - Фильтры и обработчики исключений
Примеры использования фильтров и обработчиков исключений
Funcmeister1
EXCEPTION_EXECUTE_HANDLER
Некоторые полезные примеры
Глобальная раскрутка
Остановка глобальной раскрутки
EXCEPTION_CONTINUE_EXECUTION
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
Функция GetExceptionCode
Функция GetExceptionlnformation
Программные исключения
Глава 25 - Необработанные исключения и исключения С++
Отладка по запросу
Отключение вывода сообщений об исключении
Принудительное завершение процесса
Создание оболочки вокруг функции потока
Создание оболочки вокруг всех функций потоков
Автоматический вызов отладчика
Явный вызов функции UnhandledExceptionFilter
Функция UnhandledExceptionFilter изнутри
Исключения и отладчик
Программа-пример Spreadsheet
Исключения С++ и структурные исключения
Исключения С++ и структурные исключения - 2
Перехват структурных исключений в С++
Глава 26 - Оконные сообщения
Очередь сообщений потока
Посылка асинхронных сообщений в очередь потока
Посылка синхронных сообщений окну
Пробуждение потока
Флаги состояния очереди
Windows для профессионалов
Алгоритм выборки сообщений из очереди потока
Пробуждение потока с использованием объектов ядра или флагов состояния очереди
Передача данных через сообщения
Программа-пример CopyData
Как Windows манипулирует с ANSI/Unicode-символами и строками
Глава 27 - Модель аппаратного ввода и локальное состояние ввода
Поток необработанного ввода
Локальное состояние ввода
Ввод с клавиатуры и фокус
Управление курсором мыши
Подключение к очередям виртуального ввода и переменным локального состояния ввода
Программа-пример LISLab
Программа-пример LISWatch
Turbo Pascal для начинающих - перейти
Предисловие - перейти
Задачи - перейти
Справочник - перейти
Приложение - перейти
Самоучитель по Tirbo Pascal - перейти
Как начать работу с Турбо Паскалем - перейти
Ваша первая программа - перейти
Иденитификаторы - перейти
Типы данных - перейти
Файлы - перейти
Указатели и динамическая память - перейти
Типизированные константы - перейти
Процедуры и функции - перейти
Модули - перейти