问题描述
我正在尝试通过我的驱动程序按名称获取进程 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 (将#修改为@)