Книга "Windows via C/C++. Программирование на языке Visual C++" - практически новая книга, посвященная разработке серьезных приложений на Visual C++ в операционных системах Windows XP и Windows Vista (32- и 64-разрядных версиях) с использованием функций Windows API. Гораздо глубже, чем в предыдущих изданиях, рассматриваются такие темы, как механизм User Account Control, взаимодействие с системой библиотеки C/C++ при реализации защитных механизмов и обработке исключений; представлены новые синхронизирующие механизмы. В это издание добавлены две совершенно новые главы: о механизмах ввода-вывода и о работе новой системы Windows Error Reporting, изменившей подходы к созданию отчетов об ошибках и восстановлению приложений после сбоев. Книга предназначена для профессиональных программистов, владеющих языком С/С++ и имеющим опыт разработки Windows-приложений. Исходные тексты для всех программ-примеров из книги читатели найдут на веб-сайте поддержки нового издания. Книга состоит из 26 глав и двух приложений.
Оглавление
Благодарности ................................................................................................. 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
Эта книга поможет вам быстро освоить язык С++. Обширные и сложные темы исчерпывающе представлены в ней на уровне основных концепций, которые необходимо знать каждому программисту для написания реальных программ на языке С++. Приведенные примеры и предлагаемые упражнения весьма эффективны, что поможет быстро освоить излагаемый матриал.