Ich setze ein PLOAD_IMAGE_NOTIFY_ROUTINE, um einen bestimmten Image-Namen zu erkennen und wenn es eine Übereinstimmung gibt, dann beende es. Ich bekomme jedoch einen KERNEL_APC_PENDING_DURING_EXIT BSOD. Der BSOD passiert irgendwo in meiner KillProcess-Funktion, die einfach ein Kernel-Handle mit ObOpenObjectByPointer öffnet und dann ZwTerminateProcess für dieses Handle aufruft.KERNEL_APC_PENDING_DURING_EXIT BSOD
Was könnte falsch sein? Der Code funktioniert gut außerhalb der Routine. Muss ich es posten? Ich erhalte einen BSOD in meinem PLOAD_IMAGE_NOTIFY_ROUTINE, wenn ich KillProcess anrufe.
Hier ist meine Killprocess Funktion:
NTSTATUS KillProcess(HANDLE ProcessId)
{
PEPROCESS Process;
HANDLE newProcessHandle = NULL;
NTSTATUS status = PsLookupProcessByProcessId(ProcessId, &Process);
do
{
if (!NT_SUCCESS(status))
{
#ifdef DEBUGPRINT
DbgPrint("Process with id %d does not exist\n", ProcessId);
#endif
break;
}
if (NT_SUCCESS(status = ObOpenObjectByPointer(
Process,
OBJ_KERNEL_HANDLE,
NULL,
PROCESS_TERMINATE,
*PsProcessType,
KernelMode,
&newProcessHandle
)))
{
if (newProcessHandle != NULL)
{
status = ZwTerminateProcess(newProcessHandle, 0);
ZwClose(newProcessHandle);
}
else
{
ObDereferenceObject(Process);
break;
}
if (NT_SUCCESS(status))
{
#ifdef DEBUGPRINT
DbgPrint("Successfully killed process with id %d\n", ProcessId);
#endif
}
else
{
#ifdef DEBUGPRINT
DbgPrint("Failed to kill process with id %d\n", ProcessId);
#endif
}
}
else
{
#ifdef DEBUGPRINT
DbgPrint("Failed to open process with id %d\n", ProcessId);
#endif
}
ObDereferenceObject(Process);
} while (FALSE);
return status;
}
geändert hat Without Code wird es schwierig sein, Fehler zu bestimmen. Aber überprüfen Sie, ob Sie alle Sperren, kritischen Abschnitte usw. in der Routine freigeben. – Rohan
Okay, du hast Recht und ich habe es gepostet. – user1304765