首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >KERNEL_APC_PENDING_DURING_EXIT BSOD

KERNEL_APC_PENDING_DURING_EXIT BSOD
EN

Stack Overflow用户
提问于 2016-06-27 03:19:04
回答 2查看 307关注 0票数 1

我正在设置一个PLOAD_IMAGE_NOTIFY_ROUTINE以检测特定的图像名称,如果匹配,则终止它。不过,我得到了一份KERNEL_APC_PENDING_DURING_EXIT。BSOD发生在我的KillProcess函数中,它只是用ObOpenObjectByPointer打开一个内核句柄,然后在这个句柄上调用ZwTerminateProcess。

有什么不对的?代码在例程之外运行良好。我必须把它寄出去吗?当我打电话给PLOAD_IMAGE_NOTIFY_ROUTINE时,我在KillProcess中得到了一个BSOD。

下面是我的KillProcess函数:

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-01 10:55:03

问题是,我试图在自己的背景下终止这一进程,这导致了一个BSOD。解决方案:

  1. 创建一个保存pid的全局变量
  2. 设置全局变量
  3. 在系统线程中,检查全局变量是否已更改。
  4. 终止进程
票数 0
EN

Stack Overflow用户

发布于 2016-06-28 01:10:00

PsSetLoadImageNotifyRoutine文档说:

当加载新创建的进程的主可执行映像时,加载图像通知例程将在新进程的上下文中运行。

(在加载DLL时,调用也很可能是在加载DLL的进程的上下文中进行的。)

因此,从它的声音来看,您正在终止正在运行其上下文的进程。更重要的是,在映像加载操作的回调过程中,您会在一个特别脆弱的点执行此操作。这引起麻烦也就不足为奇了。

ZwTerminateProcess文档意味着驱动程序可以终止当前进程,前提是它确保资源已从内核堆栈中释放,但我认为这种情况不适用。(而且,我不知道你会怎么做。)

相反,可以挂起进程,并在稍后从系统线程中终止它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38045401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档