непонятки с потоком

Тема в разделе "WASM.NT.KERNEL", создана пользователем k3internal, 26 янв 2007.

  1. k3internal

    k3internal New Member

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

    Ставлю колбек PsSetCreateThreadNotifyRoutine. Внутри колбека вызываю PsLookupProcessThreadByCid. Когда возникает колбэк, естессно формирую CID и передаю функции... Возвращает STATUS_INVALID_CID именно для потока передаваемому в качестве параметра. Подставляешь ему любой другой поток отрабатывает нормально. Я так подозреваю, что новый поток добавляется в таблицу хэндлов только после заврешения данного колбэка. Что вы можете сказать по этому поводу, есть какие варианты получить ETHREAD внутри данного колбека ???

    Код:
    Код (Text):
    1. NTSTATUS lsAddListEntryThread(HANDLE ProcessId,HANDLE ThreadId, PCHAR ProcessName)
    2. {
    3.     PSTHREAD    psthread    = NULL;
    4.     PSTHREAD    pnextthread = NULL;
    5.     PVOID       ethread     = NULL;
    6.     PVOID       eprocess    = NULL;
    7.     CLIENT_ID   cid;
    8.     NTSTATUS    ns;
    9.  
    10. __asm int 3;
    11. __try{ 
    12. if (KeGetCurrentIrql() > APC_LEVEL) {return STATUS_UNSUCCESSFUL;};
    13.  
    14. psthread = pThreadListHead;
    15. while (psthread->NextEntry) {(ULONG)psthread = psthread->NextEntry;};
    16. pnextthread = ExAllocatePool(NonPagedPool,sizeof(STHREAD));
    17.  
    18.                 if (!pnextthread){return STATUS_UNSUCCESSFUL;};
    19.  
    20. pnextthread->NextEntry      = 0;
    21. pnextthread->ProcessId      = ProcessId;
    22. pnextthread->ThreadId       = ThreadId;
    23. pnextthread->ProcessName    = NULL;
    24. pnextthread->ethread        = 0;
    25.  
    26. //if ((ns = (*_PsLookupThreadByThreadId)((PVOID)pnextthread->ThreadId,&ethread)) != STATUS_SUCCESS)
    27. cid.UniqueProcess   = ProcessId;
    28. cid.UniqueThread    = ThreadId;
    29. if ((ns = (*_PsLookupProcessThreadByCid)(&cid,NULL,&ethread)) != STATUS_SUCCESS)
    30. {
    31.     ExFreePool(pnextthread);
    32. return STATUS_UNSUCCESSFUL;
    33. }
    34.  
    35. ObDereferenceObject(ethread);
    36.  
    37. pnextthread->ethread = (ULONG)ethread;
    38. psthread->NextEntry = (ULONG)pnextthread;
    39.  
    40. if (ProcessName){
    41. pnextthread->ProcessName = ExAllocatePool(NonPagedPool,strlen(ProcessName)+1);
    42. if (!pnextthread->ProcessName) {psthread->NextEntry = 0; ExFreePool(pnextthread); return STATUS_UNSUCCESSFUL;}
    43.  
    44. RtlZeroMemory(pnextthread->ProcessName,strlen(ProcessName)+1);
    45. RtlCopyMemory(pnextthread->ProcessName,ProcessName,strlen(ProcessName));
    46. }
    47. }
    48. __except(EXCEPTION_EXECUTE_HANDLER){return STATUS_UNSUCCESSFUL;};
    49.  return STATUS_SUCCESS;
    50. }
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Вроде разобрался. Минус в том, что придётся искать поток по структурам. Других методов не вижу.
     
  3. hTrader

    hTrader Сергей

    Публикаций:
    0
    Регистрация:
    26 дек 2006
    Сообщения:
    150
    Адрес:
    ОПИА
    У меня такие коды приводят к ошибкам ввода-вывода:))))
     
  4. k3internal

    k3internal New Member

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