winapi - 这是使用 Windows API "safe"的 Rust 代码吗?

标签 winapi rust

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/

相关文章:

windows - RegisterEventSource 方法在 Windows 关闭时返回 'null'

rust - 闭包不能返回引用吗?

rust - 我怎样才能在原始 crate 中使用另一个 crate 中的特征实现?

rust - 包含具有不同要求和冲突的参数的 Clap arg 组

rust - 如果 "cargo build"比直接运行 rustc 慢,我为什么要使用 Cargo?

c++ - 使用 mouse_event 在 C++ 中不加速移动鼠标

Windows 7 操作中心

windows - 是否可以确定哪个键盘发送了按键?

windows - 只为一个进程初始化一次临界区

c++ - 通过 Qt 中的线程调用 Rust 库