< 返回版块

liushui132 发表于 2021-08-23 23:37

Tags:结构体,指针

我是一个rust的新手,我想通过netuseradd函数来给主机添加新的用户,但是却出现了一些问题。我现在需要的是把一个结构体变量 ui:USER_INFO_1 转成 *mut u8,也就是输出这个变量的地址 ,但是总是不成功。其中关键代码如下

unsafe{
    let  username = String::from("Administrtator@123");
    let mut name = str_to_pwstr(&username);
    let ui = USER_INFO_1 {
        usri1_name:name,   //PWSTR结构体
        usri1_password: name,
        usri1_password_age: 0,
        usri1_priv:USER_PRIV_USER,
        usri1_home_dir: PWSTR::NULL ,
        usri1_comment:  PWSTR::NULL,
        usri1_flags: USER_ACCOUNT_FLAGS(UF_NORMAL_ACCOUNT),
        usri1_script_path:  PWSTR::NULL,
    };
    NetUserAdd(PWSTR::NULL,2,ui,ptr::null_mut());    //问题出在这里
};

其中NetuserAdd函数的结构体如下

pub unsafe fn NetUserAdd<'a>(
    servername: impl IntoParam<'a, PWSTR>, 
    level: u32, 
    buf: *mut u8, 
    parm_err: *mut u32
) -> u32

但是他报错提示类型不匹配 `

error[E0308]: mismatched types
  --> src\main.rs:44:34
   |
44 |         NetUserAdd(PWSTR::NULL,2,ui,ptr::null_mut());
   |                                  ^^ expected *-ptr, found struct `USER_INFO_1`
   |
   = note: expected raw pointer `*mut u8`
                   found struct `USER_INFO_1

我尝试用std::mem::transmute来进行转化,但也失败了,不知道哪里出了问题,希望大家能帮忙看下,十分感谢。

评论区

写评论
Aya0wind 2021-08-24 09:46

这两种应该都可以

        let ptr: *mut u8 = std::mem::transmute(&mut value);
        let ptr: *mut u8 = (&mut value) as *mut StructType as *mut u8;

前一种要unsafe,后一种不用。

1 共 1 条评论, 1 页