From 33cd8ea86b0e45b01809f9063b2de68dd093a168 Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Wed, 8 Apr 2026 13:16:45 -0400 Subject: [PATCH] tool/goexe: refactor to use windows_sys Updates #19255 Signed-off-by: Nathan Perry Change-Id: Idf69f23b5a61417d5fa3638a276d64856a6a6964 --- tool/go.exe | Bin 18944 -> 19456 bytes tool/goexe/.cargo/config.toml | 3 + tool/goexe/Cargo.lock | 18 +++ tool/goexe/Cargo.toml | 13 ++ tool/goexe/src/main.rs | 294 ++++++---------------------------- 5 files changed, 79 insertions(+), 249 deletions(-) diff --git a/tool/go.exe b/tool/go.exe index 39e90fb9a1d5ccd3422bc58ed671dec77b7279e5..f295d6ac8b4361771ac0d0532e713183c8cc32d2 100755 GIT binary patch literal 19456 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 O%R5;7 u32; - - /// Opens or creates a file, returning a HANDLE. - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew - fn CreateFileW( - name: *const u16, - access: u32, - share: u32, - security: usize, - disposition: u32, - flags: u32, - template: usize, - ) -> isize; - - /// Reads bytes from a file handle. - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile - fn ReadFile( - file: isize, - buffer: *mut u8, - to_read: u32, - read: *mut u32, - overlapped: usize, - ) -> i32; - - /// Closes a kernel object handle. - /// https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle - fn CloseHandle(handle: isize) -> i32; - - /// Returns file attributes, or INVALID_FILE_ATTRIBUTES if not found. - /// Used here as a lightweight file-existence check. - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfileattributesw - fn GetFileAttributesW(name: *const u16) -> u32; - - /// Retrieves the value of an environment variable. - /// https://learn.microsoft.com/en-us/windows/win32/api/processenv/nf-processenv-getenvironmentvariablew - fn GetEnvironmentVariableW(name: *const u16, buffer: *mut u16, size: u32) -> u32; - - /// Sets or deletes an environment variable (pass null value to delete). - /// https://learn.microsoft.com/en-us/windows/win32/api/processenv/nf-processenv-setenvironmentvariablew - fn SetEnvironmentVariableW(name: *const u16, value: *const u16) -> i32; - - /// Creates a new process and its primary thread. - /// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw - fn CreateProcessW( - app: *const u16, - cmd: *mut u16, - proc_attr: usize, - thread_attr: usize, - inherit: i32, - flags: u32, - env: usize, - dir: usize, - startup: *const StartupInfoW, - info: *mut ProcessInformation, - ) -> i32; - - /// Waits until a handle is signaled (process exits) or timeout elapses. - /// https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject - fn WaitForSingleObject(handle: isize, ms: u32) -> u32; - - /// Retrieves the exit code of a process. - /// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getexitcodeprocess - fn GetExitCodeProcess(process: isize, code: *mut u32) -> i32; - - /// Terminates the calling process with the given exit code. - /// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-exitprocess - fn ExitProcess(code: u32) -> !; - - /// Returns a handle to stdin, stdout, or stderr. - /// https://learn.microsoft.com/en-us/windows/console/getstdhandle - fn GetStdHandle(id: u32) -> isize; - - /// Returns a pointer to the command-line string for the current process. - /// https://learn.microsoft.com/en-us/windows/win32/api/processenv/nf-processenv-getcommandlinew - fn GetCommandLineW() -> *const u16; - - /// Writes bytes to a file handle (used here for stderr output). - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile - fn WriteFile( - file: isize, - buffer: *const u8, - to_write: u32, - written: *mut u32, - overlapped: usize, - ) -> i32; - - /// Creates a directory. - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createdirectoryw - fn CreateDirectoryW(path: *const u16, security: usize) -> i32; - - /// Deletes a file. - /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilew - fn DeleteFileW(path: *const u16) -> i32; - - /// Returns system info including processor architecture, using the - /// native architecture even when called from a WoW64 process. - /// https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getnativesysteminfo - fn GetNativeSystemInfo(info: *mut SystemInfo); -} - // A fixed-capacity UTF-16 buffer for building null-terminated wide strings // to pass to Win32 APIs. All Win32-facing methods automatically null-terminate. // @@ -341,13 +159,6 @@ unsafe fn get_env(name: &[u8], dst: &mut WBuf) -> usize { n } -/// Unset an environment variable. -unsafe fn unset_env(name: &[u8]) { - let mut name_w = WBuf::<64>::new(); - name_w.push_ascii(name); - SetEnvironmentVariableW(name_w.as_ptr(), ptr::null()); -} - /// C runtime entry point for MinGW/MSVC. Called before main() would be. /// We use #[no_main] so we define this directly. #[unsafe(no_mangle)] @@ -358,7 +169,7 @@ pub extern "C" fn mainCRTStartup() -> ! { unsafe fn main_impl() -> ! { // Get our own exe path, e.g. "C:\Users\...\tailscale\tool\go.exe". let mut exe = WBuf::<4096>::new(); - exe.len = GetModuleFileNameW(0, exe.buf.as_mut_ptr(), exe.buf.len() as u32) as usize; + exe.len = GetModuleFileNameW(null_mut(), exe.buf.as_mut_ptr(), exe.buf.len() as u32) as usize; if exe.len == 0 { die(b"GetModuleFileNameW failed\n"); } @@ -429,7 +240,7 @@ unsafe fn main_impl() -> ! { // Unset GOROOT to avoid breaking builds that depend on our Go // fork's patches (e.g. net/). The Go toolchain sets GOROOT // internally from its own location. - unset_env(b"GOROOT"); + SetEnvironmentVariableW(w!("GOROOT"), null()); // Build the new command line by replacing argv[0] with the real // go.exe path. We take the raw command line from GetCommandLineW @@ -445,7 +256,7 @@ unsafe fn main_impl() -> ! { cmd.push_ptr(args_tail); // Exec: create the child process, wait for it, and exit with its code. - let code = run_and_wait(go_exe.as_ptr(), &mut cmd, ptr::null()); + let code = run_and_wait(go_exe.as_ptr(), &mut cmd, null()); ExitProcess(code); } @@ -461,20 +272,21 @@ unsafe fn download_toolchain(toolchain: &WBuf<4096>, rev: &[u8]) { let mut dir = WBuf::<4096>::new(); get_env(b"USERPROFILE", &mut dir); dir.push_ascii(b"\\.cache"); - CreateDirectoryW(dir.as_ptr(), 0); + CreateDirectoryW(dir.as_ptr(), null()); dir.push_ascii(b"\\tsgo"); - CreateDirectoryW(dir.as_ptr(), 0); + CreateDirectoryW(dir.as_ptr(), null()); // Create the toolchain directory itself. let mut tc_dir = WBuf::<4096>::new(); tc_dir.push_wbuf(toolchain); - CreateDirectoryW(tc_dir.as_ptr(), 0); + CreateDirectoryW(tc_dir.as_ptr(), null()); // Detect host architecture via GetNativeSystemInfo (gives real arch // even from a WoW64 32-bit process). - let mut si: SystemInfo = core::mem::zeroed(); + let mut si = core::mem::zeroed(); GetNativeSystemInfo(&mut si); - let arch: &[u8] = match si.processor_architecture { + + let arch: &[u8] = match si.Anonymous.Anonymous.wProcessorArchitecture as u16 { PROCESSOR_ARCHITECTURE_AMD64 => b"amd64", PROCESSOR_ARCHITECTURE_ARM64 => b"arm64", PROCESSOR_ARCHITECTURE_INTEL => b"386", @@ -507,7 +319,7 @@ unsafe fn download_toolchain(toolchain: &WBuf<4096>, rev: &[u8]) { cmd.push_ascii(b"\" "); cmd.push_ascii(&url[..u]); - let code = run_and_wait(ptr::null(), &mut cmd, ptr::null()); + let code = run_and_wait(null(), &mut cmd, null()); if code != 0 { die(b"curl failed to download Go toolchain\n"); } @@ -519,7 +331,7 @@ unsafe fn download_toolchain(toolchain: &WBuf<4096>, rev: &[u8]) { cmd.push_wbuf(&tgz); cmd.push_ascii(b"\""); - let code = run_and_wait(ptr::null(), &mut cmd, tc_dir.as_ptr()); + let code = run_and_wait(null(), &mut cmd, tc_dir.as_ptr()); if code != 0 { die(b"tar failed to extract Go toolchain\n"); } @@ -527,10 +339,10 @@ unsafe fn download_toolchain(toolchain: &WBuf<4096>, rev: &[u8]) { // Write the .extracted marker file. let mut marker = WBuf::<4096>::new(); marker.push_wbuf(toolchain).push_ascii(b".extracted"); - let fh = CreateFileW(marker.as_ptr(), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); + let fh = CreateFileW(marker.as_ptr(), GENERIC_WRITE, 0, null(), CREATE_ALWAYS, 0, null_mut()); if fh != INVALID_HANDLE_VALUE { let mut written: u32 = 0; - WriteFile(fh, rev.as_ptr(), rev.len() as u32, &mut written, 0); + WriteFile(fh, rev.as_ptr(), rev.len() as u32, &mut written, null_mut()); CloseHandle(fh); } @@ -542,42 +354,25 @@ unsafe fn download_toolchain(toolchain: &WBuf<4096>, rev: &[u8]) { /// If app is null, CreateProcessW searches PATH using the command line. /// If dir is null, the child inherits the current directory. unsafe fn run_and_wait(app: *const u16, cmd: &mut WBuf<32768>, dir: *const u16) -> u32 { - let si = StartupInfoW { - cb: core::mem::size_of::() as u32, - reserved: 0, - desktop: 0, - title: 0, - x: 0, - y: 0, - x_size: 0, - y_size: 0, - x_count_chars: 0, - y_count_chars: 0, - fill_attribute: 0, - flags: STARTF_USESTDHANDLES, - show_window: 0, - cb_reserved2: 0, - reserved2: 0, - std_input: GetStdHandle(STD_INPUT_HANDLE), - std_output: GetStdHandle(STD_OUTPUT_HANDLE), - std_error: GetStdHandle(STD_ERROR_HANDLE), - }; - let mut pi = ProcessInformation { - process: 0, - thread: 0, - process_id: 0, - thread_id: 0, + let si = STARTUPINFOW { + cb: size_of::() as u32, + dwFlags: STARTF_USESTDHANDLES, + hStdInput: GetStdHandle(STD_INPUT_HANDLE), + hStdOutput: GetStdHandle(STD_OUTPUT_HANDLE), + hStdError: GetStdHandle(STD_ERROR_HANDLE), + ..Default::default() }; + let mut pi = PROCESS_INFORMATION::default(); if CreateProcessW( app, cmd.as_mut_ptr(), - 0, - 0, + null(), + null(), 1, // bInheritHandles = TRUE 0, - 0, - dir as usize, + null(), + dir, &si, &mut pi, ) == 0 @@ -585,11 +380,11 @@ unsafe fn run_and_wait(app: *const u16, cmd: &mut WBuf<32768>, dir: *const u16) die(b"CreateProcess failed\n"); } - WaitForSingleObject(pi.process, INFINITE); + WaitForSingleObject(pi.hProcess, INFINITE); let mut code: u32 = 1; - GetExitCodeProcess(pi.process, &mut code); - CloseHandle(pi.process); - CloseHandle(pi.thread); + GetExitCodeProcess(pi.hProcess, &mut code); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); code } @@ -607,7 +402,7 @@ unsafe fn fallback_pwsh(repo_root: &WBuf<4096>) -> ! { cmd.push_ptr(args_tail); // Pass null for lpApplicationName so CreateProcessW searches PATH for "pwsh". - let code = run_and_wait(ptr::null(), &mut cmd, ptr::null()); + let code = run_and_wait(null(), &mut cmd, null()); ExitProcess(code); } @@ -621,16 +416,16 @@ unsafe fn read_file_trimmed<'a, const N: usize>( path.as_ptr(), GENERIC_READ, FILE_SHARE_READ, - 0, + null(), OPEN_EXISTING, 0, - 0, + null_mut(), ); if h == INVALID_HANDLE_VALUE { die(b"cannot open go.toolchain.rev\n"); } let mut n: u32 = 0; - ReadFile(h, buf.as_mut_ptr(), buf.len() as u32, &mut n, 0); + ReadFile(h, buf.as_mut_ptr(), buf.len() as u32, &mut n, null_mut()); CloseHandle(h); let s = &buf[..n as usize]; @@ -670,7 +465,7 @@ unsafe fn skip_argv0(cmd: *const u16) -> *const u16 { unsafe fn stderr(msg: &[u8]) { let h = GetStdHandle(STD_ERROR_HANDLE); let mut n: u32 = 0; - WriteFile(h, msg.as_ptr(), msg.len() as u32, &mut n, 0); + WriteFile(h, msg.as_ptr(), msg.len() as u32, &mut n, null_mut()); } /// Write an error message to stderr and terminate with exit code 1. @@ -680,6 +475,7 @@ unsafe fn die(msg: &[u8]) -> ! { ExitProcess(1); } +#[cfg(not(test))] #[panic_handler] fn panic(_: &core::panic::PanicInfo) -> ! { unsafe { ExitProcess(EXIT_CODE_PANIC) }