Приостановить все потоки процесса

Тема в разделе "WASM.NT.KERNEL", создана пользователем DoZENT, 3 июл 2007.

  1. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    Мне надо приостановить процесс. Вопрос вроде уже поднимался, но ответа в той теме я так и не нашел. Понял, что надо приостановить все потоки этого процесса. Подскажите pls как это можно сделать, кусок кода приветствуется.
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    DoZENT

    Перехвати SwitchContext и далее если это поток от искомого процесса - то останавливай.
     
  3. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    NTSTATUS NtSuspendProcess(HANDLE hProcess)
    - если под ХР и выше
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    toolhelp + suspendthread
     
  5. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    Что-то уж слишком сложно для простого поиска всех потоков...

    Совместимость с W2k вообще-то хотелось бы оставить. На всякие случай...

    Еще такой вопрос по теме: есть драйвер, перехватывающий NtOpenFile. В функции NewNtOpenFile я обрабатываю всякие параметры и на это время торможу текущий поток функцией KeDelayExecutionThread. Так вот, что будет, если в этот момент другой поток этого процесса обратится к этой функции? (NewNtOpenFile). В принципе если он тоже приостановится, то вопросов у меня больше нет. Драйвер ведь исполняется в контексте процесса? Или главного потока процесса?
     
  6. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    я говорю про ринг0
     
  7. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    Ну вот опять тема заглохла :dntknw:
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну перебери все потоки процесса, и ZwSuspendThread. Адрес этой функции бери в SDT.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Или дергать INT 2E...
     
  10. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    Это я понимаю, я же написал еще в первом своем посте. КАК мне их перебрать, какой функцией? Извините, если туплю.
     
  11. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    ThreadListHead в EPROCESS - голова двусвязного списка, который содержит в себе записи (ETHREAD) всех потоков указанного процесса.
     
  12. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    я бы посоветовал заюзать дебуг-апи
    из юзер-мода понятно как
    из кернела вроде тоже наверное можно, потрахавшись с лпц-портами
    зато! сразу все потоки фризятся по свистку, это вам не перебор списка, а вдруг в этот момент как раз CreateThread()
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    И все-таки не думаю что секс с ЛПЦ-портами лучше перебора.
    И что? Во-первых вероятность катастрофически мала. Во-вторых: мы же просто читаем, бсода однозначно не будет. Можно на крайняк перебрать потоки первый раз, попутно их замораживая, а потом перебрать второй раз, для "самоуспокоения"...
     
  14. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Код (Text):
    1. NTSTATUS NtSuspendThreadById(HANDLE nThreadId){
    2.     NTSTATUS rc;
    3.     HANDLE hThread;
    4.     ULONG nCount;
    5.     CLIENT_ID cid = {
    6.         (HANDLE)0,
    7.         (HANDLE)nThreadId
    8.     };
    9.  
    10.     OBJECT_ATTRIBUTES attr = {
    11.         sizeof (OBJECT_ATTRIBUTES),
    12.             0,
    13.             NULL,
    14.             0,
    15.             NULL,
    16.             NULL
    17.     };
    18.    
    19.     rc = ZwOpenThread(&hThread,THREAD_ALL_ACCESS,&attr,&cid);
    20.     if (!NT_SUCCESS(rc)){
    21.         return rc;
    22.     }
    23.    
    24.     //rc = NtSuspendThread(hThread,&nCount);
    25.     // докончить тут
    26.     return rc;
    27. }
    28.  
    29. NTSTATUS NtStopAllThreadsByProcessName(PCWSTR ProcessName){
    30.     NTSTATUS rc = STATUS_SUCCESS;
    31.     HANDLE hProcess;
    32.     PVOID pSystemInfo;
    33.     PSYSTEM_PROCESSES_INFORMATION pSysProcesses;
    34.     PSYSTEM_THREADS_INFORMATION pSysThreads;
    35.     ULONG nSysInfoLength = 0x5f50;
    36.     UNICODE_STRING usProcess;
    37.     ULONG i;
    38.  
    39.     RtlInitUnicodeString(&usProcess,ProcessName);
    40.    
    41.     pSystemInfo = ExAllocatePool(NonPagedPool,nSysInfoLength);
    42.     rc = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pSystemInfo,nSysInfoLength,&nSysInfoLength);
    43.  
    44.     while(rc==STATUS_INFO_LENGTH_MISMATCH){
    45.         ExFreePool(pSystemInfo);
    46.         nSysInfoLength = nSysInfoLength*2;
    47.         pSystemInfo = ExAllocatePool(NonPagedPool,nSysInfoLength);
    48.         rc = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pSystemInfo,nSysInfoLength,&nSysInfoLength);
    49.     }
    50.    
    51.     pSysProcesses = pSystemInfo;
    52.     while(pSysProcesses){
    53.          if(RtlCompareUnicodeString(&pSysProcesses->ProcessName,&usProcess,TRUE) == 0){
    54.             pSysThreads = (PSYSTEM_THREADS_INFORMATION)pSysProcesses->Threads;
    55.             break;
    56.         }
    57.         if (pSysProcesses->NextEntryDelta){
    58.             (char *)pSysProcesses += pSysProcesses->NextEntryDelta;
    59.         }   else    {
    60.             pSysProcesses = NULL;
    61.         }
    62.     }
    63.    
    64.     DbgPrint("Threads of process[%d] is [%d]",pSysProcesses->ProcessId,pSysProcesses->ThreadCount);
    65.     __asm int 3;
    66.  
    67.     for( i = 0;i < pSysProcesses->ThreadCount ; i++ ){
    68.         rc = NtSuspendThreadById((HANDLE)pSysThreads[i].ClientId.UniqueThread);
    69.         if (NT_SUCCESS(rc)){
    70.             DbgPrint("Thread suspended %d\n",pSysThreads[i].ClientId.UniqueThread);
    71.         }   else    {
    72.             DbgPrint("Cant suspend thread %d\n",pSysThreads[i].ClientId.UniqueThread);
    73.         }
    74.     }
    75.  
    76.     return rc;
    77. }
     
  15. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    поискать сорцы мс-рема. там всё есть.
     
  16. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    сорцы какого драйвера?
     
  17. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    DoZENT

    На сайте посмотри приложения к его статьям, там есть то что тебе нужно. Да и написать это не сложно. Проще написать чем столько времени ждать ответа на вопрос
     
  18. DoZENT

    DoZENT New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    50
    Спасибо, посмотрю. Просто пока я жду ответа на этот вопрос, я пишу другие вещи.