# wil-rs
Windows Implementation Library for Rust
[Documentation](https://docs.rs/wil/)
This crate does _not_ provide raw FFI bindings to Windows API (the winapi crate is what you are looking for).
This crate does demonstrate what a Windows Implementation Library could look like in Rust ("à la" https://github.com/microsoft/wil in C++).
The winapi crate is doing a great job in providing the bindings for Windows APIs.
What winapi does _not_ provide is a safety wrapper arroung those APIs (with error handling, resource management, ...).
This "wil" crate aims to present what could be a safe wrapper for Windows API.
If this crate is massively missing _that_ something you need.
Feel free to create an issue, open a pull request.
## Frequently asked questions ##
## Example ##
Cargo.toml:
```toml
[target.'cfg(windows)'.dependencies]
wil = "0.0.3"
winapi = "0.3.8"
```
main.rs:
```Rust
use wil::token::Token;
use wil::errorhandling::WinAPIError;
use winapi::um::winnt::{TokenImpersonation, TokenPrimary};
use winapi::um::winnt::{TOKEN_DUPLICATE, TOKEN_QUERY, TOKEN_QUERY_SOURCE};
fn main() -> Result<(), WinAPIError> {
let token =
Token::from_current_process(TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE)?;
let token = if token.token_type()? == TokenPrimary {
token.duplicate(TokenImpersonation)?
} else {
token
};
if !token.is_admin()? {
if token.can_elevate()? {
println!("user is not an admin but can elevate to one");
} else {
println!("user is not an admin");
}
}
else {
println!("user is an admin");
}
Ok(())
}
```