1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use std::ptr;
use std::mem;
use winapi::DWORD;
pub fn to_utf16<'a>(s: &'a str) -> Vec<u16> {
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
OsStr::new(s)
.encode_wide()
.chain(Some(0u16).into_iter())
.collect()
}
pub unsafe fn get_system_error() -> (DWORD, String) {
use kernel32::{GetLastError, FormatMessageW};
use winapi::{FORMAT_MESSAGE_FROM_SYSTEM, MAKELANGID, LANG_NEUTRAL, SUBLANG_DEFAULT};
use std::ffi::OsString;
use std::os::windows::ffi::OsStringExt;
let code = GetLastError();
let lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) as DWORD;
let mut buf: Vec<u16> = Vec::with_capacity(1024);
buf.set_len(1024);
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, ptr::null(), code, lang, buf.as_mut_ptr(), 1024, ptr::null_mut());
let end = buf.iter().position(|&i| i==0).unwrap_or(1024);
let error_message = OsString::from_wide(&buf[..end])
.into_string()
.unwrap_or("Error while decoding system error message".to_string());
(code, error_message)
}
pub unsafe fn enable_visual_styles() {
use kernel32::{ActivateActCtx, CreateActCtxW, GetSystemDirectoryW};
use winapi::{MAX_PATH, ULONG, ACTCTXW, ULONG_PTR};
use low::defs::{ACTCTX_FLAG_RESOURCE_NAME_VALID, ACTCTX_FLAG_SET_PROCESS_DEFAULT, ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID};
let mut sys_dir: Vec<u16> = Vec::with_capacity(MAX_PATH);
sys_dir.set_len(MAX_PATH);
GetSystemDirectoryW(sys_dir.as_mut_ptr(), MAX_PATH as u32);
let mut source = to_utf16("shell32.dll");
let mut activation_cookie: ULONG_PTR = 0;
let mut act_ctx = ACTCTXW {
cbSize: mem::size_of::<ACTCTXW> as ULONG,
dwFlags: ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_SET_PROCESS_DEFAULT | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID,
lpSource: source.as_mut_ptr(),
wProcessorArchitecture: 0,
wLangId: 0,
lpAssemblyDirectory: sys_dir.as_mut_ptr(),
lpResourceName: mem::transmute(124usize),
lpApplicationName: ptr::null_mut(),
hModule: ptr::null_mut()
};
let handle = CreateActCtxW(&mut act_ctx);
ActivateActCtx(handle, &mut activation_cookie);
}