Привет всем! Такая проблема: пишу драйвер с перехватом функции NtDebugActiveProcess. Есть PID процесса - dwPIDToProtect. Мне нужно проверить, для этого ли процесса вызывается перехватываемая функция. Если для этого, то нужно возвратить STATUS_ACCESS_DENIED. Делаю так: Код (Text): //Функция-обработчик перехвата NTSTATUS NewNtDebugActiveProcess(IN HANDLE Process, IN HANDLE DebugObject) { PPROCESS_BASIC_INFORMATION pbi = (PPROCESS_BASIC_INFORMATION)ExAllocatePool(PagedPool, sizeof(PROCESS_BASIC_INFORMATION)); NTSTATUS ntReturn = NtQueryInformationProcess(Process, ProcessBasicInformation, pbi, sizeof(pbi), NULL); if (ntReturn == STATUS_SUCCESS) { ULONG ProcessId; __try { ProcessId = pbi->UniqueProcessId; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_INVALID_PARAMETER; } if (ProcessId == dwPIDToProtect) { return STATUS_ACCESS_DENIED; } } ExFreePool(pbi); return TrueNtDebugActiveProcess(Process, DebugObject); } Т.е. узнаю по хендлу процесса его PID. Вся проблема в том, что NtQueryInformationProcess здесь возвращает STATUS_ACCESS_VIOLATION. Не пойму из-за чего. Подскажите, пожалуйста, кто знает!
Вместо NtQueryInformationProcess используй ZwQueryInformationProcess и учти, что этот вызов сработает только в случае, если хендл открыт с PROCESS_QUERY_INFORMATION.
Все, проблема решена! Вместо ZwQueryInformationProcess я использовал функцию ULONG GetPidByHandle(HANDLE PHanlde) { NTSTATUS st; PEPROCESS process; ULONG pId; st = ObReferenceObjectByHandle(PHanlde, 0, NULL, UserMode, &process, NULL); if (st == STATUS_SUCCESS) { pId = *(PULONG)(((ULONG)process) + pIdOffset); ObDereferenceObject(process); return pId; } return 0; } Спасибо Ms-Rem'у! И всем, кто отвечал!
Crash А в первоначальном коде у тебя видимо еще путанница с указателем на структуру и самой структурой