Мне надо приостановить процесс. Вопрос вроде уже поднимался, но ответа в той теме я так и не нашел. Понял, что надо приостановить все потоки этого процесса. Подскажите pls как это можно сделать, кусок кода приветствуется.
Что-то уж слишком сложно для простого поиска всех потоков... Совместимость с W2k вообще-то хотелось бы оставить. На всякие случай... Еще такой вопрос по теме: есть драйвер, перехватывающий NtOpenFile. В функции NewNtOpenFile я обрабатываю всякие параметры и на это время торможу текущий поток функцией KeDelayExecutionThread. Так вот, что будет, если в этот момент другой поток этого процесса обратится к этой функции? (NewNtOpenFile). В принципе если он тоже приостановится, то вопросов у меня больше нет. Драйвер ведь исполняется в контексте процесса? Или главного потока процесса?
Это я понимаю, я же написал еще в первом своем посте. КАК мне их перебрать, какой функцией? Извините, если туплю.
ThreadListHead в EPROCESS - голова двусвязного списка, который содержит в себе записи (ETHREAD) всех потоков указанного процесса.
я бы посоветовал заюзать дебуг-апи из юзер-мода понятно как из кернела вроде тоже наверное можно, потрахавшись с лпц-портами зато! сразу все потоки фризятся по свистку, это вам не перебор списка, а вдруг в этот момент как раз CreateThread()
И все-таки не думаю что секс с ЛПЦ-портами лучше перебора. И что? Во-первых вероятность катастрофически мала. Во-вторых: мы же просто читаем, бсода однозначно не будет. Можно на крайняк перебрать потоки первый раз, попутно их замораживая, а потом перебрать второй раз, для "самоуспокоения"...
Код (Text): NTSTATUS NtSuspendThreadById(HANDLE nThreadId){ NTSTATUS rc; HANDLE hThread; ULONG nCount; CLIENT_ID cid = { (HANDLE)0, (HANDLE)nThreadId }; OBJECT_ATTRIBUTES attr = { sizeof (OBJECT_ATTRIBUTES), 0, NULL, 0, NULL, NULL }; rc = ZwOpenThread(&hThread,THREAD_ALL_ACCESS,&attr,&cid); if (!NT_SUCCESS(rc)){ return rc; } //rc = NtSuspendThread(hThread,&nCount); // докончить тут return rc; } NTSTATUS NtStopAllThreadsByProcessName(PCWSTR ProcessName){ NTSTATUS rc = STATUS_SUCCESS; HANDLE hProcess; PVOID pSystemInfo; PSYSTEM_PROCESSES_INFORMATION pSysProcesses; PSYSTEM_THREADS_INFORMATION pSysThreads; ULONG nSysInfoLength = 0x5f50; UNICODE_STRING usProcess; ULONG i; RtlInitUnicodeString(&usProcess,ProcessName); pSystemInfo = ExAllocatePool(NonPagedPool,nSysInfoLength); rc = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pSystemInfo,nSysInfoLength,&nSysInfoLength); while(rc==STATUS_INFO_LENGTH_MISMATCH){ ExFreePool(pSystemInfo); nSysInfoLength = nSysInfoLength*2; pSystemInfo = ExAllocatePool(NonPagedPool,nSysInfoLength); rc = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pSystemInfo,nSysInfoLength,&nSysInfoLength); } pSysProcesses = pSystemInfo; while(pSysProcesses){ if(RtlCompareUnicodeString(&pSysProcesses->ProcessName,&usProcess,TRUE) == 0){ pSysThreads = (PSYSTEM_THREADS_INFORMATION)pSysProcesses->Threads; break; } if (pSysProcesses->NextEntryDelta){ (char *)pSysProcesses += pSysProcesses->NextEntryDelta; } else { pSysProcesses = NULL; } } DbgPrint("Threads of process[%d] is [%d]",pSysProcesses->ProcessId,pSysProcesses->ThreadCount); __asm int 3; for( i = 0;i < pSysProcesses->ThreadCount ; i++ ){ rc = NtSuspendThreadById((HANDLE)pSysThreads[i].ClientId.UniqueThread); if (NT_SUCCESS(rc)){ DbgPrint("Thread suspended %d\n",pSysThreads[i].ClientId.UniqueThread); } else { DbgPrint("Cant suspend thread %d\n",pSysThreads[i].ClientId.UniqueThread); } } return rc; }
DoZENT На сайте посмотри приложения к его статьям, там есть то что тебе нужно. Да и написать это не сложно. Проще написать чем столько времени ждать ответа на вопрос