1

Initializing Wintrust_File_Info

let mut wt_file_info = WINTRUST_FILE_INFO{
    cbStruct          : std::mem::size_of::<WINTRUST_FILE_INFO>() as DWORD,
    pcwszFilePath     : file_path_wide.as_ptr(),//.as_ptr() as *const u16,
    hFile             : ptr::null_mut(),
    pgKnownSubject    : ptr::null_mut(),
};

Initializing WinTrust_Data

wt_data.cbStruct              = std::mem::size_of::<WINTRUST_DATA>() as DWORD;
wt_data.dwUIChoice            = WTD_UI_NONE;
wt_data.hWVTStateData         = ptr::null_mut();
wt_data.pwszURLReference      = ptr::null_mut();
wt_data.fdwRevocationChecks   = WTD_REVOKE_NONE;
wt_data.pPolicyCallbackData   = ptr::null_mut();
wt_data.pSIPClientData        = ptr::null_mut();
wt_data.dwUnionChoice         = WTD_CHOICE_FILE;
wt_data.dwStateAction         = 1;  

WINTRUST_DATA has one member u which takes WINTRUST_DATA_u as input

STRUCT!{struct WINTRUST_DATA {
    cbStruct: DWORD,
    pPolicyCallbackData: LPVOID,
    pSIPClientData: LPVOID,
    dwUIChoice: DWORD,
    fdwRevocationChecks: DWORD,
    dwUnionChoice: DWORD,
    u: WINTRUST_DATA_u,
    dwStateAction: DWORD,
    hWVTStateData: HANDLE,
    pwszURLReference: *mut WCHAR,
    dwProvFlags: DWORD,
    dwUIContext: DWORD,
    pSignatureSettings: *mut WINTRUST_SIGNATURE_SETTINGS,
}}

UNION!{union WINTRUST_DATA_u {
    [usize; 1],
    pFile pFile_mut: *mut WINTRUST_FILE_INFO,
}}

How do we initialize pFile in WINTRUST_DATA_u with WINTRUST_FILE_INFO and then initialize wt_data.u

Chayim Friedman
  • 47,971
  • 5
  • 48
  • 77
Amit
  • 13
  • 4
  • Unless you have a specific reason to use the [winapi](https://crates.io/crates/winapi) crate, you should prefer [windows](https://crates.io/crates/windows) or [windows-sys](https://crates.io/crates/windows-sys). The latter are actively being developed. – IInspectable Mar 13 '23 at 08:43

1 Answers1

0

Try setting the member u: WINTRUST_DATA_u of the WINTRUST_DATA as follows:

unsafe{
    *(wt_data.u.pFile_mut()) = &mut wt_file_info;
}

Here's the full code:

let mut wt_file_info = WINTRUST_FILE_INFO{
    cbStruct          : std::mem::size_of::<WINTRUST_FILE_INFO>() as DWORD,
    pcwszFilePath     : file_path_wide.as_ptr(),//.as_ptr() as *const u16,
    hFile             : ptr::null_mut(),
    pgKnownSubject    : ptr::null_mut(),
};


let  mut wt_data : WINTRUST_DATA = unsafe{mem::zeroed()};

wt_data.cbStruct              = std::mem::size_of::<WINTRUST_DATA>() as DWORD;
wt_data.dwUIChoice            = WTD_UI_NONE;
wt_data.hWVTStateData         = ptr::null_mut();
wt_data.pwszURLReference      = ptr::null_mut();
wt_data.fdwRevocationChecks   = WTD_REVOKE_NONE;
wt_data.pPolicyCallbackData   = ptr::null_mut();
wt_data.pSIPClientData        = ptr::null_mut();
wt_data.dwUnionChoice         = WTD_CHOICE_FILE;
wt_data.dwStateAction         = 1;  

unsafe{
    *(wt_data.u.pFile_mut()) = &mut wt_file_info;
}

let pg_action_id = WINTRUST_ACTION_GENERIC_VERIFY_V2;

let status = unsafe{ 
    WinVerifyTust(
        std::ptr::null_mut(),
        &mut pg_action_id,
        &mut wt_data as *mut _ as _,
    )
};