Введение
Сегодняшние Windows-платформыЯдро Windows 2000
Ядро Windows 98
Ядро Windows CE
Завтрашние Windows-платформы (64-разрядная Windows 2000)
Что нового в четвертом издании
Что нового в четвертом издании - 2
В этой книге нет ошибок
Содержимое компакт-диска и требования к системе
Наборы символов
Наборы символовОдно- и двухбайтовые наборы символов
Unicode: набор широких символов
Почему Unicode?
Windows 2000 и Unicode
Windows 98 и Unicode
Windows CE и Unicode
В чью пользу счет?
Unicode и СОМ
Как писать программу с использованием Unicode
Unicode и библиотека С
Типы данных, определенные в Windows для Unicode
Unicode- и ANSI-функции в Windows
Строковые функции Windows
Создание программ, способных использовать и ANSI, и Unicode
Что такое объект ядра
Что такое объект ядраУчет пользователей объектов ядра
Защита
Таблица описателей объектов ядра
Создание объекта ядра
Закрытие объекта ядра
Совместное использование объектов ядра несколькими процессами
Наследование описателя объекта
Именованные объекты
Ваше первое Windows-приложение
Ваше первое Windows-приложениеОписатель экземпляра процесса
Описатель предыдущего экземпляра процесса
Командная строка процесса
Переменные окружения
Привязка к процессорам
Режим обработки ошибок
Текущие диск и каталог для процесса
Текущие каталоги для процесса
Определение версии системы
Функция CreateProcess
Параметры pszApplicationName и pszCommandLine
Параметры psaProcess, psaThread и blnheritHandles
Параметр fdwCreate
Параметр pvEnvironment
Параметр pszCurDir
Параметр psiStartlnfo
Параметр ppiProclnfo
Завершение процесса
Возврат управления входной функцией первичного потока
Функция ExitProcess
Функция TerminateProcess
Когда все потоки процесса уходят
Что происходит при завершении процесса
Дочерние процессы
Запуск обособленных дочерних процессов
Перечисление процессов, выполняемых в системе
Программа-пример Processlnfo
Определение ограничений, налагаемых на процессы в задании
Определение ограничений, налагаемых на процессы в заданииВключение процесса в задание
Завершение всех процессов в задании
Получение статистической информации о задании
Уведомления заданий
Программа-пример JobLab
В каких случаях потоки создаются
В каких случаях потоки создаютсяИ в каких случаях потоки не создаются
Ваша первая функция потока
Функция CreateThread
Параметр psa
Параметр cbStack
Параметры pfnStartAddr и pvParam
Параметр fdwCreate
Параметр pdwThreadlD
Завершение потока
Возврат управления функцией потока
Функция ExitThread
Функция TerminateThread
Если завершается процесс
Что происходит при завершении потока
Кое-что о внутреннем устройстве потока
Некоторые соображения по библиотеке С/С++
Ой, вместо _beginthreadex я по ошибке вызвал CreateThread
Библиотечные функции, которые лучше не вызывать
Как узнать о себе
Преобразование псевдоописателя в настоящий описатель
Приостановка и возобновление потоков
Приостановка и возобновление потоковПриостановка и возобновление процессов
Функция Sleep
Переключение потоков
Определение периодов выполнения потока
Структура CONTEXT
Приоритеты потоков
Абстрагирование приоритетов
Программирование приоритетов
Динамическое изменение уровня приоритета потока
Подстройка планировщика для активного процесса
Программа-пример Scheduling Lab
Привязка потоков к процессорам
Атомарный доступ: семейство Inferlockect-функций
Атомарный доступ: семейство Inferlockect-функцийКэш-линии
Более сложные методы синхронизации потоков
Худшее, что можно сделать
Критические секции
Критические секции: важное дополнение
Критические секции и спин-блокировка
Критические секции и обработка ошибок
Несколько полезных приемов
Wait-функции
Wait-функцииПобочные эффекты успешного ожидания
События
Программа-пример Handshake
Ожидаемые таймеры
Ожидаемые таймеры и АРС-очередь
И еще кое-что о таймерах
Семафоры
Мьютексы
Отказ от объекта-мьютекса
Мьютексы и критические секции
Программа-пример Queue
Сводная таблица объектов, используемых для синхронизации потоков
Другие функции, применяемые в синхронизации потоков
Асинхронный ввод-вывод на устройствах
Функция WaitForlnputldle
Функция MsgWaitForMultipleObjects(Ex)
Функция WaitForDebugEvent
Функция SignalObjectAndWait
Реализация критической секции: объект-оптекс
Реализация критической секции: объект-оптексПрограмма-пример Optex
Создание инверсных семафоров и типов данных, безопасных в многопоточной среде
Программа-пример lnterlockedType
Синхронизация в сценарии "один писатель/группа читателей"
Программа-пример SWMRG
Реализация функции WaitForMultipleExpressions
Программа-пример WaitForMultExp
Сценарий 1: асинхронный вызов функций
Сценарий 1: асинхронный вызов функцийСценарий 2: вызов функций через определенные интервалы времени
Программа-пример TimedMsgBox
Сценарий 3: вызов функций при освобождении отдельных объектов ядра
Сценарий 4; вызов функций по завершении запросов на асинхронный ввод-вывод
Работа с волокнами
Работа с волокнамиПрограмма-пример 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
Выравнивание данных
Системная информация
Системная информацияПрограмма-пример Syslnfo
Статус виртуальной памяти
Программа-пример VMStat
Определение состояния адресного пространства
Функция VMQuery
Программа-пример VMMap
Резервирование региона в адресном пространстве
Резервирование региона в адресном пространствеПередача памяти зарезервированному региону
Резервирование региона с одновременной передачей физической памяти
В какой момент региону передают физическую память
Возврат физической памяти и освобождение региона
В какой момент физическую память возвращают системе
Программа-пример VMAIloc
Изменение атрибутов защиты
Сброс содержимого физической памяти
Программа-пример MemReset
Механизм Address Windowing Extensions (только Windows 2000)
Программа-пример AWE
Стек потока в Windows 98
Стек потока в Windows 98Функция из библиотеки С/С++ для контроля стека
Программа-пример Summation
Проецирование в память EXE- и DLL-файлов
Проецирование в память EXE- и DLL-файловСтатические данные не разделяются несколькими экземплярами EXE или DLL
Статические данные разделяются несколькими экземплярами EXE или DLL
Программа-пример Applnst
Файлы данных, проецируемые в память
Метод 1: один файл, один буфер
Метод 2: два файла, один буфер
Метод 3: один файл, два буфера
Метод 4: один файл и никаких буферов
Использование проецируемых в память файлов
Этап1: создание или открытие объекта ядра «файл»
Этап 2: создание объекта ядра «проекция файла»
Этап 3: проецирование файловых данных на адресное пространство процесса
Этап 4: отключение файла данных от адресного пространства процесса
Этапы 5 и 6: закрытие объектов «проекция файла» и «файл»
Программа-пример FileRev
Обработка больших файлов
Проецируемые файлы и когерентность
Базовый адрес файла, проецируемого в память
Особенности проецирования файлов на разных платформах
Совместный доступ процессов к данным через механизм проецирования
Файлы, проецируемые на физическую память из страничного файла
Программа-пример MMFShare
Частичная передача физической памяти проецируемым файлам
Программа-пример MMFSparse
Стандартная куча процесса
Стандартная куча процессаДополнительные кучи в процессе
Защита компонентов
Более эффективное управление памятью
Локальный доступ
Исключение издержек, связанных с синхронизацией потоков
Быстрое освобождение всей памяти в куче
Создание дополнительной кучи
Выделение блока памяти из кучи
Изменение размера блока
Определение размера блока
Освобождение блока
Уничтожение кучи
Использование куч в программах на С++
Другие функции управления кучами
DLL и адресное пространство процесса
DLL и адресное пространство процессаОбщая картина
Создание DLL-модуля
Что такое экспорт
Создание DLL для использования с другими средствами разработки (отличными от Visual C++)
Создание ЕХЕ-модуля
Что такое импорт
Выполнение ЕХЕ-модуля
Явная загрузка DLL и связывание идентификаторов
Явная загрузка DLL и связывание идентификаторовЯвная загрузка DLL
Явная выгрузка DLL
Явное подключение экспортируемого идентификатора
Функция входа/выхода
Уведомление DLL_PROCESS_ATTACH
Уведомление DLL_PROCESS_DETACH
Уведомление DLL_THREAD_ATTACH
Уведомление DLL_THREAD_DETACH
Как система упорядочивает вызовы DIIMain
Функция DllMain и библиотека С/С++
Отложенная загрузка DLL
Программа-пример DelayLoadApp
Переадресация вызовов функций
Известные DLL
Перенаправление DLL
Модификация базовых адресов модулей
Связывание модулей
Динамическая локальная память потока
Динамическая локальная память потокаИспользование динамической TLS
Статическая локальная память потока
Пример внедрения DLL
Пример внедрения DLLВнедрение DLL c использованием реестра
Внедрение DLL с помощью ловушек
Утилита для сохранения позиций элементов на рабочем столе
Внедрение DLL с помощью удаленных потоков
Внедрение DLL с помощью удаленных потоков - 2
Программа-пример lnjLib
Библиотека lmgWalk.dll
Внедрение троянской DLL
Внедрение DLL как отладчика
Внедрение кода в среде Windows 98 через проецируемый в память файл
Внедрение кода через функцию CreateProcess
Перехват API-вызовов: пример
Перехват API-вызовов подменой кода
Перехват API-вызовов с использованием раздела импорта
Программа-пример LastMsgBoxlnfo
Примеры использования обработчиков завершения
Примеры использования обработчиков завершенияFuncenstein1
Funcenstein2
Funcenstein3
Funcfurter1
Проверьте себя: FuncaDoodleDoo
Funcenstein4
Funcarama1
Funcarama2
Funcarama3
Funcarama4: последний рубеж
И еще о блоке finally
Funcfurter2
Программа-пример SEHTerm
Примеры использования фильтров и обработчиков исключений
Примеры использования фильтров и обработчиков исключенийFuncmeister1
Funcmeister2
EXCEPTION_EXECUTE_HANDLER
Некоторые полезные примеры
Глобальная раскрутка
Остановка глобальной раскрутки
EXCEPTION_CONTINUE_EXECUTION
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION
EXCEPTION_CONTINUE_SEARCH
Функция GetExceptionCode
Функция GetExceptionlnformation
Программные исключения
Отладка по запросу
Отладка по запросуОтключение вывода сообщений об исключении
Принудительное завершение процесса
Создание оболочки вокруг функции потока
Создание оболочки вокруг всех функций потоков
Автоматический вызов отладчика
Явный вызов функции UnhandledExceptionFilter
Функция UnhandledExceptionFilter изнутри
Исключения и отладчик
Программа-пример Spreadsheet
Исключения С++ и структурные исключения
Перехват структурных исключений в С++
Очередь сообщений потока
Очередь сообщений потокаПосылка асинхронных сообщений в очередь потока
Посылка синхронных сообщений окну
Пробуждение потока
Флаги состояния очереди
Алгоритм выборки сообщений из очереди потока
Пробуждение потока с использованием объектов ядра или флагов состояния очереди
Передача данных через сообщения
Программа-пример CopyData
Как Windows манипулирует с ANSI/Unicode-символами и строками
Поток необработанного ввода
Поток необработанного вводаЛокальное состояние ввода
Ввод с клавиатуры и фокус
Управление курсором мыши
Подключение к очередям виртуального ввода и переменным локального состояния ввода
Программа-пример LISLab
Программа-пример LISWatch