首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PsSuspendProcess阻塞/等待/卡住- Windows内核编程

PsSuspendProcess阻塞/等待/卡住- Windows内核编程
EN

Stack Overflow用户
提问于 2020-05-25 07:04:20
回答 1查看 508关注 0票数 1

在Windows内核中,我带着一个非常低层次的问题来到这里。我在一个微型车司机的回调功能。驱动程序的目标是暂停任何试图打开我标记为受保护的文件的进程。我使用的是从这个函数中获得的PsSuspendProcess:

代码语言:javascript
复制
(pPsSuspendProcess)ReturnSystemRoutineAddress(L"PsSuspendProcess");

但是当我用上面的代码调用它时,我的程序会被挂起调用。在任务管理器上,进程被很好地挂起,但驱动程序从未结束此函数。

只有当我手动取消进程暂停或从taskmgr中终止它时,它才会继续。

我完全被屏蔽了,因为PsSuspendProcess是一个无文档的函数.

这里我的代码:

代码语言:javascript
复制
FLT_PREOP_CALLBACK_STATUS
DfPreCreateCallback(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Outptr_result_maybenull_ PVOID* CompletionContext
    )
{
    PAGED_CODE();
    NTSTATUS status;
    ULONG options = Data->Iopb->Parameters.Create.Options;
    UCHAR disposition = (options >> 24) & 0xff;
    ULONG createOptions = (options << 8) >> 8;

    if ((createOptions & FILE_NON_DIRECTORY_FILE) && (disposition == FILE_OPEN || disposition == FILE_OPEN_IF
        || disposition == FILE_OVERWRITE || disposition == FILE_OVERWRITE_IF))
    {
        HANDLE processId = (HANDLE)FltGetRequestorProcessId(Data);
        PEPROCESS p = FltGetRequestorProcess(Data);
        if (p == NULL)
            goto callback_end;
        LPSTR processName = PsGetProcessImageFileName(p);
        if (processName == NULL)
            goto callback_end;
        for (int i = 0; i < (sizeof(ExcludedProcess) / sizeof(LPCWSTR)); i++)
        {
            if (strcmp(processName, ExcludedProcess[i]) == 0)
                goto callback_end;
        }

        PFLT_FILE_NAME_INFORMATION FileInfo;
        status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, &FileInfo);
        if (NT_ERROR(status))
            goto callback_end;
        if (!IsProtected(&FileInfo->Name))
            goto callback_end;
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "DBG PROTECTED %wZ", FileInfo->Name);

        PsSuspendProcess(p);

        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "DBG SUSPENDED")
    }
    callback_end:
    CompletionContext = NULL;
    return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 08:03:42

你实际上打电话来了

代码语言:javascript
复制
PsSuspendProcess(FltGetRequestorProcess(Data));

但是对于文件操作,预回调几乎总是在请求给定I/O操作的线程上下文中调用。所以几乎总是

代码语言:javascript
复制
FltGetRequestorProcess(Data) == IoGetCurrentProcess();

因此,您可以挂起当前进程和当前线程。因此下一行

代码语言:javascript
复制
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "DBG SUSPENDED");

当然,在线程未恢复之前,将不会执行。

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

https://stackoverflow.com/questions/61997360

复制
相关文章

相似问题

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