Search code examples
winapiruststructunionwinverifytrust

I am trying to implement WinVerifyTrust in rust but facing issue in initializing WinTrustData structure members


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


Solution

  • 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 _,
        )
    };