- •WINDOWS
- •Джеффри Рихтер
- •ЧАCTЬ I МАТЕРИАЛЫ ДЛЯ ОБЯЗАТЕЛЬНОГО ЧТЕНИЯ
- •ГЛАВА 1. Обработка ошибок
- •Вы тоже можете это сделать
- •Программа-пример ErrorShow
- •ГЛАВА 2 Unicode
- •Наборы символов
- •Одно- и двухбайтовые наборы символов
- •Unicode: набор широких символов
- •Почему Unicode?
- •Windows 2000 и Unicode
- •Windows 98 и Unicode
- •Windows CE и Unicode
- •В чью пользу счет?
- •Unicode и СОМ
- •Как писать программу с использованием Unicode
- •Unicode и библиотека С
- •Типы данных, определенные в Windows для Unicode
- •Unicode- и ANSI-функции в Windows
- •Строковые функции Windows
- •Ресурсы
- •Текстовые файлы
- •Перекодировка строк из Unicode в ANSI и обратно
- •ГЛАВА 3 Объекты ядра
- •Что такое объект ядра
- •Учет пользователей объектов ядра
- •Защита
- •Таблица описателей объектов ядра
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Совместное использование объектов ядра несколькими процессами
- •Наследование описателя объекта
- •Изменение флагов описателя
- •Именованные объекты
- •Пространства имен Terminal Server
- •Дублирование описателей объектов
- •ЧАСТЬ II НАЧИНАЕМ РАБОТАТЬ
- •ГЛАВА 4 Процессы
- •Ваше первое Windows-приложение
- •Описатель экземпляра процесса
- •Описатель предыдущего экземпляра процесса
- •Командная строка процесса
- •Переменные окружения
- •Привязка к процессорам
- •Режим обработки ошибок
- •Текущие диск и каталог для процесса
- •Текущие каталоги для процесса
- •Определение версии системы
- •Функция CreateProcess
- •Параметры pszApplicationName и pszCommandLine
- •Параметры psaProcess, psaThread и blnheritHandles
- •Параметр fdwCreate
- •Параметр pvEnvironment
- •Параметр pszCurDir
- •Параметр psiStartlnfo
- •Параметр ppiProclnfo
- •Завершение процесса
- •Возврат управления входной функцией первичного потока
- •Функция ExitProcess
- •Функция TerminateProcess
- •Когда все потоки процесса уходят
- •Что происходит при завершении процесса
- •Дочерние процессы
- •Запуск обособленных дочерних процессов
- •Перечисление процессов, выполняемых в системе
- •Программа-пример Processlnfo
- •ГЛАВА 5 Задания
- •Определение ограничений, налагаемых на процессы в задании
- •Включение процесса в задание
- •Завершение всех процессов в задании
- •Получение статистической информации о задании
- •Уведомления заданий
- •Программа-пример JobLab
- •ГЛАВА 6 Базовые сведения о потоках
- •В каких случаях потоки создаются
- •И в каких случаях потоки не создаются
- •Ваша первая функция потока
- •Функция CreateThread
- •Параметр psa
- •Параметр cbStack
- •Параметры pfnStartAddr и pvParam
- •Параметр fdwCreate
- •Параметр pdwThreadlD
- •Завершение потока
- •Возврат управления функцией потока
- •Функция ExitThread
- •Функция TerminateThread
- •Если завершается процесс
- •Что происходит при завершении потока
- •Кое-что о внутреннем устройстве потока
- •Некоторые соображения по библиотеке С/С++
- •Ой, вместо _beginthreadex я по ошибке вызвал CreateThread
- •Библиотечные функции, которые лучше не вызывать
- •Как узнать о себе
- •Преобразование псевдоописателя в настоящий описатель
- •ГЛАВА 7 Планирование потоков, приоритет и привязка к процессорам
- •Приостановка и возобновление потоков
- •Приостановка и возобновление процессов
- •Функция Sleep
- •Переключение потоков
- •Определение периодов выполнения потока
- •Структура CONTEXT
- •Приоритеты потоков
- •Абстрагирование приоритетов
- •Программирование приоритетов
- •Динамическое изменение уровня приоритета потока
- •Подстройка планировщика для активного процесса
- •Программа-пример Scheduling Lab
- •Привязка потоков к процессорам
- •ГЛАВА 8 Синхронизация потоков в пользовательском режиме
- •Кэш-линии
- •Более сложные методы синхронизации потоков
- •Худшее, что можно сделать
- •Критические секции
- •Критические секции: важное дополнение
- •Критические секции и спин-блокировка
- •Критические секции и обработка ошибок
- •Несколько полезных приемов
- •Не занимайте критические секции надолго
- •ГЛАВА 9 Синхронизация потоков с использованием объектов ядра
- •Wait-функции
- •Побочные эффекты успешного ожидания
- •События
- •Программа-пример Handshake
- •Ожидаемые таймеры
- •Ожидаемые таймеры и АРС-очередь
- •И еще кое-что о таймерах
- •Семафоры
- •Мьютексы
- •Отказ от объекта-мьютекса
- •Мьютексы и критические секции
- •Программа-пример Queue
- •Сводная таблица объектов, используемых для синхронизации потоков
- •Другие функции, применяемые в синхронизации потоков
- •Асинхронный ввод-вывод на устройствах
- •Функция WaitForlnputldle
- •Функция MsgWaitForMultipleObjects(Ex)
- •Функция WaitForDebugEvent
- •Функция SignalObjectAndWait
- •ГЛАВА 10 Полезные средства для синхронизации потоков
- •Реализация критической секции: объект-оптекс
- •Программа-пример Optex
- •Создание инверсных семафоров и типов данных, безопасных в многопоточной среде
- •Программа-пример lnterlockedType
- •Синхронизация в сценарии "один писатель/группа читателей"
- •Программа-пример SWMRG
- •Реализация функции WaitForMultipleExpressions
- •Программа-пример WaitForMultExp
- •ГЛАВА 11 Пулы потоков
- •Сценарий 1: асинхронный вызов функций
- •Сценарий 2: вызов функций через определенные интервалы времени
- •Программа-пример TimedMsgBox
- •Сценарий 3: вызов функций при освобождении отдельных объектов ядра
- •Сценарий 4; вызов функций по завершении запросов на асинхронный ввод-вывод
- •ГЛАВА 12 Волокна
- •Работа с волокнами
- •Программа-пример Counter
- •ЧАСТЬ III УПРАВЛЕНИЕ ПАМЯТЬЮ
- •Виртуальное адресное пространство процесса
- •Как адресное пространство разбивается на разделы
- •Увеличение раздела для кода и данных пользовательского режима до 3 Гб на процессорах x86 (только Windows 2000)
- •Закрытый раздел размером 64 Кб (только Windows 2000)
- •Раздел для общих MMF (только Windows 98)
- •Регионы в адресном пространстве
- •Передача региону физической памяти
- •Физическая память и страничный файл
- •Физическая память в страничном файле не хранится
- •Атрибуты защиты
- •Защита типа «копирование при записи»
- •Специальные флаги атрибутов защиты
- •Подводя итоги
- •Блоки внутри регионов
- •Особенности адресного пространства в Windows 98
- •Выравнивание данных
- •ГЛАВА 14 Исследование виртуальной памяти
- •Системная информация
- •Программа-пример Syslnfo
- •Статус виртуальной памяти
- •Программа-пример VMStat
- •Определение состояния адресного пространства
- •Функция VMQuery
- •Программа-пример VMMap
- •ГЛАВА 15 Использование виртуальной памяти в приложениях
- •Резервирование региона в адресном пространстве
- •Передача памяти зарезервированному региону
- •Резервирование региона с одновременной передачей физической памяти
- •В какой момент региону передают физическую память
- •Возврат физической памяти и освобождение региона
- •В какой момент физическую память возвращают системе
- •Программа-пример VMAIloc
- •Изменение атрибутов защиты
- •Сброс содержимого физической памяти
- •Программа-пример MemReset
- •Механизм Address Windowing Extensions (только Windows 2000)
- •Программа-пример AWE
- •ГЛАВА 16 Стек потока
- •Стек потока в Windows 98
- •Функция из библиотеки С/С++ для контроля стека
- •Программа-пример Summation
- •ГЛАВА 17 Проецируемые в память файлы
- •Проецирование в память EXE- и DLL-файлов
- •Статические данные не разделяются несколькими экземплярами EXE или DLL
- •Программа-пример Applnst
- •Файлы данных, проецируемые в память
- •Метод 1: один файл, один буфер
- •Метод 2: два файла, один буфер
- •Метод 3: один файл, два буфера
- •Метод 4: один файл и никаких буферов
- •Использование проецируемых в память файлов
- •Этап1: создание или открытие объекта ядра «файл»
- •Этап 2: создание объекта ядра «проекция файла»
- •Этап 3: проецирование файловых данных на адресное пространство процесса
- •Этап 4: отключение файла данных от адресного пространства процесса
- •Этапы 5 и 6: закрытие объектов «проекция файла» и «файл»
- •Программа-пример FileRev
- •Обработка больших файлов
- •Проецируемые файлы и когерентность
- •Базовый адрес файла, проецируемого в память
- •Особенности проецирования файлов на разных платформах
- •Совместный доступ процессов к данным через механизм проецирования
- •Файлы, проецируемые на физическую память из страничного файла
- •Программа-пример MMFShare
- •Частичная передача физической памяти проецируемым файлам
- •Программа-пример MMFSparse
- •ГЛАВА 18 Динамически распределяемая память
- •Стандартная куча процесса
- •Дополнительные кучи в процессе
- •Защита компонентов
- •Более эффективное управление памятью
- •Локальный доступ
- •Исключение издержек, связанных с синхронизацией потоков
- •Быстрое освобождение всей памяти в куче
- •Создание дополнительной кучи
- •Выделение блока памяти из кучи
- •Изменение размера блока
- •Определение размера блока
- •Освобождение блока
- •Уничтожение кучи
- •Использование куч в программах на С++
- •Другие функции управления кучами
- •ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ
- •ГЛАВА 19 DLL: основы
- •DLL и адресное пространство процесса
- •Общая картина
- •Создание DLL-модуля
- •Что такое экспорт
- •Создание DLL для использования с другими средствами разработки (отличными от Visual C++)
- •Создание ЕХЕ-модуля
- •Что такое импорт
- •Выполнение ЕХЕ-модуля
- •ГЛАВА 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
- •Статическая локальная память потока
- •Пример внедрения DLL
- •Внедрение DLL c использованием реестра
- •Внедрение DLL с помощью ловушек
- •Утилита для сохранения позиций элементов на рабочем столе
- •Внедрение DLL с помощью удаленных потоков
- •Программа-пример lnjLib
- •Библиотека lmgWalk.dll
- •Внедрение троянской DLL
- •Внедрение DLL как отладчика
- •Внедрение кода в среде Windows 98 через проецируемый в память файл
- •Внедрение кода через функцию CreateProcess
- •Перехват API-вызовов: пример
- •Перехват API-вызовов подменой кода
- •Перехват API-вызовов с использованием раздела импорта
- •Программа-пример LastMsgBoxlnfo
- •ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ГЛАВА 23 Обработчики завершения
- •Примеры использования обработчиков завершения
- •Funcenstein1
- •Funcenstein2
- •Funcenstein3
- •Funcfurter1
- •Проверьте себя: FuncaDoodleDoo
- •Funcenstein4
- •Funcarama1
- •Funcarama2
- •Funcarama3
- •Funcarama4: последний рубеж
- •И еще о блоке finally
- •Funcfurter2
- •Программа-пример SEHTerm
- •ГЛАВА 24 Фильтры и обработчики исключений
- •Примеры использования фильтров и обработчиков исключений
- •Funcmeister1
- •Funcmeister2
- •EXCEPTION_EXECUTE_HANDLER
- •Некоторые полезные примеры
- •Глобальная раскрутка
- •Остановка глобальной раскрутки
- •EXCEPTION_CONTINUE_EXECUTION
- •Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION
- •EXCEPTION_CONTINUE_SEARCH
- •Функция GetExceptionCode
- •Функция GetExceptionlnformation
- •Программные исключения
- •ГЛАВА 25 Необработанные исключения и исключения С++
- •Отладка по запросу
- •Отключение вывода сообщений об исключении
- •Принудительное завершение процесса
- •Создание оболочки вокруг функции потока
- •Создание оболочки вокруг всех функций потоков
- •Автоматический вызов отладчика
- •Явный вызов функции UnhandledExceptionFilter
- •Функция UnhandledExceptionFilter изнутри
- •Исключения и отладчик
- •Программа-пример Spreadsheet
- •Исключения С++ и структурные исключения
- •Перехват структурных исключений в С++
- •ЧАСТЬ VI ОПЕРАЦИИ С ОКНАМИ
- •ГЛАВА 26 Оконные сообщения
- •Очередь сообщений потока
- •Посылка асинхронных сообщений в очередь потока
- •Посылка синхронных сообщений окну
- •Пробуждение потока
- •Флаги состояния очереди
- •Алгоритм выборки сообщений из очереди потока
- •Пробуждение потока с использованием объектов ядра или флагов состояния очереди
- •Передача данных через сообщения
- •Программа-пример CopyData
- •ГЛАВА 27 Модель аппаратного ввода и локальное состояние ввода
- •Поток необработанного ввода
- •Локальное состояние ввода
- •Ввод с клавиатуры и фокус
- •Управление курсором мыши
- •Подключение к очередям виртуального ввода и переменным локального состояния ввода
- •Программа-пример LISLab
- •Программа-пример LISWatch
WINDOWS |
|
СОЗДАНИЕ ЭФФЕКТИВНЫХ |
|
WIN32-ПРИЛОЖЕНИЙ |
|
Джеффри Рихтер |
|
ЧАCTЬ I МАТЕРИАЛЫ ДЛЯ ОБЯЗАТЕЛЬНОГО ЧТЕНИЯ................................................... |
8 |
ГЛАВА 1. Обработка ошибок .................................................................................................. |
8 |
Вы тоже можете это сделать............................................................................................... |
12 |
Программа-пример ErrorShow............................................................................................ |
13 |
ГЛАВА 2 Unicode .................................................................................................................... |
14 |
Наборы символов................................................................................................................. |
14 |
Одно- и двухбайтовые наборы символов...................................................................... |
14 |
Unicode: набор широких символов ................................................................................ |
15 |
Почему Unicode?.................................................................................................................. |
16 |
Windows 2000 и Unicode ..................................................................................................... |
16 |
Windows 98 и Unicode ......................................................................................................... |
17 |
Windows CE и Unicode ........................................................................................................ |
18 |
В чью пользу счет? .............................................................................................................. |
18 |
Unicode и СОМ .................................................................................................................... |
18 |
Как писать программу с использованием Unicode........................................................... |
19 |
Unicode и библиотека С .................................................................................................. |
19 |
Типы данных, определенные в Windows для Unicode ................................................. |
21 |
Unicode- и ANSI-функции в Windows ........................................................................... |
21 |
Строковые функции Windows ........................................................................................ |
23 |
Создание программ, способных использовать и ANSI, и Unicode ................................. |
23 |
Ресурсы ............................................................................................................................. |
26 |
Текстовые файлы ............................................................................................................. |
27 |
Перекодировка строк из Unicode в ANSI и обратно .................................................... |
28 |
ГЛАВА 3 Объекты ядра .......................................................................................................... |
31 |
Что такое объект ядра ......................................................................................................... |
31 |
Учет пользователей объектов ядра ................................................................................ |
32 |
Защита............................................................................................................................... |
33 |
Таблица описателей объектов ядра ................................................................................... |
35 |
Создание объекта ядра .................................................................................................... |
35 |
Закрытие объекта ядра .................................................................................................... |
37 |
Совместное использование объектов ядра несколькими процессами ........................... |
38 |
Наследование описателя объекта................................................................................... |
38 |
Изменение флагов описателя ......................................................................................... |
41 |
Именованные объекты .................................................................................................... |
42 |
Дублирование описателей объектов.............................................................................. |
46 |
ЧАСТЬ II НАЧИНАЕМ РАБОТАТЬ ......................................................................................... |
50 |
ГЛАВА 4 Процессы................................................................................................................. |
51 |
Ваше первое Windows-приложение................................................................................... |
52 |
Описатель экземпляра процесса .................................................................................... |
55 |
Описатель предыдущего экземпляра процесса ............................................................ |
57 |
Командная строка процесса............................................................................................ |
57 |
Переменные окружения .................................................................................................. |
58 |
Привязка к процессорам ................................................................................................. |
61 |
Режим обработки ошибок ............................................................................................... |
61 |
Текущие диск и каталог для процесса ........................................................................... |
62 |
Текущие каталоги для процесса..................................................................................... |
62 |
Определение версии системы......................................................................................... |
63 |
Функция CreateProcess ........................................................................................................ |
67 |
Параметры pszApplicationName и pszCommandLine.................................................... |
67 |
Параметры psaProcess, psaThread и blnheritHandles ..................................................... |
69 |
Параметр fdwCreate ......................................................................................................... |
70 |
Параметр pvEnvironment................................................................................................. |
72 |
Параметр pszCurDir ......................................................................................................... |
72 |
Параметр psiStartlnfo ....................................................................................................... |
72 |
Параметр ppiProclnfo....................................................................................................... |
76 |
Завершение процесса .......................................................................................................... |
78 |
Возврат управления входной функцией первичного потока ...................................... |
78 |
Функция ExitProcess ........................................................................................................ |
78 |
Функция TerminateProcess .............................................................................................. |
80 |
Когда все потоки процесса уходят................................................................................. |
80 |
Что происходит при завершении процесса ................................................................... |
81 |
Дочерние процессы ............................................................................................................. |
81 |
Запуск обособленных дочерних процессов .................................................................. |
83 |
Перечисление процессов, выполняемых в системе ......................................................... |
84 |
Программа-пример Processlnfo ...................................................................................... |
84 |
ГЛАВА 5 Задания .................................................................................................................... |
87 |
Определение ограничений, налагаемых на процессы в задании .................................... |
90 |
Включение процесса в задание .......................................................................................... |
96 |
Завершение всех процессов в задании .............................................................................. |
97 |
Получение статистической информации о задании......................................................... |
97 |
Уведомления заданий........................................................................................................ |
101 |
Программа-пример JobLab ............................................................................................... |
103 |
ГЛАВА 6 Базовые сведения о потоках................................................................................ |
104 |
В каких случаях потоки создаются.................................................................................. |
105 |
И в каких случаях потоки не создаются.......................................................................... |
107 |
Ваша первая функция потока ........................................................................................... |
108 |
Функция CreateThread ....................................................................................................... |
108 |
Параметр psa .................................................................................................................. |
109 |
Параметр cbStack ........................................................................................................... |
109 |
Параметры pfnStartAddr и pvParam.............................................................................. |
110 |
Параметр fdwCreate ....................................................................................................... |
111 |
Параметр pdwThreadlD ................................................................................................. |
111 |
Завершение потока ............................................................................................................ |
112 |
Возврат управления функцией потока ........................................................................ |
112 |
Функция ExitThread....................................................................................................... |
112 |
Функция TerminateThread ............................................................................................. |
113 |
Если завершается процесс ............................................................................................ |
113 |
Что происходит при завершении потока..................................................................... |
114 |
Кое-что о внутреннем устройстве потока ....................................................................... |
114 |
Некоторые соображения по библиотеке С/С++ ............................................................. |
117 |
Ой, вместо _beginthreadex я по ошибке вызвал CreateThread ................................... |
126 |
Библиотечные функции, которые лучше не вызывать .............................................. |
126 |
Как узнать о себе ............................................................................................................... |
127 |
Преобразование псевдоописателя в настоящий описатель ....................................... |
128 |
ГЛАВА 7 Планирование потоков, приоритет и привязка к процессорам ....................... |
130 |
Приостановка и возобновление потоков......................................................................... |
131 |
Приостановка и возобновление процессов ..................................................................... |
132 |
Функция Sleep .................................................................................................................... |
134 |
Переключение потоков ..................................................................................................... |
134 |
Определение периодов выполнения потока ................................................................... |
135 |
Структура CONTEXT........................................................................................................ |
138 |
Приоритеты потоков ......................................................................................................... |
142 |
Абстрагирование приоритетов......................................................................................... |
143 |
Программирование приоритетов ..................................................................................... |
147 |
Динамическое изменение уровня приоритета потока ............................................... |
149 |
Подстройка планировщика для активного процесса ................................................. |
151 |
Программа-пример Scheduling Lab .............................................................................. |
152 |
Привязка потоков к процессорам................................................................................. |
153 |
ГЛАВА 8 Синхронизация потоков в пользовательском режиме...................................... |
158 |
Атомарный доступ: семейство Inferlockect-функций .................................................... |
158 |
Кэш-линии.......................................................................................................................... |
164 |
Более сложные методы синхронизации потоков............................................................ |
165 |
Худшее, что можно сделать ......................................................................................... |
166 |
Критические секции .......................................................................................................... |
168 |
Критические секции: важное дополнение................................................................... |
171 |
Критические секции и спин-блокировка..................................................................... |
174 |
Критические секции и обработка ошибок .................................................................. |
175 |
Несколько полезных приемов ...................................................................................... |
175 |
ГЛАВА 9 Синхронизация потоков с использованием объектов ядра.............................. |
179 |
Wait-функции ..................................................................................................................... |
181 |
Побочные эффекты успешного ожидания ...................................................................... |
184 |
События .............................................................................................................................. |
185 |
Программа-пример Handshake ..................................................................................... |
189 |
Ожидаемые таймеры ......................................................................................................... |
191 |
Ожидаемые таймеры и АРС-очередь .............................................................................. |
194 |
И еще кое-что о таймерах ............................................................................................. |
196 |
Семафоры ........................................................................................................................... |
197 |
Мьютексы........................................................................................................................... |
199 |
Отказ от объекта-мьютекса .......................................................................................... |
201 |
Мьютексы и критические секции .................................................................................... |
201 |
Программа-пример Queue............................................................................................. |
202 |
Сводная таблица объектов, используемых для синхронизации потоков..................... |
205 |
Другие функции, применяемые в синхронизации потоков........................................... |
206 |
Асинхронный ввод-вывод на устройствах.................................................................. |
206 |
Функция WaitForlnputldle ............................................................................................. |
206 |
Функция MsgWaitForMultipleObjects(Ex) ................................................................... |
207 |
Функция WaitForDebugEvent ....................................................................................... |
207 |
Функция SignalObjectAndWait ..................................................................................... |
208 |
ГЛАВА 10 Полезные средства для синхронизации потоков ............................................ |
209 |
Реализация критической секции: объект-оптекс............................................................ |
210 |
Программа-пример Optex ............................................................................................. |
212 |
Создание инверсных семафоров и типов данных, безопасных в многопоточной среде |
|
............................................................................................................................................. |
213 |
Программа-пример lnterlockedType ............................................................................. |
218 |
Синхронизация в сценарии "один писатель/группа читателей" ................................... |
218 |
Программа-пример SWMRG ........................................................................................ |
220 |
Реализация функции WaitForMultipleExpressions .......................................................... |
221 |
Программа-пример WaitForMultExp............................................................................ |
223 |
ГЛАВА 11 Пулы потоков ..................................................................................................... |
227 |
Сценарий 1: асинхронный вызов функций ..................................................................... |
228 |
Сценарий 2: вызов функций через определенные интервалы времени ....................... |
231 |
Программа-пример TimedMsgBox ............................................................................... |
234 |
Сценарий 3: вызов функций при освобождении отдельных объектов ядра ................ |
235 |
Сценарий 4; вызов функций по завершении запросов на асинхронный ввод-вывод .237 |
|
ГЛАВА 12 Волокна ............................................................................................................... |
239 |
Работа с волокнами ........................................................................................................... |
239 |
Программа-пример Counter .......................................................................................... |
242 |
ЧАСТЬ III УПРАВЛЕНИЕ ПАМЯТЬЮ.................................................................................. |
244 |
ГЛАВА 13 Архитектура памяти в Windows ....................................................................... |
244 |
Виртуальное адресное пространство процесса .............................................................. |
245 |
Как адресное пространство разбивается на разделы ..................................................... |
245 |
Раздел для выявления нулевых указателей (Windows 2000 и Windows 98) ............ |
246 |
Раздел для совместимости с программами DOS и 16-разрядной Windows (только |
|
Windows 98) ................................................................................................................... |
247 |
Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98) |
|
......................................................................................................................................... |
247 |
Закрытый раздел размером 64 Кб (только Windows 2000)........................................ |
249 |
Раздел для общих MMF (только Windows 98)............................................................ |
249 |
Раздел для кода и данных режима ядра (Windows 2000 и Windows 98) .................. |
249 |
Регионы в адресном пространстве ................................................................................... |
250 |
Передача региону физической памяти ............................................................................ |
251 |
Физическая память и страничный файл .......................................................................... |
251 |
Физическая память в страничном файле не хранится ............................................... |
254 |
Атрибуты защиты .............................................................................................................. |
255 |
Защита типа «копирование при записи» ..................................................................... |
256 |
Специальные флаги атрибутов защиты....................................................................... |
257 |
Подводя итоги.................................................................................................................... |
257 |
Блоки внутри регионов ................................................................................................. |
260 |
Особенности адресного пространства в Windows 98................................................. |
265 |
Выравнивание данных ...................................................................................................... |
269 |
ГЛАВА 14 Исследование виртуальной памяти .................................................................. |
273 |
Системная информация .................................................................................................... |
273 |
Программа-пример Syslnfo ........................................................................................... |
275 |
Статус виртуальной памяти.............................................................................................. |
275 |
Программа-пример VMStat .......................................................................................... |
277 |
Определение состояния адресного пространства........................................................... |
278 |
Функция VMQuery ........................................................................................................ |
279 |
Программа-пример VMMap ......................................................................................... |
281 |
ГЛАВА 15 Использование виртуальной памяти в приложениях ..................................... |
284 |
Резервирование региона в адресном пространстве ........................................................ |
284 |
Передача памяти зарезервированному региону ............................................................. |
286 |
Резервирование региона с одновременной передачей физической памяти................. |
287 |
В какой момент региону передают физическую память ............................................... |
287 |
Возврат физической памяти и освобождение региона .................................................. |
289 |
В какой момент физическую память возвращают системе ....................................... |
290 |
Программа-пример VMAIloc........................................................................................ |
291 |
Изменение атрибутов защиты .......................................................................................... |
293 |
Сброс содержимого физической памяти......................................................................... |
294 |
Программа-пример MemReset...................................................................................... |
296 |
Механизм Address Windowing Extensions (только Windows 2000)............................... |
297 |
Программа-пример AWE .............................................................................................. |
301 |
ГЛАВА 16 Стек потока ......................................................................................................... |
302 |
Стек потока в Windows 98 ................................................................................................ |
305 |
Функция из библиотеки С/С++ для контроля стека....................................................... |
307 |
Программа-пример Summation......................................................................................... |
309 |
ГЛАВА 17 Проецируемые в память файлы ........................................................................ |
311 |
Проецирование в память EXE- и DLL-файлов ............................................................... |
311 |
Статические данные не разделяются несколькими экземплярами EXE или DLL ..313 |
|
Статические данные разделяются несколькими экземплярами EXE или DLL....... |
315 |
Программа-пример Applnst .......................................................................................... |
319 |
Файлы данных, проецируемые в память ......................................................................... |
321 |
Метод 1: один файл, один буфер ................................................................................. |
321 |
Метод 2: два файла, один буфер .................................................................................. |
321 |
Метод 3: один файл, два буфера .................................................................................. |
322 |
Метод 4: один файл и никаких буферов...................................................................... |
322 |
Использование проецируемых в память файлов ............................................................ |
322 |
Этап1: создание или открытие объекта ядра «файл»................................................. |
323 |
Этап 2: создание объекта ядра «проекция файла» ..................................................... |
324 |
Этап 3: проецирование файловых данных на адресное пространство процесса .... |
327 |
Этап 4: отключение файла данных от адресного пространства процесса ............... |
329 |
Этапы 5 и 6: закрытие объектов «проекция файла» и «файл» .................................. |
331 |
Программа-пример FileRev .......................................................................................... |
331 |
Обработка больших файлов ............................................................................................. |
334 |
Проецируемые файлы и когерентность........................................................................... |
336 |
Базовый адрес файла, проецируемого в память ............................................................. |
337 |
Особенности проецирования файлов на разных платформах....................................... |
338 |
Совместный доступ процессов к данным через механизм проецирования................. |
341 |
Файлы, проецируемые на физическую память из страничного файла ........................ |
342 |
Программа-пример MMFShare..................................................................................... |
343 |
Частичная передача физической памяти проецируемым файлам ................................ |
344 |
Программа-пример MMFSparse ................................................................................... |
345 |
ГЛАВА 18 Динамически распределяемая память.............................................................. |
349 |
Стандартная куча процесса .............................................................................................. |
349 |
Дополнительные кучи в процессе.................................................................................... |
350 |
Защита компонентов ..................................................................................................... |
350 |
Более эффективное управление памятью ................................................................... |
351 |
Локальный доступ ......................................................................................................... |
352 |
Исключение издержек, связанных с синхронизацией потоков................................. |
352 |
Быстрое освобождение всей памяти в куче ................................................................ |
353 |
Создание дополнительной кучи ................................................................................... |
353 |
Выделение блока памяти из кучи ................................................................................ |
354 |
Изменение размера блока ............................................................................................. |
355 |
Определение размера блока.......................................................................................... |
356 |
Освобождение блока ..................................................................................................... |
356 |
Уничтожение кучи......................................................................................................... |
357 |
Использование куч в программах на С++ ................................................................... |
357 |
Другие функции управления кучами............................................................................... |
361 |
ЧАСТЬ IV ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ ................................... |
363 |
ГЛАВА 19 DLL: основы ....................................................................................................... |
363 |
DLL и адресное пространство процесса.......................................................................... |
364 |
Общая картина ................................................................................................................... |
366 |
Создание DLL-модуля....................................................................................................... |
369 |
Что такое экспорт .......................................................................................................... |
370 |
Создание DLL для использования с другими средствами разработки (отличными от |
|
Visual C++) ..................................................................................................................... |
372 |
Создание ЕХЕ-модуля....................................................................................................... |
373 |
Что такое импорт ........................................................................................................... |
374 |
Выполнение ЕХЕ-модуля ................................................................................................. |
376 |
ГЛАВА 20 DLL: более сложные методы программирования........................................... |
377 |
Явная загрузка DLL и связывание идентификаторов .................................................... |
378 |
Явная загрузка DLL....................................................................................................... |
378 |
Явная выгрузка DLL...................................................................................................... |
380 |
Явное подключение экспортируемого идентификатора ........................................... |
382 |
Функция входа/выхода...................................................................................................... |
383 |
Уведомление DLL_PROCESS_ATTACH .................................................................... |
385 |
Уведомление DLL_PROCESS_DETACH .................................................................... |
386 |
Уведомление DLL_THREAD_ATTACH ..................................................................... |
388 |
Уведомление DLL_THREAD_DETACH ..................................................................... |
389 |
Как система упорядочивает вызовы DIIMain ............................................................. |
390 |
Функция DllMain и библиотека С/С++........................................................................ |
393 |
Отложенная загрузка DLL ................................................................................................ |
394 |
Программа-пример DelayLoadApp .............................................................................. |
398 |
Переадресация вызовов функций .................................................................................... |
399 |
Известные DLL .................................................................................................................. |
400 |
Перенаправление DLL ...................................................................................................... |
402 |
Модификация базовых адресов модулей ........................................................................ |
402 |
Связывание модулей ......................................................................................................... |
408 |
ГЛАВА 21 Локальная память потока .................................................................................. |
410 |
Динамическая локальная память потока......................................................................... |
411 |
Использование динамической TLS.............................................................................. |
413 |
Статическая локальная память потока ............................................................................ |
416 |
ГЛАВА 22 Внедрение DLL и перехват API-вызовов......................................................... |
417 |
Пример внедрения DLL .................................................................................................... |
418 |
Внедрение DLL c использованием реестра..................................................................... |
420 |
Внедрение DLL с помощью ловушек .............................................................................. |
422 |
Утилита для сохранения позиций элементов на рабочем столе ............................... |
423 |
Внедрение DLL с помощью удаленных потоков ........................................................... |
426 |
Программа-пример lnjLib ............................................................................................. |
430 |
Библиотека lmgWalk.dll ................................................................................................ |
431 |
Внедрение троянской DLL ............................................................................................... |
433 |
Внедрение DLL как отладчика......................................................................................... |
434 |
Внедрение кода в среде Windows 98 через проецируемый в память файл.................. |
434 |
Внедрение кода через функцию CreateProcess ............................................................... |
434 |
Перехват API-вызовов: пример ........................................................................................ |
435 |
Перехват API-вызовов подменой кода ........................................................................ |
436 |
Перехват API-вызовов с использованием раздела импорта...................................... |
436 |
Программа-пример LastMsgBoxlnfo ............................................................................ |
440 |
ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ ................................................ |
442 |
ГЛАВА 23 Обработчики завершения .................................................................................. |
442 |
Примеры использования обработчиков завершения ..................................................... |
443 |
Funcenstein1.................................................................................................................... |
443 |
Funcenstein2.................................................................................................................... |
444 |
Funcenstein3.................................................................................................................... |
446 |
Funcfurter1 ...................................................................................................................... |
447 |
Проверьте себя: FuncaDoodleDoo ................................................................................ |
447 |
Funcenstein4.................................................................................................................... |
449 |
Funcarama1 ..................................................................................................................... |
450 |
Funcarama2 ..................................................................................................................... |
451 |
Funcarama3 ..................................................................................................................... |
451 |
Funcarama4: последний рубеж...................................................................................... |
453 |
И еще о блоке finally ..................................................................................................... |
454 |
Funcfurter2 ...................................................................................................................... |
455 |
Программа-пример SEHTerm ....................................................................................... |
456 |
ГЛАВА 24 Фильтры и обработчики исключений .............................................................. |
458 |
Примеры использования фильтров и обработчиков исключений ................................ |
458 |
Funcmeister1 ................................................................................................................... |
459 |
Funcmeister2 ................................................................................................................... |
459 |
EXCEPTION_EXECUTE_HANDLER.............................................................................. |
462 |
Некоторые полезные примеры ..................................................................................... |
463 |
Глобальная раскрутка.................................................................................................... |
466 |
Остановка глобальной раскрутки ................................................................................ |
469 |
EXCEPTION_CONTINUE_EXECUTION........................................................................ |
471 |
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION ................................ |
472 |
EXCEPTION_CONTINUE_SEARCH............................................................................... |
473 |
Функция GetExceptionCode .............................................................................................. |
476 |
Функция GetExceptionlnformation .................................................................................... |
480 |
Программные исключения ............................................................................................... |
484 |
ГЛАВА 25 Необработанные исключения и исключения С++ .......................................... |
487 |
Отладка по запросу............................................................................................................ |
490 |
Отключение вывода сообщений об исключении ........................................................... |
491 |
Принудительное завершение процесса ....................................................................... |
491 |
Создание оболочки вокруг функции потока............................................................... |
491 |
Создание оболочки вокруг всех функций потоков .................................................... |
492 |
Автоматический вызов отладчика ............................................................................... |
492 |
Явный вызов функции UnhandledExceptionFilter ........................................................... |
493 |
Функция UnhandledExceptionFilter изнутри.................................................................... |
494 |
Исключения и отладчик .................................................................................................... |
495 |
Программа-пример Spreadsheet.................................................................................... |
498 |
Исключения С++ и структурные исключения................................................................ |
501 |
Перехват структурных исключений в С++ ................................................................. |
503 |
ЧАСТЬ VI ОПЕРАЦИИ С ОКНАМИ...................................................................................... |
507 |
ГЛАВА 26 Оконные сообщения .......................................................................................... |
507 |
Очередь сообщений потока .............................................................................................. |
508 |
Посылка асинхронных сообщений в очередь потока .................................................... |
508 |
Посылка синхронных сообщений окну........................................................................... |
510 |
Пробуждение потока ......................................................................................................... |
515 |
Флаги состояния очереди ............................................................................................. |
516 |
Алгоритм выборки сообщений из очереди потока .................................................... |
517 |
Пробуждение потока с использованием объектов ядра или флагов состояния |
|
очереди ........................................................................................................................... |
521 |
Передача данных через сообщения ................................................................................. |
524 |
Программа-пример CopyData ....................................................................................... |
527 |
Как Windows манипулирует с ANSI/Unicode-символами и строками ......................... |
527 |
ГЛАВА 27 Модель аппаратного ввода и локальное состояние ввода ............................. |
529 |