Звоните: (067) 644-70-74
Напишите нам burtrest@gmail.com

Книга Windows via C/C++. Программирование на языке Visual C++. Рихтер

484.90 грн.

Артикул: 2e09f3cc16fa Категория:

Описание

год-2009

896 страниц

Книга «Windows via C/C++. Программирование на языке Visual C++» — почти новая книга, посвященная создании серьезных приложений на Visual C++ в операционных системах Windows XP и Виста (32- и 64-разрядных версиях) с использованием функций Windows АПИ. Всерьез глубже, чем в прошлых изданиях, рассматриваются подобные тематики, как механизм User Account Control, взаимодействие с системой библиотеки C/C++ при реализации защитных механизмов и обработке исключений; представлены новые синхронизирующие механизмы. В это издание добавлены 2 абсолютно новые главы: о механизмах ввода-вывода и о работе новой системы Windows Error Reporting, изменившей подходы к созданию отчетов об ошибках и восстановлению приложений после сбоев. Книга предназначена для профессиональных программистов, владеющих языком С/С++ и имеющим опыт разработки Windows-приложений. Исходные тексты для всех программ-примеров из книжки читатели найдут на сайте помощи нового издания. Книга состоит из 26 глав и 2-х приложений.

Оглавление

Благодарности ……………………………………………………………………………………. XIII
Введение ……………………………………………………………………………………………. XIV

Часть I Материалы для обязательного чтения ……………………………..1

Глава 1 Обработка ошибок ………………………………………………………………….. 2
Вы тоже можете это сделать ……………………………………………………………………………………….7
Программа-пример ErrorShow …………………………………………………………………………………..8
Глава 2 Работа с символами и строками ……………………………………………. 11
Наборы символов ……………………………………………………………………………………………………… 12
Символьные и строковые типы данных для ANSI и Unicode …………………………….. 14
Unicode- и ANSI-функции в Windows …………………………………………………………………… 16
Unicode- и ANSI-функции в библиотеке C …………………………………………………………… 19
Безопасные строковые функции в библиотеке C ………………………………………………… 20
Введение в безопасные строковые функции ………………………………………………………….. 21
Дополнительные возможности при работе со строками ………………………………………. 25
Строковые функции Windows …………………………………………………………………………………. 27
Почему Unicode? ………………………………………………………………………………………………………. 29
Рекомендуемые приемы работы с символами и строками …………………………………. 30
Перекодировка строк из Unicode в ANSI и обратно ……………………………………………. 31
Экспорт DLL-функций для работы с ANSI и Unicode …………………………………………. 33
Определяем формат текста (ANSI или Unicode) …………………………………………………… 35
Глава 3 Объекты ядра ……………………………………………………………………….. 37
Что такое объект ядра ………………………………………………………………………………………………. 37
Учет пользователей объектов ядра ………………………………………………………………………….. 39
Защита …………………………………………………………………………………………………………………………. 39
Таблица описателей объектов ядра ………………………………………………………………………… 42
Создание объекта ядра ………………………………………………………………………………………………. 43
Закрытие объекта ядра ………………………………………………………………………………………………. 45
Совместное использование объектов ядра несколькими процессами ………………. 48
Наследование описателя объекта …………………………………………………………………………….. 49
Именованные объекты ………………………………………………………………………………………………. 54
Дублирование описателей объектов ……………………………………………………………………….. 68

Часть II Приступаем к работе ……………………………………………………75

Глава 4 Процессы ……………………………………………………………………………… 76
Ваше первое Windows-приложение ……………………………………………………………………….. 77
Описатель экземпляра процесса ………………………………………………………………………………. 83
Описатель предыдущего экземпляра процесса ……………………………………………………… 85
Командная строка процесса ………………………………………………………………………………………. 86
Переменные окружения …………………………………………………………………………………………….. 87
Привязка к процессорам ……………………………………………………………………………………………. 94
Режим обработки ошибок …………………………………………………………………………………………. 94
Текущие диск и каталог для процесса ……………………………………………………………………… 95
Определение версии системы …………………………………………………………………………………… 97
Функция CreateProcess …………………………………………………………………………………………..101
Параметры pszApplicationName и pszCommandLine …………………………………………….102
Параметры psaProcess, psaThread и bInheritHandles ……………………………………………104
Параметр fdwCreate …………………………………………………………………………………………………..106
Параметр pvEnvironment ………………………………………………………………………………………….108
Параметр pszCurDir ………………………………………………………………………………………………….109
Параметр psiStartInfo………………………………………………………………………………………………..109
Параметр ppiProcInfo ………………………………………………………………………………………………..117
Завершение процесса ………………………………………………………………………………………………119
Возврат управления входной функцией первичного потока………………………………119
Функция ExitProcess ………………………………………………………………………………………………..120
Функция TerminateProcess ………………………………………………………………………………………121
Когда все потоки процесса уходят ………………………………………………………………………….122
Что происходит при завершении процесса ……………………………………………………………122
Дочерние процессы ………………………………………………………………………………………………….123
Запуск обособленных дочерних процессов …………………………………………………………..125
Работа администратора с пользовательскими полномочиями …………………………126
Автоматическое повышение привилегий процесса ……………………………………………..130
Повышение привилегий процесса вручную ………………………………………………………….132
О текущем контексте привилегий …………………………………………………………………………..134
Перечисление процессов, выполняемых в системе ………………………………………………136
Программа-пример ProcessInfo ……………………………………………………………………………….137
Глава 5 Задания ……………………………………………………………………………….144
Определение ограничений, налагаемых на процессы в задании ………………………149
Включение процесса в задание ………………………………………………………………………………157
Завершение всех процессов в задании ………………………………………………………………….158
Получение статистической информации о задании …………………………………………….158
Уведомления заданий ……………………………………………………………………………………………..162
Программа-пример JobLab ……………………………………………………………………………………..165
Глава 6 Базовые сведения о потоках ……………………………………………….167
В каких случаях потоки создаются ……………………………………………………………………….168
И в каких случаях потоки не создаются ……………………………………………………………….170
Ваша первая функция потока ………………………………………………………………………………..171
Функция CreateThread …………………………………………………………………………………………….172
Параметр psa ………………………………………………………………………………………………………………173
Параметр cbStackSize …………………………………………………………………………………………………173
Параметры pfnStartAddr и pvParam ………………………………………………………………………..174
Параметр dwCreateFlags ……………………………………………………………………………………………175
Параметр pdwThreadID ……………………………………………………………………………………………..175
Завершение потока ………………………………………………………………………………………………….176
Возврат управления функцией потока …………………………………………………………………..176
Функция ExitThread …………………………………………………………………………………………………..176
Функция TerminateThread …………………………………………………………………………………………177
Если завершается процесс ……………………………………………………………………………………….177
Что происходит при завершении потока ……………………………………………………………….178
Кое-что о внутреннем устройстве потока …………………………………………………………….179
Некоторые соображения по библиотеке C/C++ …………………………………………………181
Ой, вместо _beginthreadex я по ошибке вызвал CreateThread ……………………………..192
Библиотечные функции, которые лучше не вызывать ………………………………………..192
Как узнать о себе ………………………………………………………………………………………………………193
Преобразование псевдоописателя в настоящий описатель ………………………………..194
Глава 7 Планирование потоков, приоритет
и привязка к процессорам ………………………………………………………………….197
Приостановка и возобновление потоков ………………………………………………………………199
Приостановка и возобновление процессов ………………………………………………………….200
Функция Sleep ………………………………………………………………………………………………………….202
Переключение потоков ……………………………………………………………………………………………202
Переключение потоков на компьютерах с процессором,
поддерживающим HyperThreading …………………………………………………………………………203
Определение периодов выполнения потока ………………………………………………………..204
Структура CONTEXT …………………………………………………………………………………………….208
Приоритеты потоков ……………………………………………………………………………………………….213
Абстрагирование приоритетов ………………………………………………………………………………214
Программирование приоритетов …………………………………………………………………………..219
Динамическое изменение уровня приоритета потока………………………………………….222
Подстройка планировщика для активного процесса……………………………………………223
Приоритеты запросов ввода-вывода ………………………………………………………………………224
Программа-пример Scheduling Lab …………………………………………………………………………226
Привязка потоков к процессорам ………………………………………………………………………….233
Глава 8 Синхронизация потоков в пользовательском режиме ………….238
Атомарный доступ: семейство Interlocked-функций …………………………………………..239
Кэш-линии ……………………………………………………………………………………………………………….246
Более сложные методы синхронизации потоков ………………………………………………..248
Худшее, что можно сделать ………………………………………………………………………………………249
Критические секции ………………………………………………………………………………………………..250
Критические секции: важное дополнение ……………………………………………………………..253
Критические секции и спин-блокировка ……………………………………………………………….256
Критические секции и обработка ошибок ……………………………………………………………..257
«Тонкая» блокировка ………………………………………………………………………………………………259
Условные переменные ……………………………………………………………………………………………..263
Приложение-пример Queue …………………………………………………………………………………….264
Несколько полезных приемов …………………………………………………………………………………277
Глава 9 Синхронизация потоков с использованием объектов ядра …..280
Wait-функции ……………………………………………………………………………………………………………282
Побочные эффекты успешного ожидания …………………………………………………………..286
События ……………………………………………………………………………………………………………………288
Программа-пример Handshake ………………………………………………………………………………..293
Ожидаемые таймеры ……………………………………………………………………………………………….298
Ожидаемые таймеры и APC-очередь ……………………………………………………………………..302
И еще кое-что о таймерах …………………………………………………………………………………………305
Семафоры …………………………………………………………………………………………………………………306
Мьютексы …………………………………………………………………………………………………………………308
Мьютексы и критические секции ……………………………………………………………………………311
Программа-пример Queue ………………………………………………………………………………………..312
Сводная таблица объектов, используемых для синхронизации потоков ………..321
Другие функции, применяемые в синхронизации потоков ………………………………323
Асинхронный ввод-вывод на устройствах …………………………………………………………….323
Функция WaitForInputIdle ………………………………………………………………………………………323
Функция MsgWaitForMultipleObjects(Ex) ……………………………………………………………….325
Функция WaitForDebugEvent ……………………………………………………………………………………325
Функция SignalObjectAndWait …………………………………………………………………………………326
Обнаружение взаимных блокировок с помощью Wait Chain Traversal API …….327
Глава 10 Синхронный и асинхронный ввод-вывод на устройствах …….336
Открытие и закрытие устройств ……………………………………………………………………………337
Близкое знакомство с функцией CreateFile ………………………………………………………….340
Флаги функции CreateFile, управляющие кэшированием …………………………………..343
Другие флаги функции CreateFile …………………………………………………………………………..345
Флаги файловых атрибутов …………………………………………………………………………………….347
Работа с файлами …………………………………………………………………………………………………….348
Определение размера файла ……………………………………………………………………………………349
Установка указателя в файле …………………………………………………………………………………..350
Установка конца файла …………………………………………………………………………………………….352
Синхронный ввод-вывод на устройствах …………………………………………………………….353
Сброс данных на устройство ……………………………………………………………………………………354
Отмена синхронного ввода-вывода ………………………………………………………………………..354
Асинхронный ввод-вывод на устройствах: основы …………………………………………….356
Структура OVERLAPPED ………………………………………………………………………………………….357
Асинхронный ввод-вывод на устройствах: «подводные камни» ………………………..359
Отмена запросов ввода-вывода, ожидающих в очереди ………………………………………361
Уведомление о завершении ввода-вывода ……………………………………………………………362
Освобождение объекта ядра «устройство» ……………………………………………………………363
Освобождение объекта ядра «событие» …………………………………………………………………365
Ввод-вывод с оповещением ……………………………………………………………………………………..368
Порты завершения ввода-вывода ……………………………………………………………………………375
Создание портов завершения ввода-вывода ………………………………………………………….376
Связывание устройства с портом завершения ввода-вывода ……………………………..377
Архитектура программ, использующих порты завершения ввода-вывода ………380
Как порт завершения ввода-вывода управляет пулом потоков ………………………….383
Сколько потоков должно быть в пуле? ………………………………………………………………….385
Эмуляция выполненных запросов ввода-вывода …………………………………………………387
Программа-пример FileCopy……………………………………………………………………………………388
Глава 11 Пулы потоков ……………………………………………………………………..397
Сценарий 1. Асинхронный вызов функций …………………………………………………………398
Явное управление рабочими элементами ………………………………………………………………399
Программа-пример Batch …………………………………………………………………………………………401
Сценарий 2. Вызов функций через определенные интервалы времени ………….405
Программа-пример TimedMsgBox ………………………………………………………………………….407
Сценарий 3. Вызов функций при освобождении отдельных объектов ядра …..411
Сценарий 4. Вызов функций по завершении запросов
асинхронного ввода-вывода ……………………………………………………………………………………414
Обработка завершения обратного вызова ……………………………………………………………..415
Настройка пула потоков …………………………………………………………………………………………..417
Корректное разрушение пула потоков и группы очистки …………………………………..419
Глава 12 Волокна ……………………………………………………………………………..422
Работа с волокнами ………………………………………………………………………………………………….423
Программа-пример Counter ……………………………………………………………………………………426

Часть III Управление памятью ………………………………………………….431

Глава 13 Архитектура памяти в Windows …………………………………………..432
Виртуальное адресное пространство процесса ……………………………………………………432
Как адресное пространство разбивается на разделы ………………………………………….433
Раздел для выявления нулевых указателей …………………………………………………………..434
Раздел для кода и данных пользовательского режима ……………………………………….434
Раздел для кода и данных режима ядра ………………………………………………………………..437
Регионы в адресном пространстве ………………………………………………………………………….437
Передача региону физической памяти …………………………………………………………………..438
Физическая память и страничный файл ………………………………………………………………440
Физическая память в страничном файле не хранится …………………………………………442
Атрибуты защиты …………………………………………………………………………………………………….443
Защита типа «копирование при записи» ……………………………………………………………….445
Специальные флаги атрибутов защиты …………………………………………………………………446
Подводя итоги ………………………………………………………………………………………………………….446
Блоки внутри регионов …………………………………………………………………………………………….452
Выравнивание данных …………………………………………………………………………………………….455
Глава 14 Исследование виртуальной памяти ……………………………………460
Системная информация ………………………………………………………………………………………….460
Статус виртуальной памяти …………………………………………………………………………………..470
Управление памятью на компьютерах с архитектурой NUMA …………………………471
Определение состояния адресного пространства ……………………………………………….475
Глава 15 Использование виртуальной памяти в приложениях ………….487
Резервирование региона в адресном пространстве …………………………………………….487
Передача памяти зарезервированному региону ………………………………………………….490
Резервирование региона с одновременной передачей физической памяти ……..491
В какой момент региону передают физическую память ……………………………………..492
Возврат физической памяти и освобождение региона……………………………………….495
В какой момент физическую память возвращают системе …………………………………496
Изменение атрибутов защиты …………………………………………………………………………………505
Сброс содержимого физической памяти ……………………………………………………………….506
Механизм Address Windowing Extensions …………………………………………………………..510
Глава 16 Стек потока ………………………………………………………………………..523
Функция из библиотеки C/C++ для контроля стека …………………………………………528
Программа-пример Summation ………………………………………………………………………………530
Глава 17 Проецируемые в память файлы …………………………………………536
Проецирование в память EXE- и DLL-файлов …………………………………………………..537
Статические данные не разделяются несколькими
экземплярами EXE или DLL …………………………………………………………………………………..538
Файлы данных, проецируемые в память ………………………………………………………………550
Использование проецируемых в память файлов ………………………………………………..551
Обработка больших файлов …………………………………………………………………………………..570
Проецируемые файлы и когерентность ………………………………………………………………..572
Базовый адрес файла, проецируемого в память ………………………………………………….573
Особенности проецирования файлов ………………………………………………………………….575
Совместный доступ процессов к данным через механизм проецирования …….576
Файлы, проецируемые на физическую память из страничного файла ……………577
Частичная передача физической памяти проецируемым файлам ……………………583
Глава 18 Динамически распределяемая память……………………………….598
Стандартная куча процесса …………………………………………………………………………………….599
Дополнительные кучи в процессе …………………………………………………………………………600
Защита компонентов …………………………………………………………………………………………………600
Более эффективное управление памятью ……………………………………………………………..601
Локальный доступ …………………………………………………………………………………………………….602
Исключение издержек, связанных с синхронизацией потоков ………………………….602
Быстрое освобождение всей памяти в куче …………………………………………………………..602
Создание дополнительной кучи …………………………………………………………………………….603
Выделение блока памяти из кучи ……………………………………………………………………………605
Изменение размера блока ………………………………………………………………………………………..607
Определение размера блока …………………………………………………………………………………….608
Освобождение блока …………………………………………………………………………………………………608
Уничтожение кучи …………………………………………………………………………………………………….608
Использование куч в программах на C++ ……………………………………………………………..608
Другие функции управления кучами ……………………………………………………………………612

Часть IV Динамически подключаемые библиотеки …………………..615

Глава 19 DLL: основы………………………………………………………………………..616
DLL и адресное пространство процесса ……………………………………………………………….617
Общая картина …………………………………………………………………………………………………………619
Создание DLL-модуля ……………………………………………………………………………………………..622
Создание EXE-модуля ……………………………………………………………………………………………..628
Выполнение EXE-модуля ………………………………………………………………………………………..632
Глава 20 DLL: более сложные методы программирования ………………..634
Явная загрузка DLL и связывание идентификаторов ………………………………………..634
Явная загрузка DLL ………………………………………………………………………………………………….635
Явная выгрузка DLL …………………………………………………………………………………………………639
Явное подключение экспортируемого идентификатора ……………………………………..642
Функция входа/выхода …………………………………………………………………………………………..643
Уведомление DLL_PROCESS_ATTACH ………………………………………………………………644
Уведомление DLL_PROCESS_DETACH ……………………………………………………………..646
Уведомление DLL_THREAD_ATTACH ……………………………………………………………….648
Уведомление DLL_THREAD_DETACH……………………………………………………………….649
Как система упорядочивает вызовы DllMain ………………………………………………………..650
Функция DllMain и библиотека C/C++ …………………………………………………………………653
Отложенная загрузка DLL ……………………………………………………………………………………..654
Программа-пример DelayLoadApp …………………………………………………………………………659
Переадресация вызовов функций ………………………………………………………………………….666
Известные DLL ………………………………………………………………………………………………………..667
Перенаправление DLL …………………………………………………………………………………………….669
Модификация базовых адресов модулей ……………………………………………………………..670
Связывание модулей ……………………………………………………………………………………………….677
Глава 21 Локальная память потока …………………………………………………..681
Динамическая локальная память потока ……………………………………………………………..682
Использование динамической TLS ………………………………………………………………………..684
Статическая локальная память потока …………………………………………………………………687
Глава 22 Внедрение DLL и перехват API-вызовов ……………………………..689
Пример внедрения DLL ………………………………………………………………………………………….690
Внедрение DLL с использованием реестра ………………………………………………………….692
Внедрение DLL с помощью ловушек ……………………………………………………………………694
Утилита для сохранения позиций элементов на рабочем столе …………………………695
Внедрение DLL с помощью удаленных потоков …………………………………………………707
Программа-пример InjLib ………………………………………………………………………………………..711
Библиотека ImgWalk.dll ……………………………………………………………………………………………718
Внедрение троянской DLL ……………………………………………………………………………………..720
Внедрение DLL как отладчика ………………………………………………………………………………720
Внедрение кода через функцию CreateProcess ……………………………………………………..721
Перехват API-вызовов: пример ……………………………………………………………………………..722
Перехват API-вызовов подменой кода …………………………………………………………………..723
Перехват API-вызовов с использованием раздела импорта ……………………………….723
Программа-пример LastMsgBoxInfo ………………………………………………………………………728

Часть V Структурная обработка исключений …………………………..747

Глава 23 Обработчики завершения ………………………………………………….748
Примеры использования обработчиков завершения …………………………………………749
Funcenstein1 ……………………………………………………………………………………………………………….750
Funcenstein2 ……………………………………………………………………………………………………………….750
Funcenstein3 ……………………………………………………………………………………………………………….752
Funcfurter1 …………………………………………………………………………………………………………………753
Проверьте себя: FuncaDoodleDoo……………………………………………………………………………..754
Funcenstein4 ……………………………………………………………………………………………………………….756
Funcarama1 ………………………………………………………………………………………………………………..757
Funcarama2 ………………………………………………………………………………………………………………..758
Funcarama3 ………………………………………………………………………………………………………………..758
Funcarama4: последний рубеж …………………………………………………………………………………759
И еще о блоке finally ………………………………………………………………………………………………….761
Funcfurter2 …………………………………………………………………………………………………………………762
Программа-пример SEHTerm ………………………………………………………………………………….763
Глава 24 Фильтры и обработчики исключений ………………………………….769
Примеры использования фильтров и обработчиков исключений ……………………770
Funcmeister1 ……………………………………………………………………………………………………………….770
Funcmeister2 ……………………………………………………………………………………………………………….771
EXCEPTION_EXECUTE_HANDLER ………………………………………………………………..773
Некоторые полезные примеры ………………………………………………………………………………..774
Глобальная раскрутка ……………………………………………………………………………………………….777
Остановка глобальной раскрутки …………………………………………………………………………..780
EXCEPTION_CONTINUE_EXECUTION ………………………………………………………….782
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION ……………………….783
EXCEPTION_CONTINUE_SEARCH ………………………………………………………………….784
Функция GetExceptionCode ………………………………………………………………………………………786
Функция GetExceptionInformation …………………………………………………………………………..791
Программные исключения ………………………………………………………………………………………795
Глава 25 Необработанные исключения, векторная обработка
исключений и исключения C++ …………………………………………………………..799
Как работает функция UnhandledExceptionFilter …………………………………………………….802
Взаимодействие UnhandledExceptionFilter с WER ………………………………………………….805
Отладка по запросу ………………………………………………………………………………………………….808
Программа-пример Spreadsheet …………………………………………………………………………….811
Векторная обработка исключений и обработчики возобновления ………………….823
Исключения C++ и структурные исключения ……………………………………………………825
Исключения и отладчик ………………………………………………………………………………………….827
Глава 26 Отчеты об ошибках и восстановление приложений …………….831
Консоль Windows Error Reporting …………………………………………………………………………831
Программная генерация отчетов об ошибках в Windows ………………………………….834
Отключение генерации и отправки отчетов ………………………………………………………….836
Настройка генерируемых для процесса отчетов о сбоях …………………………………….837
Создание и настройка отчетов о сбоях …………………………………………………………………..838
Программа-пример Customized WER …………………………………………………………………….847
Автоматический перезапуск и восстановление приложений ……………………………855
Автоматический перезапуск приложения ……………………………………………………………..855
Поддержка восстановления приложений ………………………………………………………………856

Часть VI Приложения ………………………………………………………………859

Приложение А Среда разработки ……………………………………………………..860
Заголовочный файл CmnHdr.h ………………………………………………………………………………860
Раздел Windows Version Build Option …………………………………………………………………….861
Раздел Unicode Build Option ……………………………………………………………………………………861
Раздел Windows Definitions и диагностика уровня 4 …………………………………………..862
Вспомогательный макрос Pragma Message ……………………………………………………………862
Макрос chINRANGE ………………………………………………………………………………………………..863
Макрос chBEGINTHREADEX ……………………………………………………………………………….863
Моя реализация DebugBreak для платформы x86 ………………………………………………..865
Определение кодов программных исключений ……………………………………………………865
Макрос chMB …………………………………………………………………………………………………………….865
Макросы chASSERT и chVERIFY ………………………………………………………………………….865
Макрос chHANDLE_DLGMSG ………………………………………………………………………………866
Макрос chSETDLGICONS ………………………………………………………………………………………866
Принудительное указание компоновщику входной функции (w)WinMain……..866
Поддержка тем оформления Windows XP c помощью директивы pragma ………867
Приложение Б Распаковщики сообщений, макросы
для дочерних элементов управления и API-макросы …………………………..873
Макросы — распаковщики сообщений …………………………………………………………………874
Макросы для дочерних элементов управления …………………………………………………..876
API-макросы …………………………………………………………………………………………………………….877
Об авторе ……………………………………………………………………………………………878