gpt4 book ai didi

winapi - 如何使用 Rust 和 winapi crate 在 Windows 中创建事件订阅?

转载 作者:行者123 更新时间:2023-11-29 08:26:11 24 4
gpt4 key购买 nike

我正在尝试使用 EvtSubscribe 订阅 Windows 事件来自 the winapi crate ,但我收到了 ERROR_INVALID_PARAMETER

我在 Rust 中找不到示例,但确实找到了 C++ example .

我的生成 ERROR_INVALID_PARAMETER 的代码:

fn main() {
unsafe {
let mut callback: winapi::um::winevt::EVT_SUBSCRIBE_CALLBACK = None;
let mut session = std::ptr::null_mut();
let mut signal_event = std::ptr::null_mut();

let mut bookmark = std::ptr::null_mut();
let mut context = std::ptr::null_mut();
let channel_path = "Security";
let channel_path: winnt::LPWSTR = to_wchar(channel_path);
let query = "Event/System[EventID=4624]";
let query: winnt::LPWSTR = to_wchar(query);

let event_handle = winevt::EvtSubscribe(
session,
signal_event,
channel_path,
query,
bookmark,
context,
callback,
winevt::EvtSubscribeStartAtOldestRecord,
);

//println!("{:?}", &event_handle);
println!("{:?}", &winapi::um::errhandlingapi::GetLastError());
} //unsafe end
}

fn to_vec(str: &str) -> Vec<u16> {
return OsStr::new(str)
.encode_wide()
.chain(Some(0).into_iter())
.collect();
}

fn to_wchar(str: &str) -> *mut u16 {
return to_vec(str).as_mut_ptr();
}

最佳答案

EvtSubscribe 的文档状态:

SignalEvent

[...] This parameter must be NULL if the Callback parameter is not NULL.

Callback

[...] This parameter must be NULL if the SignalEvent parameter is not NULL.

此处未明示的含义是必须提供这些参数中的一个。明确禁止同时传递两者,但两者都不传递是没有意义的,否则您的代码将无法接收事件。

传递这些值之一应该会导致代码开始工作。

在编辑方面,这是一个很好的例子,说明 Rust 枚举本可以更好地为 API 建模。这将清楚地表明这两个选项是相互排斥的,并且需要一个:

enum Subscriber {
EventObject(HANDLE),
Callback(EVT_SUBSCRIBE_CALLBACK),
}

顺便说一句,您对 to_wchar 的实现不正确,可能会导致内存不安全。 to_vec 分配内存,你拿一个指向它的指针,然后释放内存,创建一个悬空指针。错误指针由 unsafe block 内的 C 代码读取——这是需要 unsafe 的部分原因。

您要么需要使用mem::forget,如How to expose a Rust `Vec<T>` to FFI? 所示。 (然后您需要以某种方式防止内存泄漏),或者您需要引用数据而不是获取原始指针。

关于winapi - 如何使用 Rust 和 winapi crate 在 Windows 中创建事件订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com