Skip to content

Instantly share code, notes, and snippets.

@mattmccarty
Created December 9, 2017 05:23
Show Gist options
  • Save mattmccarty/61a48549326e648362e0933f384038cb to your computer and use it in GitHub Desktop.
Save mattmccarty/61a48549326e648362e0933f384038cb to your computer and use it in GitHub Desktop.
extern crate kernel32;
extern crate winapi;
use std;
use self::winapi::{STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE, CONSOLE_SCREEN_BUFFER_INFO, HANDLE, HMODULE, LOBYTE, LOWORD, WORD, DWORD, WCHAR, FARPROC, NTSTATUS };
use self::winapi::winnt::OSVERSIONINFOW;
use self::kernel32::{GetStdHandle,GetConsoleMode,SetConsoleTextAttribute,GetVersion,GetVersionExW,GetModuleHandleW,GetProcAddress};
use std::os::windows::ffi::OsStrExt;
use std::ffi::OsStr;
use std::ffi::CString;
fn win32_get_version() {
unsafe {
let mut osvi: OSVERSIONINFOW = { std::mem::zeroed() };
osvi.dwOSVersionInfoSize = std::mem::size_of::<OSVERSIONINFOW>() as DWORD;
let mut module: Vec<u16> = "ntdll.dll".encode_utf16().collect();
let symbol : CString = CString::new("RtlGetVersion").unwrap();
let h_mod : HMODULE = kernel32::GetModuleHandleW(module.as_ptr());
let h_addr : extern "C" fn(lpVersionInformation: &mut OSVERSIONINFOW)
= std::mem::transmute(kernel32::GetProcAddress(h_mod, symbol.as_ptr()));
(h_addr)(&mut osvi);
println!("{}.{}.{}", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment