Дублирование описателей объектов - часть 2
Второй флаг приводит к закрытию описателя в процессе-источнике. Он позволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется.
Попробуем проиллюстрировать работу функции Duplicatellandle на примере. Здесь S — это процесс-источник, имеющий доступ к какому-то объекту ядра, Т — это процесс-приемник, который получит доступ к тому же объекту ядра, а С — процесс катализатор, вызывающий функцию DuplicateHandle.
Таблица описателей в процессе С (см таблицу 3-4) содержит два индекса - 1 и 2. Описатель с первым значением идентифицирует объект ядра "процесс S", описатель со вторым значением — объект ядра "процесс Т"
Индекс |
Указатель на блок |
Маска доступа (DWORD |
Флаги (DWORD с |
1 |
0xF0000000 |
0x???????? |
0x00000000 |
2 |
0xF0000010 (обьект ядра процесса Т) |
0x???????? |
0x00000000 |
Таблица 3-4. Таблица описателей в процессе С
Таблица 3-5 иллюстрирует таблицу описателей в процессе S, содержащую единственную запись со значением описателя, равным 2. Этот описатель может идентифицировать объект ядра любого типа, а не только "процесс".
Индекс |
Указатель на блок |
Маска доступа (DWORD |
Флаги (DWORD с набором |
1 |
0x00000000 |
(неприменим) |
(неприменим) |
2 |
0xF0000020 |
0x???????? |
0x00000000 |
Таблица 3-5. Таблица описателей в процессе S
В таблице 3-6 показано, что именно содержит таблица описателей в процессе Т перед вызовом процессом С функции DuplicateHandle. Как видите, в ней всего одна запись со значением описателя, равным 2, а запись с индексом 1 пока пуста.
Индекс |
Указатель на блок памяти объекта ядра |
Маска доступа (DWORD с набором битовых флагов) |
Флаги (DWORD с набором |
1 |
0x00000000 |
(неприменим) |
(неприменим) |
2 |
0xF0000030 |
0x???????? |
0x00000000 |