From 7ab400507e82c25805241f3dbccf76dc3583cc3c Mon Sep 17 00:00:00 2001 From: amizing25 Date: Fri, 22 Aug 2025 06:08:34 +0700 Subject: [PATCH] feat(launcher): warn if the launcher is not run as admin --- launcher/src/main.rs | 48 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/launcher/src/main.rs b/launcher/src/main.rs index 23828e0..2e0dccd 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -4,16 +4,17 @@ use std::ffi::CString; use std::ptr::null_mut; use windows::Win32::Foundation::{CloseHandle, GetLastError, HANDLE}; +use windows::Win32::Security::{GetTokenInformation, TOKEN_ELEVATION, TOKEN_QUERY, TokenElevation}; use windows::Win32::System::Diagnostics::Debug::WriteProcessMemory; use windows::Win32::System::LibraryLoader::{GetModuleHandleA, GetProcAddress}; use windows::Win32::System::Memory::{ MEM_COMMIT, MEM_RELEASE, MEM_RESERVE, PAGE_READWRITE, VirtualAllocEx, VirtualFreeEx, }; use windows::Win32::System::Threading::{ - CREATE_SUSPENDED, CreateProcessA, CreateRemoteThread, PROCESS_INFORMATION, ResumeThread, - STARTUPINFOA, WaitForSingleObject, + CREATE_SUSPENDED, CreateProcessA, CreateRemoteThread, OpenProcessToken, PROCESS_INFORMATION, + ResumeThread, STARTUPINFOA, WaitForSingleObject, }; -use windows::core::{PSTR, s}; +use windows::core::{Error, PSTR, s}; fn inject_standard(h_target: HANDLE, dll_path: &str) -> bool { unsafe { @@ -70,7 +71,48 @@ fn inject_standard(h_target: HANDLE, dll_path: &str) -> bool { } } +fn is_running_as_admin() -> Result { + unsafe { + let mut token_handle = HANDLE::default(); + let current_process = windows::Win32::System::Threading::GetCurrentProcess(); + + if OpenProcessToken(current_process, TOKEN_QUERY, &mut token_handle).is_err() { + return Err(windows::core::Error::from_win32()); + } + + let mut elevation = TOKEN_ELEVATION::default(); + let mut size = std::mem::size_of::() as u32; + + let success = GetTokenInformation( + token_handle, + TokenElevation, + Some(&mut elevation as *mut _ as *mut _), + size, + &mut size, + ); + + let _ = CloseHandle(token_handle); + + if success.is_ok() { + Ok(elevation.TokenIsElevated != 0) + } else { + Err(windows::core::Error::from_win32()) + } + } +} + +fn wait_exit() { + println!("Press any key to exit..."); + let mut input = String::new(); + std::io::stdin().read_line(&mut input).unwrap(); +} + fn main() { + if !is_running_as_admin().unwrap_or_default() { + println!("launcher need to be launched as admin"); + wait_exit(); + } + let current_dir = std::env::current_dir().unwrap(); let dll_path = current_dir.join("hkrpg.dll"); if !dll_path.is_file() {