windows-kernel - может ли идентификатор потока когда-либо совпадать с идентификатором процесса? - PullRequest
0 голосов
/ 11 октября 2011

Привет! Я искал ответ на этот вопрос, и мне интересно, знает ли кто-нибудь, имеющий опыт работы с внутренними компонентами Windows, ядро ​​когда-либо назначит идентификатор процесса, который совпадает с идентификатором потока. Я имею в виду, что есть запущенный мной процесс a.exe, имеющий поток с идентификатором 123. Если запущен другой процесс, например b.exe, будет ли идентификатор процесса 123? Другими словами, когда идентификаторы процессов и потоков сталкиваются? Спасибо

РЕДАКТИРОВАТЬ: Кажется, что идентификаторы процессов и потоков происходят из того же пула, который называется PspCidTable. Хакер по имени Полином, который просматривал источник Windows NT, говорит следующее:

Ядро должно иметь возможность генерировать последовательность процессов и идентификаторы потоков, которые являются уникальными для всей системы. Чтобы эффективно и безопасно сделать это, ядро ​​создает пул идентификаторов, которые могут быть использованы для как процессы, так и потоки. Этот пул экспортируется в ядре как HANDLE_TABLE объект с именем PspCidTable. Во время запуска Phase0 система, функция PspInitPhase0 вызывается. Эта функция создает HANDLE_TABLE объект с использованием ExCreateHandleTable, который автоматически заполняет таблицу 65536 Каждая запись 16-битная целое число без знака (по крайней мере, в 32-битной ОС), хранящееся в списке объект item, являющийся частью двусвязного списка. Оба процесса и идентификаторы потоков поступают из пула PspCidTable.

Источник выше: Вещи, которые вы (вероятно) не знали о Windows

PspCidTable все еще существует в Windows XP , и эмпирические наблюдения в Windows 7 наводят меня на мысль, что вышесказанное все еще верно.

1 Ответ

3 голосов
/ 11 октября 2011

Идентификаторы потоков и процессов происходят из одного и того же пула во всех версиях Windows AFAIK, но это не значит, что это будет всегда.На практике это не должно иметь никакого значения, поскольку вы должны передавать только то, что, как вам известно, является идентификатором потока, в OpenThread и наоборот.

Не принимайте других вещей об этих идентификаторах (не 16-битные, они могут показаться, что они на NT, но можно получить идентификаторы> 0xffff (на Win9x они xor'ed с секретом и часто используют полные 32 бита))

Единственноестранная вещь, о которой вы должны помнить: в 64-битных системах они являются 32-битными в пользовательском режиме и имеют размер указателя в режиме ядра (используйте HandleToUlong / UlongToHandle)

...