Это издание — практически новая книга, посвященная программированию серьезных приложений на Microsoft Visual C++ в операционных системах Windows 2000 (322 и 644 разрядных версиях) и Windows 98 с использованием функций Windows API. Состоит из 27 глав, двух приложений. Гораздо глубже, чем в предыдущих изданиях, рассматриваются такие темы, как взаимодействие с операционной системой, библиотеки C/C++, программ мирование DLL и оптимизация кода, описываются новые механизмы и функции, появившиеся в Windows 2000, и приводится информация, специфическая для 64-разрядной Windows 2000. В этом издании автор, перейдя с языка C на C++, переработал все программы примеры и представил ряд новых приложений, например ProcessInfo и LISWatch. Также появились совершенно новые материалы: выравнивание данных, привязка потоков к процессорам, кэшшлинии процессоров, архитектура NUMA, перехват APIIвызовов и др. Книга предназначена профессиональным программистам, владеющим языком C/C++ и имеющим опыт разработки Windows приложений. Прилагаемый компактдиск содержит все программы из книги (исходный код и исполняемые файлы для процессоров x86, IAA64 и Alpha).
Author(s): Рихтер Дж.
Series: Для профессионалов
Edition: 4
Publisher: Питер, Русская Редакция
Year: 2008
Language: Russian
Pages: 743
Оглавление......Page 5
Сегодняшние Windows-платформы......Page 13
Ядро Windows 98......Page 14
Завтрашние Windows-платформы (64-разрядная Windows 2000)......Page 15
Что нового в четвертом издании......Page 16
Техническая поддержка......Page 19
Спасибо всем за помощь......Page 20
Часть I. Материалы для обязательного чтения......Page 21
Глава 1. Обработка ошибок......Page 22
Вы тоже можете это сделать......Page 26
Программа-пример ErrorShow......Page 27
Одно- и двухбайтовые наборы символов......Page 31
Unicode: набор «широких» символов......Page 32
Windows 98 и Unicode......Page 33
В чью пользу счет?......Page 34
Unicode и библиотека C......Page 35
Типы данных, определенные в Windows для Unicode......Page 37
Unicode- и ANSI-функции в Windows......Page 38
Строковые функции Windows......Page 39
Создание программ, способных использовать и ANSI, и Unicode......Page 40
Текстовые файлы......Page 43
Перекодировка строк из Unicode в ANSI и обратно......Page 44
Что такое объект ядра......Page 48
Защита......Page 49
Таблица описателей объектов ядра......Page 51
Создание объекта ядра......Page 52
Закрытие объекта ядра......Page 53
Совместное использование объектов ядра несколькими процессами......Page 54
Наследование описателя объекта......Page 55
Изменение флагов описателя......Page 57
Именованные объекты......Page 58
Дублирование описателей объектов......Page 62
Часть II. Начинаем работать......Page 67
Глава 4. Процессы......Page 68
Ваше первое Windows-приложение......Page 69
Описатель экземпляра процесса......Page 73
Описатель предыдущего экземпляра процесса......Page 74
Командная строка процесса......Page 75
Переменные окружения......Page 76
Режим обработки ошибок......Page 79
Текущие каталоги для процесса......Page 80
Определение версии системы......Page 81
Функция CreateProcess......Page 84
Параметры pszApplicationName и pszCommandLine......Page 85
Параметры psaProcess, psaThread и bInheritHandles......Page 87
Параметр fdwCreate......Page 89
Параметр psiStartInfo......Page 91
Параметр ppiProcInfo......Page 95
Функция ExitProcess......Page 97
Когда все потоки процесса уходят......Page 99
Дочерние процессы......Page 100
Перечисление процессов, выполняемых в системе......Page 102
Программа-пример ProcessInfo......Page 103
Глава 5. Задания......Page 118
Определение ограничений, налагаемых на процессы в задании......Page 121
Включение процесса в задание......Page 127
Завершение всех процессов в задании......Page 128
Получение статистической информации о задании......Page 129
Уведомления заданий......Page 132
Программа-пример JobLab......Page 134
Глава 6. Базовые сведения о потоках......Page 150
В каких случаях потоки создаются......Page 151
И в каких случаях потоки не создаются......Page 152
Ваша первая функция потока......Page 153
Функция CreateThread......Page 154
Параметр cbStack......Page 155
Параметры pfnStartAddr и pvParam......Page 156
Завершение потока......Page 157
Функция TerminateThread......Page 158
Что происходит при завершении потока......Page 159
Кое-что о внутреннем устройстве потока......Page 160
Некоторые соображения по библиотеке C/C++......Page 162
Ой, вместо _beginthreadex я по ошибке вызвал CreateThread......Page 170
Библиотечные функции, которые лучше не вызывать......Page 171
Преобразование псевдоописателя в настоящий описатель......Page 172
Глава 7. Планирование потоков, приоритет и привязка к процессорам......Page 175
Приостановка и возобновление потоков......Page 176
Приостановка и возобновление процессов......Page 177
Переключение потоков......Page 179
Определение периодов выполнения потока......Page 180
Структура CONTEXT......Page 182
Приоритеты потоков......Page 187
Абстрагирование приоритетов......Page 188
Программирование приоритетов......Page 191
Динамическое изменение уровня приоритета потока......Page 194
Подстройка планировщика для активного процесса......Page 195
Программа-пример Scheduling Lab......Page 196
Привязка потоков к процессорам......Page 202
Атомарный доступ: семейство Interlocked-функций......Page 207
Кэш-линии......Page 213
Худшее, что можно сделать......Page 215
Критические секции......Page 217
Критические секции: важное дополнение......Page 220
Критические секции и спин-блокировка......Page 222
Критические секции и обработка ошибок......Page 223
На каждый разделяемый ресурс используйте отдельную структуру CRITICAL_SECTION......Page 224
Одновременный доступ к нескольким ресурсам......Page 225
Не занимайте критические секции надолго......Page 226
Глава 9. Синхронизация потоков......Page 227
Wait-функции......Page 229
Побочные эффекты успешного ожидания......Page 231
События......Page 233
Программа-пример Handshake......Page 236
Ожидаемые таймеры......Page 241
Ожидаемые таймеры и APC-очередь......Page 244
И еще кое-что о таймерах......Page 246
Семафоры......Page 247
Мьютексы......Page 249
Мьютексы и критические секции......Page 251
Программа-пример Queue......Page 252
Сводная таблица объектов, используемых для синхронизации потоков......Page 259
Асинхронный ввод-вывод на устройствах......Page 260
Функция WaitForInputIdle......Page 261
Функция SignalObjectAndWait......Page 262
Реализация критической секции: объект-оптекс......Page 265
Программа-пример Optex......Page 267
Создание инверсных семафоров и типов данных, безопасных в многопоточной среде......Page 276
Программа-пример InterlockedType......Page 280
Синхронизация в сценарии «один писатель/группа читателей»......Page 287
Программа-пример SWMRG......Page 289
Реализация функции WaitForMultipleExpressions......Page 295
Программа-пример WaitForMultExp......Page 297
Глава 11. Пулы потоков......Page 309
Сценарий 1: асинхронный вызов функций......Page 310
Сценарий 2: вызов функций через определенные интервалы времени......Page 312
Программа-пример TimedMsgBox......Page 316
Сценарий 3: вызов функций при освобождении отдельных объектов ядра......Page 318
Сценарий 4: вызов функций по завершении запросов на асинхронный ввод-вывод......Page 320
Работа с волокнами......Page 323
Программа-пример Counter......Page 326
Часть III. Управление памятью......Page 333
Виртуальное адресное пространство процесса......Page 334
Как адресное пространство разбивается на разделы......Page 335
Раздел для кода и данных пользовательского режима (Windows 2000 и Windows 98)......Page 336
Увеличение раздела для кода и данных пользовательского режима до 3 Гб на процессорах x86 (только Windows 2000)......Page 337
Закрытый раздел размером 64 Кб (только Windows 2000)......Page 338
Регионы в адресном пространстве......Page 339
Физическая память и страничный файл......Page 340
Физическая память в страничном файле не хранится......Page 343
Атрибуты защиты......Page 344
Защита типа «копирование при записи»......Page 345
Подводя итоги......Page 346
Блоки внутри регионов......Page 349
Особенности адресного пространства в Windows 98......Page 353
Выравнивание данных......Page 357
Системная информация......Page 362
Программа-пример SysInfo......Page 363
Статус виртуальной памяти......Page 367
Программа-пример VMStat......Page 368
Определение состояния адресного пространства......Page 371
Функция VMQuery......Page 373
Программа-пример VMMap......Page 380
Резервирование региона в адресном пространстве......Page 388
Резервирование региона с одновременной передачей физической памяти......Page 390
В какой момент региону передают физическую память......Page 391
Возврат физической памяти и освобождение региона......Page 393
В какой момент физическую память возвращают системе......Page 394
Программа-пример VMAlloc......Page 395
Изменение атрибутов защиты......Page 402
Сброс содержимого физической памяти......Page 403
Программа-пример MemReset......Page 404
Механизм Address Windowing Extensions (только Windows 2000)......Page 407
Программа-пример AWE......Page 411
Глава 16. Стек потока......Page 418
Стек потока в Windows 98......Page 421
Функция из библиотеки C/C++ для контроля стека......Page 423
Программа-пример Summation......Page 424
Проецирование в память ЕХЕ- и DLL-файлов......Page 429
Статические данные не разделяются несколькими экземплярами EXE или DLL......Page 431
Статические данные разделяются несколькими экземплярами EXE или DLL......Page 433
Программа-пример AppInst......Page 437
Метод 1: один файл, один буфер......Page 440
Метод 3: один файл, два буфера......Page 441
Этап 1: создание или открытие объекта ядра «файл»......Page 442
Этап 2: создание объекта ядра «проекция файла»......Page 443
Этап 3: проецирование файловых данных на адресное пространство процесса......Page 446
Этап 4: отключение файла данных от адресного пространства процесса......Page 449
Этапы 5 и 6: закрытие объектов «проекция файла» и «файл»......Page 450
Программа-пример FileRev......Page 451
Обработка больших файлов......Page 457
Проецируемые файлы и когерентность......Page 458
Базовый адрес файла, проецируемого в память......Page 459
Особенности проецирования файлов на разных платформах......Page 461
Файлы, проецируемые на физическую память из страничного файла......Page 463
Программа-пример MMFShare......Page 464
Частичная передача физической памяти проецируемым файлам......Page 468
Программа-пример MMFSparse......Page 470
Стандартная куча процесса......Page 481
Защита компонентов......Page 482
Более эффективное управление памятью......Page 483
Исключение издержек, связанных с синхронизацией потоков......Page 484
Создание дополнительной кучи......Page 485
Выделение блока памяти из кучи......Page 486
Изменение размера блока......Page 487
Уничтожение кучи......Page 488
Использование куч в программах на C++......Page 489
Другие функции управления кучами......Page 492
Часть IV. Динамически подключаемые библиотеки......Page 494
Глава 19. DLL: основы......Page 495
DLL и адресное пространство процесса......Page 496
Общая картина......Page 498
Создание DLL-модуля......Page 500
Что такое экспорт......Page 502
Создание DLL для использования с другими средствами разработки (отличными от Visual C++)......Page 504
Создание EXE-модуля......Page 505
Что такое импорт......Page 506
Выполнение EXE-модуля......Page 508
Явная загрузка DLL......Page 511
Явная выгрузка DLL......Page 513
Явное подключение экспортируемого идентификатора......Page 515
Функция входа/выхода......Page 516
Уведомление DLL_PROCESS_ATTACH......Page 517
Уведомление DLL_PROCESS_DETACH......Page 518
Уведомление DLL_THREAD_ATTACH......Page 520
Уведомление DLL_THREAD_DETACH......Page 521
Как система упорядочивает вызовы DllMain......Page 522
Функция DllMain и библиотека C/C++......Page 524
Отложенная загрузка DLL......Page 525
Программа-пример DelayLoadApp......Page 529
Переадресация вызовов функций......Page 535
Известные DLL......Page 536
Перенаправление DLL......Page 537
Модификация базовых адресов модулей......Page 538
Связывание модулей......Page 543
Глава 21. Локальная память потока......Page 546
Динамическая локальная память потока......Page 547
Использование динамической TLS......Page 549
Статическая локальная память потока......Page 550
Пример внедрения DLL......Page 552
Внедрение DLL с использованием реестра......Page 554
Внедрение DLL с помощью ловушек......Page 556
Утилита для сохранения позиций элементов на рабочем столе......Page 557
Внедрение DLL с помощью удаленных потоков......Page 568
Программа-пример InjLib......Page 572
Библиотека ImgWalk.dll......Page 577
Внедрение DLL как отладчика......Page 580
Внедрение кода через функцию CreateProcess......Page 581
Перехват API-вызовов подменой кода......Page 582
Перехват API-вызовов с использованием раздела импорта......Page 583
Программа-пример LastMsgBoxInfo......Page 586
Часть V. Структурная обработка исключений......Page 601
Глава 23. Обработчики завершения......Page 602
Funcenstein1......Page 603
Funcenstein2......Page 604
Funcenstein3......Page 605
Funcfurter1......Page 606
Проверьте себя: FuncaDoodleDoo......Page 607
Funcenstein4......Page 608
Funcarama1......Page 609
Funcarama3......Page 610
Funcarama4: последний рубеж......Page 611
Funcfurter2......Page 613
Программа-пример SEHTerm......Page 614
Примеры использования фильтров и обработчиков исключений......Page 617
Funcmeister2......Page 618
EXCEPTION_EXECUTE_HANDLER......Page 620
Некоторые полезные примеры......Page 621
Глобальная раскрутка......Page 623
Остановка глобальной раскрутки......Page 626
EXCEPTION_CONTINUE_EXECUTION......Page 627
Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION......Page 628
EXCEPTION_CONTINUE_SEARCH......Page 629
Функция GetExceptionCode......Page 630
Функция GetExceptionInformation......Page 634
Программные исключения......Page 638
Глава 25. Необработанные исключения и исключения C++......Page 641
Отладка по запросу......Page 643
Принудительное завершение процесса......Page 644
Создание оболочки вокруг всех функций потоков......Page 645
Явный вызов функции UnhandledExceptionFilter......Page 646
Функция UnhandledExceptionFilter изнутри......Page 647
Исключения и отладчик......Page 648
Программа-пример Spreadsheet......Page 651
Исключения C++ и структурные исключения......Page 660
Перехват структурных исключений в C++......Page 662
Часть VI. Операции с окнами......Page 665
Глава 26. Оконные сообщения......Page 666
Посылка асинхронных сообщений в очередь потока......Page 667
Посылка синхронных сообщений окну......Page 669
Пробуждение потока......Page 674
Флаги состояния очереди......Page 675
Алгоритм выборки сообщений из очереди потока......Page 676
Пробуждение потока с использованием объектов ядра или флагов состояния очереди......Page 679
Передача данных через сообщения......Page 682
Программа-пример CopyData......Page 684
Как Windows манипулирует с ANSI/Unicode-символами и строками......Page 687
Поток необработанного ввода......Page 689
Ввод с клавиатуры и фокус......Page 691
Управление курсором мыши......Page 695
Подключение к очередям виртуального ввода и переменным локального состояния ввода......Page 696
Программа-пример LISLab......Page 698
Программа-пример LISWatch......Page 710
Раздел Windows Version Build Option......Page 716
Раздел Windows Definitions и диагностика уровня 4......Page 717
Макрос chBEGINTHREADEX......Page 718
Макрос chHANDLE_DLGMSG......Page 720
Принудительное указание компоновщику входной функции (w)WinMain......Page 721
Приложение Б. Распаковщики сообщений, макросы для дочерних элементов управления и API-макросы......Page 727
Макросы — распаковщики сообщений......Page 728
Макросы для дочерних элементов управления......Page 730
API-макросы......Page 731
Предметный указатель......Page 732