Отслеживание запуска и останова процессов в Ring0

Тема в разделе "WASM.WIN32", создана пользователем prus, 14 ноя 2007.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Скажите плз, почему тут ругается:
    pvBuffer = ExAllocatePool(...);
    RtlCopyMemory(&pvBuffer[ulOffset], source, len); // тут вот - error C2036: 'PVOID' : unknown size
     
  2. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Разобрался. Простит, что бредни спрашиваю, просто с дравами только вот начал разбираьтся :)
     
  3. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    А не подскажите функции в Ring0 типа GetSystemDirectory в Ring3?
     
  4. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Great
    И еще...
    Как мне событие передать из Ring0 в Ring3, которое я буду в Ring3 ждать?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    В юзермоде создать с уникальным именем "SuperPuperEvent". В драйвере открыть "\BaseNamedObjects\SuperPuperEvent"
    а зачем? для NtCreateFile симлинк \SystemRoot\.. подойдет.
     
  6. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    n0name
    Отлично, спасиб!
    И еще тут столкнулся с траблой: почему-то у меня имя процесса обрезается до 15 символов, наверное где-то тут:
    Код (Text):
    1. #define PROCNAMELEN     257
    2.  
    3. void GetProcessNameOffset()
    4. {
    5.     PEPROCESS curproc;
    6.     int i;
    7.     curproc = PsGetCurrentProcess();
    8.     for( i = 0; i < 3*PAGE_SIZE; i++ )
    9.     {
    10.         if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
    11.         {
    12.             gProcessNameOffset = i;
    13.         }
    14.     }
    15. }
    16.  
    17. NTSTATUS GetProcessNameById(OUT PCHAR ProcessName, IN HANDLE ProcessId)
    18. {
    19.     PEPROCESS       curproc;
    20.     char            *nameptr;
    21.    
    22.     if (!gProcessNameOffset || !ProcessId) return STATUS_INVALID_PARAMETER;
    23.     if (!NT_SUCCESS(PsLookupProcessByProcessId(ProcessId,&curproc)))
    24.         return STATUS_INVALID_PARAMETER;
    25.     nameptr   = (PCHAR) curproc + gProcessNameOffset;
    26.     strncpy( ProcessName, nameptr, PROCNAMELEN );
    27.     ProcessName[PROCNAMELEN] = 0;
    28.     return STATUS_SUCCESS;
    29. }
    Почему так происходит?
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    в eprocess ImageFileName это char[16] больше оно не умещает, вызывай QuerySystemInformation c SystemProcessesAndThreadsInformation а ещё лучше напрямую с пеба читай
     
  8. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    rain
    Спасиб за ответ!
    А можно по подробнее про "...ещё лучше напрямую с пеба читай"?
     
  9. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Ребят, помогите плз... Почему в данной финкции при запуске процесса его имя я могу увидеть, а при уничтожении - пусто? Вот код такой:
    Код (Text):
    1. NTSTATUS GetProcessNameByPID(IN HANDLE ProcessId, OUT PCHAR ProcessName) {
    2.  
    3.     ULONG ulBufferSize = 0x8000;
    4.     LPVOID pBuffer = NULL;
    5.     NTSTATUS Status;
    6.     PSYSTEM_PROCESSES pSystemProcessInfo;
    7.  
    8.     do
    9.     {
    10.         pBuffer = ExAllocatePool (NonPagedPool, ulBufferSize);
    11.         if( pBuffer == NULL ) {
    12.             return STATUS_UNSUCCESSFUL;
    13.         }
    14.        
    15.         Status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
    16.                                           pBuffer, ulBufferSize, NULL);
    17.        
    18.         if( Status == STATUS_INFO_LENGTH_MISMATCH ) {
    19.             ExFreePool(pBuffer);
    20.             ulBufferSize *= 2;
    21.         }
    22.         else if( !NT_SUCCESS(Status) ) {
    23.             ExFreePool(pBuffer);
    24.             return STATUS_UNSUCCESSFUL;
    25.         }
    26.  
    27.     }
    28.     while (Status == STATUS_INFO_LENGTH_MISMATCH);
    29.  
    30.     pSystemProcessInfo = (PSYSTEM_PROCESSES)pBuffer;
    31.  
    32.     for(;;) {
    33.  
    34.         LPWSTR pszProcessName = pSystemProcessInfo->ProcessName.Buffer; // ïðèñâîèòü èìÿ ïðîöåññà íîâîé ïåðåìåííîé
    35.        
    36.         if( pszProcessName == NULL ) {
    37.             DbgPrint("pszProcessName == NULL");
    38.             pszProcessName = L"NULL";
    39.         }
    40.  
    41.         if( pSystemProcessInfo->ProcessId == (ULONG)ProcessId ) {
    42.             wcstombs(ProcessName, pszProcessName, PROCNAMELEN);
    43.             break;
    44.         }
    45.  
    46.         if( pSystemProcessInfo->NextEntryDelta == 0 ) {
    47.             DbgPrint("pSystemProcessInfo->NextEntryDelta == 0");
    48.             break;
    49.         }
    50.  
    51.         pSystemProcessInfo = (PSYSTEM_PROCESSES)(((PUCHAR)pSystemProcessInfo)+pSystemProcessInfo->NextEntryDelta);
    52.  
    53.     }
    54.    
    55.     DbgPrint("Process name: %s", ProcessName);
    56.     ExFreePool(pBuffer);
    57.     return STATUS_SUCCESS;
    58.  
    59. }