> я уже изрядно подзабыл все это - но такой вариант на мой > взгляд не прокатит - HANDLE воспримется в контексте того > процесса откуда будет вызвана ф-я NtQueryInformationThread > соответственно ее надо вызывать из того процесса кому > принадлежит этот HANDLE.
Так оно и есть. HANDLE - индекс в некоторой таблице, которая хранится в адресном пространстве процесса. Для каждого процесса таблица своя. А псевдо-хендел, это вообще совсем не хендел, а оптимизация.
Но мне казалось HANDLE, о котором идёт речь - это именно хендел в адресном пространстве процесса, в котором и нужно получить ID. Так что всё должно работать.
Только вот что это за NtQueryInformationThread?
Я думал имеется ввиду пользовательский режим.
---
Кроме того, идея не верна в корне - может быть два разных хендела одного и того же об'єкта.
[win32] можно ли зная handle для нити чужого процесса получить ее id12.08.02 04:39 Автор: beetle <beetle> Статус: Member Отредактировано 12.08.02 04:44 Количество правок: 1
> NtQueryInformationThread ( IN HANDLE ThreadHandle,//даешь > сюда свой хендл > IN THREADINFOCLASS tic,//тип нужной инфы > OUT PVOID Info,//возвращаемая инфа > IN ULONG ThreadInfoLength,//размер передаваемого буфера > OUT PULONG Returnlength OPTIONAL);
я уже изрядно подзабыл все это - но такой вариант на мой взгляд не прокатит - HANDLE воспримется в контексте того процесса откуда будет вызвана ф-я NtQueryInformationThread соответственно ее надо вызывать из того процесса кому принадлежит этот HANDLE.
cb.
[win32] можно ли зная handle для нити чужого процесса получить ее id13.08.02 01:42 Автор: Biasha <Бяша> Статус: Member
> я уже изрядно подзабыл все это - но такой вариант на мой > взгляд не прокатит - HANDLE воспримется в контексте того > процесса откуда будет вызвана ф-я NtQueryInformationThread > соответственно ее надо вызывать из того процесса кому > принадлежит этот HANDLE.
Так оно и есть. HANDLE - индекс в некоторой таблице, которая хранится в адресном пространстве процесса. Для каждого процесса таблица своя. А псевдо-хендел, это вообще совсем не хендел, а оптимизация.
Но мне казалось HANDLE, о котором идёт речь - это именно хендел в адресном пространстве процесса, в котором и нужно получить ID. Так что всё должно работать.
Только вот что это за NtQueryInformationThread?
Я думал имеется ввиду пользовательский режим.
[win32] можно ли зная handle для нити чужого процесса получить ее id13.08.02 05:43 Автор: beetle <beetle> Статус: Member
> Так оно и есть. HANDLE - индекс в некоторой таблице, > которая хранится в адресном пространстве процесса. Для > каждого процесса таблица своя. А псевдо-хендел, это вообще > совсем не хендел, а оптимизация. > Но мне казалось HANDLE, о котором идёт речь - это именно > хендел в адресном пространстве процесса, в котором и нужно > получить ID. Так что всё должно работать.
описатель (он же HANDLE ) - это индекс определенной записи в таблице описателей объектов ядра некоторого процесса.Существуют механизмы совместного использования объектов ядра несколькими РАЗНЫМИ процессами.В таком случае запись из таблицы описателей объктов одного процесса копируется в соответствующую таблицу друго процесса.При этом значения хендлов могут различаться.В данном случае если есть описатель объекта ядра "поток", то он будет валидным для потока в другом процессе,если хендл получен с помощью механизма дублирования хендлов к примеру либо иного корректного механизма. Потому ентот хендл может быть абсолютно нормально использован к примеру для получения информации о потоке,на объект которого он указывает.
> Только вот что это за NtQueryInformationThread? > Я думал имеется ввиду пользовательский режим. функция из библиотеки ntdll.dll- ядра системы.Функционирует в пользовательском режиме.А вот из нее уже при трассировке попадаешь в нулевое кольцо
[Win32] ежели это псевдохендл,тогда согласен. А ежели нормальный, то не вижу повода.12.08.02 17:39 Автор: beetle <beetle> Статус: Member
а что есть "нормальный" HANDLE, если я ничего не путаю то HANDLE всегда принадлежит процессу его создавшему, и не важно в UserMode это делается или в KernelMode - контекст процесса есть всегда. Во всяком случае в ядре при открытии TCP соединения мне не удавалось использовать HANDLE открытый в контексте SYSTEM в произвольном процессе, пришлось всю работу затолкать в SystemThread.