use winapi::um::processthreadsapi::OpenProcess;
use winapi::shared::minwindef::{DWORD, FALSE};
use winapi::shared::ntdef::NULL;
use winapi::um::winnt::{HANDLE, PROCESS_ALL_ACCESS};
use winapi::um::errhandlingapi::GetLastError;
pub fn get_process_full_access(process_id: DWORD) -> Result<HANDLE, DWORD> {
unsafe {
let process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_id);
if process == NULL {
Err(GetLastError())
} else {
Ok(process)
}
}
}
我使用 Rust 对 Windows API 的绑定(bind)编写了这个函数,我认为我至少涵盖了 OpenProcess
函数记录的错误案例,但我仍然非常不确定我的代码的实际安全性。
我知道 Rust 做出与防止竞争条件相关的保证,但我真的不知道要寻找什么来确保我的代码做出相同的保证。在这种情况下,我是否也应该让包装函数不安全,或者是否值得防止不安全在我的程序中冒泡?
最佳答案
进程 ID 存在竞争。要避免竞争,您必须验证 pid 是否与预期的进程启动时间匹配(重启管理器为此使用 RM_UNIQUE_PROCESS
)。理想情况下,您应该保留您创建的子进程的句柄,只要有人对该进程有一个打开的句柄,就不能重复使用进程 ID。
如果它不是您的子进程并且您没有句柄,那么您必须先获取系统时间,然后才能找到进程 ID 并调用 get_process_full_access
,然后调用 GetProcessTimes
在进程句柄上并验证创建时间是否早于您在找到进程 ID 并打开进程之前阅读的时间。
关于winapi - 这是使用 Windows API "safe"的 Rust 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48873354/