From 51ce0217f0a73f3aa55978ddb8767dd897365de0 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Tue, 2 Dec 2025 00:53:29 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A9=20release=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8B=E9=87=8D=E5=90=AF=E4=B8=8D=E4=B8=80=E5=AE=9A=E6=88=90?= =?UTF-8?q?=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands.rs | 32 +++++++++++++++----------------- src-tauri/src/yae/inject.rs | 19 ++++++++----------- src-tauri/src/yae/mod.rs | 4 +++- src/enum/uiaf.ts | 2 +- src/pages/common/PageAchi.vue | 12 ++++++++---- 5 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index fcab8eb3..55285bf9 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -78,7 +78,7 @@ pub fn is_in_admin() -> bool { return Err("This function is only supported on Windows.".into()); } - use windows_sys::Win32::Foundation::HANDLE; + use windows_sys::Win32::Foundation::{CloseHandle, HANDLE}; use windows_sys::Win32::Security::{ AllocateAndInitializeSid, CheckTokenMembership, FreeSid, SID_IDENTIFIER_AUTHORITY, TOKEN_QUERY, }; @@ -136,31 +136,29 @@ pub fn run_with_admin() -> Result<(), String> { use std::ffi::OsStr; use std::iter::once; use std::os::windows::ffi::OsStrExt; - use std::process::exit; + use windows_sys::Win32::Foundation::HWND; use windows_sys::Win32::UI::Shell::ShellExecuteW; use windows_sys::Win32::UI::WindowsAndMessaging::SW_SHOWNORMAL; let exe_path = std::env::current_exe().map_err(|e| e.to_string())?; - let exe_str: Vec = OsStr::new(exe_path.to_string_lossy().as_ref()) - .encode_wide() - .chain(std::iter::once(0)) - .collect(); + let exe_str: Vec = exe_path.as_os_str().encode_wide().chain(once(0)).collect(); let verb: Vec = OsStr::new("runas").encode_wide().chain(once(0)).collect(); - - let result = unsafe { - ShellExecuteW( - std::ptr::null_mut(), + let workdir: Vec = + exe_path.parent().unwrap().as_os_str().encode_wide().chain(once(0)).collect(); + unsafe { + let result = ShellExecuteW( + 0 as HWND, verb.as_ptr(), exe_str.as_ptr(), std::ptr::null(), - std::ptr::null(), + workdir.as_ptr(), SW_SHOWNORMAL, - ) - }; + ); - if result as usize > 32 { - exit(0); - } else { - Err("Failed to restart as administrator.".into()) + if result as usize > 32 { + std::process::exit(0); + } else { + Err("Failed to restart as administrator.".into()) + } } } diff --git a/src-tauri/src/yae/inject.rs b/src-tauri/src/yae/inject.rs index 94a5351a..6adb9530 100644 --- a/src-tauri/src/yae/inject.rs +++ b/src-tauri/src/yae/inject.rs @@ -1,11 +1,11 @@ //! DLL 注入相关功能 //! @since Beta v0.9.0 -use std::ffi::{c_void, OsStr}; +use std::ffi::OsStr; use std::iter::once; use std::os::windows::ffi::OsStrExt; use std::ptr; -use windows_sys::Win32::Foundation::{CloseHandle, HANDLE, INVALID_HANDLE_VALUE}; +use windows_sys::Win32::Foundation::{CloseHandle, FreeLibrary, HANDLE, INVALID_HANDLE_VALUE}; use windows_sys::Win32::Storage::FileSystem::PIPE_ACCESS_DUPLEX; use windows_sys::Win32::System::Diagnostics::Debug::WriteProcessMemory; use windows_sys::Win32::System::Diagnostics::ToolHelp::{ @@ -101,12 +101,12 @@ pub fn inject_dll(pi: &PROCESS_INFORMATION, dll_path: &str) { } let k32 = GetModuleHandleA(b"kernel32.dll\0".as_ptr()); - if k32 == 0 { + if k32 == std::ptr::null_mut() { panic!("GetModuleHandleA failed"); } let loadlib = GetProcAddress(k32, b"LoadLibraryW\0".as_ptr()); - if loadlib.is_null() { + if loadlib.is_none() { panic!("GetProcAddress failed"); } @@ -162,17 +162,14 @@ pub fn call_yaemain(pi: &PROCESS_INFORMATION, base: usize, dll_path: &str) { unsafe { let local = LoadLibraryExW(dll_path_wide.as_ptr(), std::ptr::null_mut(), DONT_RESOLVE_DLL_REFERENCES); - if local == 0 { + if local == std::ptr::null_mut() { panic!("LoadLibraryExW failed"); } - let proc = GetProcAddress(local, b"YaeMain\0".as_ptr()); - if proc.is_null() { - FreeLibrary(local); - panic!("无法找到 YaeMain"); - } + let proc = GetProcAddress(local, b"YaeMain\0".as_ptr()).expect("无法找到 YaeMain"); - let proc_addr = proc as usize; + // Option isize> + let proc_addr = proc as *const () as usize; let rva = proc_addr - local as usize; println!("YaeMain RVA: {:#x}", rva); diff --git a/src-tauri/src/yae/mod.rs b/src-tauri/src/yae/mod.rs index 2383a56f..59b25b85 100644 --- a/src-tauri/src/yae/mod.rs +++ b/src-tauri/src/yae/mod.rs @@ -12,6 +12,7 @@ use std::io::{self, Read, Write}; use std::os::windows::io::{FromRawHandle, RawHandle}; use std::sync::Arc; use tauri::{AppHandle, Emitter, Manager}; +use windows_sys::Win32::Foundation::CloseHandle; use windows_sys::Win32::System::Pipes::ConnectNamedPipe; // 读取配置值 @@ -63,7 +64,7 @@ fn read_exact_vec(r: &mut R, len: usize) -> io::Result> { /// 调用 dll #[tauri::command] -pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> () { +pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> Result<(), String> { #[cfg(not(target_os = "windows"))] { return Err("This function is only supported on Windows.".into()); @@ -203,4 +204,5 @@ pub fn call_yae_dll(app_handle: AppHandle, game_path: String) -> () { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } + Ok(()) } diff --git a/src/enum/uiaf.ts b/src/enum/uiaf.ts index cbeaa599..8a4a20c6 100644 --- a/src/enum/uiaf.ts +++ b/src/enum/uiaf.ts @@ -1,5 +1,5 @@ /** - * Yae 插件相关枚举类型 + * UIAF 相关枚举类型 * @since Beta v0.7.8 */ diff --git a/src/pages/common/PageAchi.vue b/src/pages/common/PageAchi.vue index b3684f69..4661ecda 100644 --- a/src/pages/common/PageAchi.vue +++ b/src/pages/common/PageAchi.vue @@ -322,7 +322,8 @@ async function toYae(): Promise { try { isAdmin = await invoke("is_in_admin"); } catch (err) { - showSnackbar.error("检测管理员权限失败:" + (err?.message || err)); + showSnackbar.error(`检测管理员权限失败:${err}`); + await TGLogger.Error(`[pageAchi][toYae]检测管理员权限失败:${err}`); return; } if (!isAdmin) { @@ -332,16 +333,19 @@ async function toYae(): Promise { return; } try { - await invoke("run_with_admin"); + const res = await invoke("run_with_admin"); + await TGLogger.Warn(`${res}`); } catch (err) { - showSnackbar.error("以管理员模式重启失败:" + (err?.message || err)); + showSnackbar.error(`以管理员模式重启失败:${err}`); + await TGLogger.Error(`[pageAchi][toYae]以管理员模式启动失败 - ${err}`); return; } } try { await invoke("call_yae_dll", { gamePath: gamePath }); } catch (err) { - showSnackbar.error("调用Yae DLL失败:" + (err?.message || err)); + showSnackbar.error(`调用Yae DLL失败: ${err}`); + await TGLogger.Error(`[pageAchi][toYae]调用Yae DLL失败: ${err}`); return; } }