GetInterfaceInfo我正在嘗試通過使用 Microsoft 的windows crate獲取有關系統上可用網路介面的資訊。這需要我做一些不安全的操作,我讓它為一個介面作業,但不是兩個:
#[cfg(test)]
mod tests {
use super::*;
use windows::{
core::*, Data::Xml::Dom::*, Win32::Foundation::*, Win32::NetworkManagement::IpHelper::*,
Win32::System::Threading::*, Win32::UI::WindowsAndMessaging::*,
};
#[test]
fn main() {
unsafe {
let mut dw_out_buf_len: u32 = 0;
let mut dw_ret_val =
GetInterfaceInfo(std::ptr::null_mut(), &mut dw_out_buf_len as *mut u32);
if dw_ret_val != ERROR_INSUFFICIENT_BUFFER.0 {
panic!();
}
println!("Size: {}", dw_out_buf_len);
// allocate that amount of memory, which will be used as a buffer
let mut ip_interface_info = Vec::with_capacity(dw_out_buf_len as usize);
let mut ptr = ip_interface_info.as_mut_ptr() as *mut IP_INTERFACE_INFO;
dw_ret_val = GetInterfaceInfo(ptr, &mut dw_out_buf_len as *mut u32);
println!("Num adapters: {}", (*ptr).NumAdapters);
for i in 0..(*ptr).NumAdapters as usize {
println!(
"\tAdapter index: {}\n\tAdapter name: {}",
(*ptr).Adapter[i].Index,
String::from_utf16(&(*ptr).Adapter[i].Name).unwrap()
);
}
}
}
}
當我嘗試訪問第二個條目時它崩潰(即使應該有兩個可用):
panicked at 'index out of bounds: the len is 1 but the index is 1'
包含所有資料的結構IP_INTERFACE_INFO有一個名為的欄位,該欄位Adapter似乎僅限于陣列大小為 1。我讀對了嗎?那么它應該如何容納多個配接器?
#[repr(C)]
#[doc = "*Required features: `\"Win32_NetworkManagement_IpHelper\"`*"]
pub struct IP_INTERFACE_INFO {
pub NumAdapters: i32,
pub Adapter: [IP_ADAPTER_INDEX_MAP; 1],
}
uj5u.com熱心網友回復:
似乎IP_INTERFACE_INFO使用了 C靈活的陣列成員,它經常使用[1]語法。使用 GetInterfaceInfo 管理介面中的 C 示例證實了這種用法:
for (i = 0; i < (unsigned int) pInterfaceInfo->NumAdapters; i ) {
printf(" Adapter Index[%d]: %ld\n", i,
pInterfaceInfo->Adapter[i].Index);
printf(" Adapter Name[%d]: %ws\n\n", i,
pInterfaceInfo->Adapter[i].Name);
}
Rust 中的等價物是獲取單元素陣列,獲取指向它的原始指標,然后對其進行迭代(未經測驗,因為我目前不在 Windows 附近):
for i in 0..(*ptr).NumAdapters as usize {
let adapter = (*ptr).Adapter.as_ptr().add(i);
}
我什至可以使用一種工具,比如slice::from_raw_parts將原始指標和運行時長度轉換為一個不錯的 Rust 切片。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506905.html
