"""boot.wim manipulation via wimtools (wimextract / wimupdate / wimdir). Used by the startnet.cmd editor to extract + update the boot script that runs when WinPE boots from PXE. """ import os import shutil import subprocess import tempfile def extract_startnet(wim_path): """Extract startnet.cmd from a WIM file. Returns the contents or None.""" tmpdir = tempfile.mkdtemp() try: result = subprocess.run( ["wimextract", wim_path, "1", "/Windows/System32/startnet.cmd", "--dest-dir", tmpdir], capture_output=True, text=True, timeout=30, ) startnet_path = os.path.join(tmpdir, "startnet.cmd") if result.returncode == 0 and os.path.isfile(startnet_path): with open(startnet_path, "r", encoding="utf-8", errors="replace") as fh: return fh.read() return None except Exception: return None finally: shutil.rmtree(tmpdir, ignore_errors=True) def update_startnet(wim_path, content): """Update startnet.cmd inside a WIM file via wimupdate. Returns (ok, error_message). Writes CRLF line endings. """ tmpdir = tempfile.mkdtemp() try: startnet_path = os.path.join(tmpdir, "startnet.cmd") with open(startnet_path, "w", encoding="utf-8", newline="\r\n") as fh: fh.write(content) update_cmd = f"add {startnet_path} /Windows/System32/startnet.cmd\n" result = subprocess.run( ["wimupdate", wim_path, "1"], input=update_cmd, capture_output=True, text=True, timeout=60, ) if result.returncode != 0: return False, result.stderr.strip() return True, "" except Exception as exc: return False, str(exc) finally: shutil.rmtree(tmpdir, ignore_errors=True) def list_files(wim_path, path="/"): """List files inside a WIM at the given path.""" try: result = subprocess.run( ["wimdir", wim_path, "1", path], capture_output=True, text=True, timeout=30, ) if result.returncode == 0: return [l.strip() for l in result.stdout.splitlines() if l.strip()] return [] except Exception: return []