gpt4 book ai didi

winapi - CertOpenSystemsStoreW 或 CertCloseStore 的 Rust FFI 声明有什么问题?

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

我正在尝试从 Rust 调用 Win32 API CertOpenSystemsStoreWCertCloseStore 函数。当我这样做时,我在 CertCloseStore 上遇到访问冲突,所以我想我在某些参数类型上的大小有误,但我看不到它。

以下 Python 代码有效(我有等效的 C++,但包含的不那么好):

In [1]: import ctypes    
In [2]: c32 = ctypes.windll.crypt32
In [3]: c32.CertOpenSystemStoreW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p]
In [4]: c32.CertOpenSystemStoreW.restype = ctypes.c_void_p
In [5]: c32.CertCloseStore.argtypes=[ctypes.c_void_p, ctypes.c_ulong]
In [6]: s = c32.CertOpenSystemStoreW(0, "my")
In [7]: c32.CertCloseStore(s, 0)
Out[7]: 1

这是失败的 Rust:

extern crate libc;
use libc::{c_ulong, c_int, c_void};
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use std::ptr::null;

type HPROVIDER = c_void;
type HCERTSTORE = c_void;
type BOOL = c_int;

#[link(name = "Crypt32")]
extern "stdcall" {
fn CertOpenSystemStoreW(
hProv: *const HPROVIDER, szSubsystemProtocol: *const u16) -> HCERTSTORE;
fn CertCloseStore(
hCertStore: HCERTSTORE, dwFlags: c_ulong) -> BOOL;
}

fn to_utf16(s: &str) -> Vec<u16> {
let os_s = OsStr::new(s);
return os_s.encode_wide().chain(Some(0).into_iter()).collect::<Vec<_>>();
}

fn main() {
let protocol_utf16 = to_utf16("my");
let storehandle;
unsafe {
storehandle = CertOpenSystemStoreW(null(), protocol_utf16.as_ptr());
}

let freeresults;
unsafe {
freeresults = CertCloseStore(storehandle, 0);
}
println!("{}", freeresults);
}

我正在使用 Rust 1.16。

最佳答案

嗯,有两个问题:

  1. DWORD 是 32 位的,无论您使用的是 64 位还是 32 位 Windows(我想这是有道理的)。所以我的 CertCloseStore 的第二个参数是错误的。
  2. c_void 不是指针类型 - 它只是一个 u8。所以我上面的代码应该类似于 type HPROVIDER = *const c_void; (这不是很好,因为它使所有 HPROVIDER 都成为常量,但我没有看到一种方法来做一个 Rust 风格的指针typedef 而无需指定“mut”或“const”)。

关于winapi - CertOpenSystemsStoreW 或 CertCloseStore 的 Rust FFI 声明有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43457189/

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