Джеффри РИХТЕР
WINDOWS
Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
Замечания по электронной версии
ЧАСТЬ 1 Материалы для обязательного чтения
Вы тоже можете это сделать
Наборы символов
Одно- и двухбайтовые наботы символов
Unicode: набор "широких" символов
Почему Unicode?
Windows 2000 и Unicode
Windows 98 и Unicode
Windows CE и Unicode
В чью пользу счет?
Unicode и COM
Как писать программу с использованием Unicode
Unicode и библиотека С
Типы данных, определенные в Windows для Unicode
Unicode- и ANSI-функции в Windows
Строковые функции Windows
Создание программ, способных использовать и ANSI, и Unicode
Ресурсы
Текстовые файлы
Перекодировка строк из Unicode в ANSI и обратно
Что такое объект ядра
Учет пользователей объектов ядра
Защита
Таблица описателей объектов ядра
Создание объекта ядра
Закрытие объекта ядра
Совместное использование объектов ядра несколькими процессами
Наследование описателей объекта
Именованные объекты
Дублирование описателей объектов
ЧАСТЬ 2
НАЧИНАЕМ РАБОТАТЬ
Ваше первое Windows-приложение
Описатель экземпляра процесса
Описатель предыдущего экземпляра процесса
Командная строка процесса
Переменные окружения
Привязка к процессорам
Режим обработки ошибок
Текущие диск и каталог для процесса
Определение версии системы
Функция CreateProcess
Параметр pszAppticationName и pszCommandLine
Параметр psaProcess, psaThread и bInhentHaneiles
Параметр fdwCreate
Параметр pvEnviroment
Параметр pszCurDir
Параметр pszStartlnfo
Пapaметр ppiProcInfo
Завершение процесса
Возврат управления входной функцией первичного потока
Функция ExitProcess
Функция TerminateProcess
Когда все потоки процесса уходят
Что происходит при завершении процесса
Дочерние процессы
Запуск обособленных дочерних процессов
Перечисление процессов, выполняемых всистеме
Программа-пример ProcessInfo
Определение ограничений налагаемых на процессы взадании
Включение процесса в задание
Завершение всех процессов в задании
Получение статистической информации о задании
Уведомления заданий
Программа-пример JobLab
ГЛАВА 6 Базовые сведения о потоках
В каких случаях потоки создаются
И в каких случаях потоки не создаются
Ваша первая функция потока
Функция СrеаtеThread
Параметр psa
Параметр cbStack
Параметры pfnStartAddr и pvParam
Параметр fdwCreate
Параметр pdwThreadID
Завершение потока
Возврат управления функцией потока
Функция ExitThread
Функция TerminateThread
Если завершается процесс
Что происходит при завершении потока
Кое-что о внутреннем устройстве потока
Некоторые соображения по библиотеке С/С++
Ой, вместо _beginthreadex я по ошибке вызвал CreateThread
Библиотечные функции, которые лучше не вызьшать
Как узнать о себе
Преобразование псевдоописателя в настоящий описатель
ГЛАВА 7 Планирование потоков, приоритет и привязка к процессорам
Приостановка и возобновление потоков
Приостановка и возобновление процессов
Функция Sleep
Переключение потоков
Определение периодов выполнения потока
Структура CONTEXT
Приоритеты потоков
Абстрагирование приоритетов
Программирование приоритетов
Динамическое изменение уровня приоритета потока
Подстройка планировщика для активного процесса
Программа-пример Scheduling Lab
Привязка потоков к процессорам
ГЛАВА 8 Синхронизация потоков в пользовательском режиме
Атомарныйдоступ: семейство Interlocked-функций
Кэш-линии
Более сложные методы синхронизации потоков
Худшее, что можно сделать
Критические секции
Критические секции: важное дополнение
Критические секции и спин-блокировка
Критические секции и обработка ошибок
Несколько полезных приемов
ГЛАВА 9 Синхронизация потоков с использованием объектов ядра
Wait-функции
Побочные эффекты успешного ожидания
События
Программа-пример Handshake
Ожидаемые таймеры
Ожидаемые таймеры и АРС-очередь
И еще кое-что о таймерах
Семафоры
Мьютексы
Мьютексы и критические секции
Программа-пример Queue
Сводная таблица объектов, используемых для синхронизации потоков
Другие функции, применяемые в синхронизации потоков
Асинхронныйввод-выводнаустройствах
Функция WaitForlnputIdle
Функция MsgWatiForMultipleObjects(Ex)
Функция WaitForDebugEvent
Функция SignalObjectAndWait
ГЛАВА 10 Полезные средства для синхронизации потоков
Реализация критической секции: объект-оптекс
Программа-пример Optex
Создание инверсных семафоров и типов данных, безопасных в многопоточной среде
Программа-пример InterlockedType
Синхронизация в сценарии "один писатель/группа читателей"
Программу-пример SWMRG
Реализация функции WaitForMultipleExpressions
Программа-пример WaitForMultExp
Сценарий 1: асинхронный вызов функций
Сценарий 2: вызов функций через определенные интервалы времени
Программа-пример TimedMsgBox
Сценарий 3: вызов функций при освобождении отдельных объектов ядра
Сценарий 4: вызов функций по завершении запросов на асинхронный ввод-вывод
Работа с волокнами
Программа-пример Counter
ЧАСТЬ III УПРАВЛЕНИЕ
ПАМЯТЬЮ
ГЛАВА 13 Архитектура памяти в Windows
Виртуальное адресное пространство процесса
Как адресное пространство разбивается на разделы
Раздел для выявления нулевых указателей (Windows 2000 и Windows 98)
Раздел для совместимости с программами DOS и 16-разрядной Windows (только Windows 98)
Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98)
Зaкpытый paздeл paзмеpoм 64Kб (тoлько Windows2000)
Раздел для общих MMF (только Windows 98)
Раздел для кода и данных режима ядра (Windows 2000 и Windows 98)
Регионы в адресном пространстве
Передача региону физической памяти
Физическая память и страничный файл
Физическая память в страничном файле не хранится
Атрибуты защиты
Защита типа «копирование при записи»
Специальные флаги атрибутов защиты
Подводя итоги
Блоки внутри регионов
Ocoбeнности адресного пространства в Windows98
Выравнивание данных
ГЛАВА 14 Исследование виртуальной памяти
Системная информация
Программа-пример SysInfo
Статус виртуальной памяти
Программа-пример VMStat
Определение состояния адресного пространства
Функция VMQuery
Программа-пример VММар
ГЛАВА 15 Использование виртуальной памяти в приложениях
Резервирование региона в адресном пространстве
Передача памяти зарезервированному региону
Резервирование региона с одновременной передачей физической памяти
В какой момент региону передают физическую память
Возврат физической памяти и освобождение региона
В какой момент физическую память возвращают системе
Программа-пример VMAlloc
Изменение атрибутов защиты
Сброс содержимого физической памяти
Программа-пример MemReset
Механизм Address Windowing Extensions (только Windows 2000)
Программа-пример AWE
Стек потока в Windows 98
Функция из библиотеки С/С++ для контроля стека
Программа-пример Summation
ГЛАВА 17 Проецируемые в память файлы
Проецирование в память EXE- и DLL-файлов
Статические данные нс разделяются несколькими экземплярами EXE или DLL
Статические данные разделяются несколькими экземплярами EXE или DLL
Программа-пример AppInst
Файлы данных, проецируемые в память
Метод 1; один файл, один буфер
Метод 2. два файла, один буфер
Метод 3: один файл, два буфер
Метод 4: один файл и никаких буферов
Использование проецируемых в память файлов
Этап 1: создание или открытие объекта ядра «файл»
Этап 2: создание объекта ядра «проекция файла»
Этап 3: проецирование файловых данных па адресное пространство процесса
Этап 4: отключение файла данных от адресного пространства процесса
Этапы 5 и 6: закрытие объектов «проекция файла» и «файл"
Программа-пример FileRev
Обработка больших файлов
Проецируемые файлы и когерентность
Базовый адрес файла, проецируемого в память
Особенности проецирования файлов на разных платформах
Совместный доступ процессов к данным через механизм проецирования
Файлы, проецируемые на физическую память из страничного файла
Программа-пример MMFShare
Частичная передача физической памяти проецируемым файлам
Программа-пример MMFSparse
ГЛАВА 18 Динамически распределяемая память
Стандартная куча процесса
Дополнительные кучи в процессе
Защита компонентов
Более эффективное управление памятью
Локальный доступ
Исключение издержек, связанных с синхронизацией потоков
Быстрое освобождение всей памяти в куче
Создание дополнительной кучи
Выделение блока памяти из кучи
Изменение размера блока
Определение размера блока
Освобождение блока
Уничтожение кучи
Использование куч в программах на С++
Другие функции управления кучами
ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
DLL и адресное пространство процесса
Общая картина
Создание DLL-модуля
Что такое экспорт
Создание DLL для использования с другими средствами разработки (отличными от Visuai С++)
Создание ЕХЕ-модуля
Что такое импорт
Выполнение ЕХЕ-модуля
ГЛАВА 20 DLL: более сложные методы программирования
Явная загрузка DLL и связывание идентификаторов
Явная загрузка DLL
Явная выгрузка DLL
Явное подключение экспортируемого идентификатора
Функция входа/выхода
Уведомление DLL_PROCESS_ATTACH
Уведомление DLL_PROCESS_DETACH
Уведомление DLL_THREAD_ATTACH
Уведомление DLL_THREAD_DETACH
Как система упорядочивает вызовы DllMain
Функция DllMain и библиотека С/С++
Отложенная загрузка DLL
Программа-пример DelayLoadApp
Переадресация вызовов функций
Известные DLL
ПepeнaпpaвлeниeDLL
Модификация базовых адресов модулей
Связывание модулей
ГЛАВА 21 Локальная память потока
Динамическая локальная память потока
Использование динамической TLS
Статическая локальная память потока
ГЛАВА 22 Внедрение DLL и перехват API-вызовов
Пример внедрения DLL
Внедрение DLL с использованием реестра
Внедрение DLL с помощью ловушек
Утилита для сохранения позиций элементов на рабочем столе
Внедрение DLL спомощьюудаленныхпотоков
Программа-пример InjLib
Библиотека ImgWalk.dll
Внедрение троянской DLL
Внедрение DLL как отладчика
Внедрение кода в среде Windows 98 через проецируемый в память файл
Внедрение кода через функцию CreateProcess
Перехват API-вызовов: пример
Перехват API-вызовов подменой кода
Перехват API-вызовов с использованием раздела импорта
Программа-пример LastMsgBoxInfo
ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ
ГЛАВА 23 Обработчики завершения
Примеры использования обработчиков завершения
Funcenstein1
Funcenstein2
Funcenstein3
Funcfurter1
Проверьте себя: FuncaDoodleDoo
Funcenstein4
Funcaramal
Funcarama2
Funcarama3
Funcarama4- последний рубеж
И еще о блоке finally
Funcfurter2
Программа-пример SEHTerm
ГЛАВА 24 Фильтры и обработчики исключений
Примеры использования фильтров и обработчиков исключений
Funcmeisterl
Funcmeister2
EXCEPTION_EXECUTE_HANDLER
Некоторые полезные примеры
Глобальная раскрутка
Остановка глобальной раскрутки
EXCEPTION_CONTINUE_EXECUTION
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
Функция GetExceprtonCode
Функция GetExceptionlnformation
Программные исключения
ГЛАВА 25 Необработанные исключения и исключения С++
Отладка по запросу
Отключениевыводасообщенийобисключении
Принудительное завершение процесса
Создание оболочки вокруг функции потока
Создание оболочки вокруг всех функций потоков
Автоматический вызов отладчика
Явный вызов функции UnhandledExceptionFilter
Функция UnhandledExceptionFilter изнутри
Исключения и отладчик
Программа-пример Spreadsheet
Исключения С++ и структурные исключения
Перехват структурных исключений в С++
ЧАСТЬ VI ОПЕРАЦИИ С ОКНАМИ
Очередь сообщений потока
Посылка асинхронных сообщений в очередь потока
Посылка синхронных сообщений окну
Пробуждение потока
Флаги состояния очереди
Алгоритм выборки сообщений из очереди потока
Пробуждение потока с использованием объектов ядра или флагов состояния очереди
Передача данных через сообщения
Программа-пример CopyData
Как Windows манипулирует с ANSI/Unicode-символами и строками
ГЛАВА 27 Модель аппаратного ввода и локальное состояние ввода
Поток необработанного ввода
Локальное состояние ввода
Ввод с клавиатуры и фокус
Управление курсором мыши
Подключение к очередям виртуального ввода и переменным локального состояния ввода
Программа-пример LISLab
Программа-пример LISWatch
ПРИЛОЖЕНИЕ А Среда разработки
Заголовочный файл CmnHdr.h
Раздел Windows Version Build Option
Раздел Unicode Build Option
Раздел Windows Definitions и диагностика уровня 4
Вспомогательный макрос Pragma Message
Макросы chINRANGE и chDIMOF
Макросы BEGINTHREADEX
Моя реализация DebugBreak для платформы x86
Определение кодов программных исключений
Макрос chMB
Макросы chASSERT и chVERIFY .
Макрос chHANDLE_DLGMSG
Макрос chSETDLGTCONS
Встраиваемые функции для проверки версии операционной системы
Проверка на поддержку Unicode
Принудительное указание компоновщику входной функции (w)WinMain
ПРИЛОЖЕНИЕ Б Распаковщики сообщений, макросы для дочерних элементов управления и API-макросы
Макросы — распаковщики сообщений
Макросы для дочерних элементов управления
API-макросы