Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.07;
Скачать: CL | DM;

Вниз

Владелец Thread-а   Найти похожие ветки 

 
Ученик ©   (2002-09-03 18:36) [0]

Есть идентификатор thread-а, можно вызвать OpenThread (Windows 2000), есть ли простой способ узнать откуда этот Thread (из какого процесса) ?


 
MBo ©   (2002-09-04 07:05) [1]

знаю только способ с CreateToolhelp32Snapshot и THREADENTRY32.th32OwnerProcessID


 
Ученик ©   (2002-09-04 08:30) [2]

>MBo © (04.09.02 07:05)
Спасибо, но это все-таки перебор, как и через NtQuerySystemInformation, может все-таки у кого-нибудь найдется способ определять процесс-владелец, как например, определяется пользователь, запустивший процесс, или что-нибудь недокументированное.


 
Ученик ©   (2002-09-04 13:11) [3]

>Ученик © (03.09.02 18:36)

const
THREAD_TERMINATE = $0001;
THREAD_SUSPEND_RESUME = $0002;
THREAD_GET_CONTEXT = $0008;
THREAD_SET_CONTEXT = $0010;
THREAD_SET_INFORMATION = $0020;
THREAD_QUERY_INFORMATION = $0040;
THREAD_SET_THREAD_TOKEN = $0080;
THREAD_IMPERSONATE = $0100;
THREAD_DIRECT_IMPERSONATION = $0200;

type
NTSTATUS = DWORD;

TThreadBasicInformation = packed record
ExitStatus : NTSTATUS;
TebBaseAddress : Pointer;
UniqueProcessId : ULONG;
UniqueThreadId : ULONG;
AffinityMask : ULONG;
BasePriority : ULONG;
DiffProcessPriority : ULONG;
end;

function OpenThread(dwDesiredAccess : DWORD; // access right
bInheritHandle : BOOL; // handle inheritance option
dwThreadId : DWORD) : // thread identifier
THandle; stdcall; external "kernel32.dll";

function NtQueryInformationThread(hThread : THandle;
ThreadInfoClass : DWord{TThreadInfoClass};
ThreadInfoBuffer : Pointer;
ThreadInfoBufferLength : DWord;
pdwBytesReturned : PDWord) : NTSTATUS; stdcall; external "ntdll.dll";

function GetThreadProcessID(aThreadID : DWord) : DWord;
var
hThread : THandle;
TBI : TThreadBasicInformation;
dwSize : DWord;
begin
Result := 0;
hThread := OpenThread(THREAD_QUERY_INFORMATION, False, aThreadID);
if hThread <> 0 then try
if NtQueryInformationThread(hThread, 0, @TBI, SizeOf(TBI), @dwSize) = 0 then
Result := TBI.UniqueProcessId
finally
CloseHandle(hThread)
end
end;


 
Ученик ©   (2002-09-06 09:08) [4]

Название модуля-владельца Thread-а

type
TThreadInfoClass = (ThreadBasicInformation, ThreadTimes, ThreadPriority,
ThreadBasePriority,ThreadAffinityMask,
ThreadImpersonationToken,ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,ThreadZeroTlsCell,
ThreadPerformanceCount,ThreadAmILastThread,
ThreadIdealProcessor,ThreadPriorityBoost,
ThreadSetTlsArrayAddress,ThreadIsIoPending,
ThreadHideFromDebugger,MaxThreadInfoClass);

NTSTATUS = DWORD;

TThreadBasicInformation = packed record
ExitStatus : NTSTATUS;
TebBaseAddress : Pointer;
UniqueProcessId : ULONG;
UniqueThreadId : ULONG;
AffinityMask : ULONG;
BasePriority : ULONG;
DiffProcessPriority : ULONG;
end;

const
THREAD_QUERY_INFORMATION = $0040;

function OpenThread(dwDesiredAccess : DWORD; // access right
bInheritHandle : BOOL; // handle inheritance option
dwThreadId : DWORD) : // thread identifier
THandle; stdcall; external "kernel32.dll";


function NtQueryInformationThread(hThread : THandle;
ThreadInfoClass : TThreadInfoClass;
ThreadInfoBuffer : Pointer;
ThreadInfoBufferLength : DWord;
pdwBytesReturned : PDWord) : NTSTATUS; stdcall; external "ntdll.dll";

function GetModuleFileNameEx(hProcess: THandle; hModule: HMODULE;
lpFilename: PChar; nSize: DWORD): DWORD; stdcall; external "psapi.dll" name "GetModuleFileNameExA";

function ThreadModuleName(aThreadID : DWord; var ModuleName : string) : Boolean;
var
hProcess, hThread : THandle;
dwSize : DWord;
MemInfo: TMemoryBasicInformation;
TBI : TThreadBasicInformation;
StartAddress : Pointer;
szModuleName : array[0..MAX_PATH] of Char;
begin
Result := False; ModuleName := "";
hThread := OpenThread(THREAD_QUERY_INFORMATION, False, aThreadID);
if hThread <> 0 then try
if (NtQueryInformationThread(hThread, ThreadBasicInformation, @TBI, SizeOf(TBI), @dwSize) = 0) and
(NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, @StartAddress, SizeOf(StartAddress), @dwSize) = 0) then begin
hProcess := OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION, False, TBI.UniqueProcessId);
if hProcess <> 0 then try
if VirtualQueryEx(hProcess, StartAddress, MemInfo, SizeOf(MemInfo)) > 0 then begin
if MemInfo.State = MEM_COMMIT then
if GetModuleFileNameEx(hProcess, THandle(MemInfo.AllocationBase), szModuleName, MAX_PATH) > 0 then begin
ModuleName := StrPas(szModuleName);
Result := True
end
end
finally
CloseHandle(hProcess)
end
end
finally
CloseHandle(hThread)
end
end;

P.S. Спасибо Digitman ©



Страницы: 1 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-21624
Юлия
2002-10-26 17:51
2002.11.07
Изменение цвета ячеек grid-а


14-21776
Карлсон
2002-10-18 18:38
2002.11.07
сколько весит кирпич?


1-21659
-Alex-
2002-10-27 12:21
2002.11.07
ВЫТЯГИВАНИЕ ИКОНКИ. ПОМОГИТЕ!


8-21687
Daniil
2002-07-14 18:08
2002.11.07
Ошибка при инициализаци клавы,маши...


7-21829
max2057
2002-09-04 23:45
2002.11.07
version number для драйвера NT