Не могу определить имя процесса по PID при его закрытии
От: ScorpeeOn  
Дата: 16.11.07 20:27
Оценка:
Привет Всем!
Помогите плз разобраться с проблемой. Тут драйвер пробую написать для отслеживания запуска и завершения процессов (PsSetCreateProcessNotifyRoutine) и хочу получать имена исполняемых модулей. При запуске все хорошо и имя процесса я могу увидеть, но вот при завершении имя процесса не могу получить (пустая строка получается). Вот код функции, в которой получаю имя по PID:

NTSTATUS GetProcessNameByPID(IN HANDLE ProcessId, OUT PCHAR ProcessName) {

    ULONG ulBufferSize = 0x8000;
    LPVOID pBuffer = NULL;
    NTSTATUS Status;
    PSYSTEM_PROCESSES pSystemProcessInfo;
    ULONG tmp;

    do
    {
        pBuffer = ExAllocatePool (NonPagedPool, ulBufferSize);
        if( pBuffer == NULL ) {
            return STATUS_UNSUCCESSFUL;
        }
        
        Status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, 
                                          pBuffer, ulBufferSize, NULL);
        
        if( Status == STATUS_INFO_LENGTH_MISMATCH ) {
            ExFreePool(pBuffer); 
            ulBufferSize *= 2;
        }
        else if( !NT_SUCCESS(Status) ) {
            ExFreePool(pBuffer);
            return STATUS_UNSUCCESSFUL;
        }

    }
    while (Status == STATUS_INFO_LENGTH_MISMATCH);

    pSystemProcessInfo = (PSYSTEM_PROCESSES)pBuffer;

    for(;;) {

        LPWSTR pszProcessName = pSystemProcessInfo->ProcessName.Buffer;
        
        if( pszProcessName == NULL ) {
            pszProcessName = L"Idle";
        }

        if( pSystemProcessInfo->ProcessId == (ULONG)ProcessId ) { 
            tmp = wcstombs(ProcessName, pszProcessName, PROCNAMELEN);
            break;
        }

        if( pSystemProcessInfo->NextEntryDelta == 0 ) {
            break;
        }

        pSystemProcessInfo = (PSYSTEM_PROCESSES)(((PUCHAR)pSystemProcessInfo)+pSystemProcessInfo->NextEntryDelta);

    }
    
    DbgPrint("Process name: %s %lu", ProcessName, tmp); // Вот тут не вижу процесса при его завершении, а tmp равна какому-то большому числу.

    ExFreePool(pBuffer);
    return STATUS_SUCCESS;

}


В чем может быть причина? Помогите плиз...
С уважением,
Евгений
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.