特定のイメージ名を検出するようにPLOAD_IMAGE_NOTIFY_ROUTINEを設定しています。一致するものがあれば、終了します。私はKERNEL_APC_PENDING_DURING_EXIT BSODを取得しています。 BSOは、ObOpenObjectByPointerでカーネルハンドルを開き、そのハンドルでZwTerminateProcessを呼び出すだけで、私のKillProcess関数のどこかで起きています。KERNEL_APC_PENDING_DURING_EXIT BSOD
何が間違っている可能性がありますか?コードはルーチン外で正常に動作します。投稿する必要がありますか? KillProcessを呼び出すと、PLOD_IMAGE_NOTIFY_ROUTINEにBSODが表示されます。ここで
は私のKillProcess機能である:
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;
}
を終了さを変更したかどうかを確認、システムスレッドでは、グローバル変数
さて、あなたが正しいと私はそれを投稿しました。 – user1304765