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