C++ 获取进程 ID BSOD 内核驱动程序

问题描述

我正在尝试通过我的驱动程序按名称获取进程 ID。 驱动程序由两部分组成,驱动程序本身和与驱动程序交互以执行其代码用户模式组件。 我已经调试并找到了导致我遇到的 BSOD 的部分,它是获取进程 ID 的部分。这是在与驱动程序通信的用户模式可执行组件中执行的。

以下是导致蓝屏死机的代码片段,我知道这不是 Visual Studio 中的设置或任何类似的设置。 我在 BSOD 上收到的 Windows 错误是“非分页区域中的页面错误”,表明是我的驱动程序出现故障。 (kernelmode.sys 失败)

在创建我的驱动程序的服务然后运行用户模式组件后,我在驱动程序和用户模式组件之间成功通信,并且“查找进程”被打印到控制台,但是在睡眠10秒后我得到立即蓝屏,无论目标进程是否打开。

用户模式执行:

void example::run()
{
    driver_control driver("\\\\.\\kernelmode");

    AllocConsole();

    const char process_name[] = "notepad.exe";

    printf("[Driver]: Looking for %s process...\n",process_name); //This is printed to console
    Sleep(10000);
    
    ULONG process_id = driver.get_process_id_by_name(process_name,sizeof(process_name)); //BSOD here
    if (process_id)
    {
        printf("[Driver]: Process identifier found: %d\n",process_id);
        Sleep(10000);
        //other commented out code here not necessary as its not being excuted
    }

从下面的用户模式驱动程序控制

ULONG driver_control::get_process_id_by_name(const char* process_name,size_t process_name_size)
{
    if (this->driver_handle)
    {
        ULONG bytes;
        NF_PROCESS_ID_REQUEST process_id_request = { 0 };
        memcpy(process_id_request.process_name,process_name,process_name_size);
        if (DeviceIoControl(driver_handle,NF_GET_PROCESS_ID,&process_id_request,sizeof(process_id_request),&bytes,0))
        {
            return process_id_request.process_id;
        }
        else
        {
            return 0;
        }
    }
    return 0;
}

下面从驱动程序本身执行的代码

ULONG memory::get_process_id_by_name(PEPROCESS start_process,const char* process_name)
{
    PLIST_ENTRY active_process_links;
    PEPROCESS current_process = start_process;

    do
    {
        PKPROCESS kproc = (PKPROCESS)current_process;
        PdisPATCHER_HEADER header = (PdisPATCHER_HEADER)kproc;
        LPSTR current_process_name = (LPSTR)((PUCHAR)current_process + IMAGE_FILE_NAME);

        if (header->SignalState == 0 && strcmp(current_process_name,process_name) == 0)
        {
            return (ULONG)PsGetProcessId(current_process);
        }

        active_process_links = (PLIST_ENTRY)((PUCHAR)current_process + ACTIVE_PROCESS_LINKS_FLINK);
        current_process = (PEPROCESS)(active_process_links->Flink);
        current_process = (PEPROCESS)((PUCHAR)current_process - ACTIVE_PROCESS_LINKS_FLINK);

    } while (start_process != current_process);

    return 0;
}

老实说,我不太确定导致 BSoD 的原因,非常感谢任何帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)