[
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: test it\r\non: [push]\r\njobs:\r\n  ubuntu:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v3\r\n      - uses: actions-rs/toolchain@v1\r\n        with:\r\n          toolchain: stable\r\n      - uses: actions-rs/cargo@v1\r\n        with:\r\n          command: test\r\n  windows:\r\n    runs-on: windows-latest\r\n    steps:\r\n      - uses: actions/checkout@v3\r\n      - uses: actions-rs/toolchain@v1\r\n        with:\r\n          toolchain: stable\r\n      - uses: actions-rs/cargo@v1\r\n        with:\r\n          command: test"
  },
  {
    "path": ".gitignore",
    "content": "/target\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"totally-safe-transmute\"\nversion = \"0.0.3\"\nauthors = [\"Benjamin Herr <ben@0x539.de>\"]\nedition = \"2018\"\ndescription = \"I'm sure it's fine.\"\nlicense = \"AGPL-3.0-or-later\"\nrepository = \"https://github.com/ben0x539/totally-safe-transmute\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\n"
  },
  {
    "path": "src/lib.rs",
    "content": "#![forbid(unsafe_code)]\n\npub fn totally_safe_transmute<T, U>(v: T) -> U {\n    #[repr(C)]\n    enum E<T, U> {\n        T(T),\n        #[allow(dead_code)] U(U),\n    }\n    let v = E::T(v);\n\n    #[cfg(target_os = \"linux\")]\n    {\n        use std::{io::{self, Write, Seek}, fs};\n\n        let mut f = fs::OpenOptions::new()\n            .write(true)\n            .open(\"/proc/self/mem\").expect(\"welp\");\n\n        f.seek(io::SeekFrom::Start(&v as *const _ as u64)).expect(\"oof\");\n        f.write(&[1]).expect(\"darn\");\n    }\n\n    #[cfg(target_os = \"windows\")]\n    {\n        use std::{env, process, fs};\n        let p = env::temp_dir().join(\"random-collision-free-name-I1G3qPvXTU4RvRML.ps1\");\n        fs::write(&p, r#\"\n            Param (\n                [int]$parentPid,\n                [UInt64]$tagAddress\n            )\n\n            Add-Type -TypeDefinition @\"\n                using System;\n                using System.Runtime.InteropServices;\n\n                public static class Helper {\n                    const int PROCESS_VM_WRITE = 0x0020;\n                    const int PROCESS_VM_OPERATION = 0x0008;\n\n                    [DllImport(\"kernel32.dll\")]\n                    public static extern IntPtr OpenProcess(int dwDesiredAccess,\n                        bool bInheritHandle, int dwProcessId);\n\n                    [DllImport(\"kernel32.dll\", SetLastError = true)]\n                    public static extern bool WriteProcessMemory(IntPtr hProcess, ulong lpBaseAddress,\n                        byte[] lpBuffer, int dwSize, IntPtr lpNumberOfBytesWritten);\n                    \n                    public static void Run(int parentPid, ulong tagAddress) {\n                        IntPtr handle = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, parentPid);\n                        WriteProcessMemory(handle, tagAddress, new byte[]{1}, 1, (IntPtr) 0);\n                    }\n                }\n            \"@\n\n            [Helper]::Run($parentPid, $tagAddress) \n        \"#.replace(\"\\n            \", \"\\n\")).unwrap();\n        let i = process::id();\n        if !process::Command::new(\"powershell\")\n            .args(&[&p.to_str().unwrap(), &i.to_string()[..], &(&v as *const _ as u64).to_string()])\n            .spawn()\n            .unwrap()\n            .wait()\n            .unwrap()\n            .success() { panic!(\"install linux lol\"); }\n        fs::remove_file(&p).unwrap();\n    }\n\n    if let E::U(v) = v {\n        return v;\n    }\n\n    panic!(\"rip\");\n}\n\n#[test]\nfn main() {\n    let v: Vec<u8> = b\"foo\".to_vec();\n    let v: String = totally_safe_transmute(v);\n    assert_eq!(&v, \"foo\");\n}\n"
  }
]