Привет Всем!
Помогите плз разобраться с проблемой. Тут драйвер пробую написать для отслеживания запуска и завершения процессов (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;
}
В чем может быть причина? Помогите плиз...