exe-rs icon indicating copy to clipboard operation
exe-rs copied to clipboard

Code from example directory panics for Rufus executable on Windows

Open 3nthusia5t opened this issue 9 months ago • 2 comments

https://github.com/pbatard/rufus/releases/download/v4.4/rufus-4.4.exe

I have tried to run the example code against the rufus-4.4.exe on Windows operating system. The code panicks on the line

let icon_file = dir.to_icon_buffer(&pe).unwrap();

Writing 120.ico
thread 'main' panicked at library\core\src\panicking.rs:156:5:
unsafe precondition(s) violated: slice::from_raw_parts_mut requires the pointer to be aligned and non-null, and the total size of the slice not to exceed `isize::MAX`
stack backtrace:
   0:     0x7ff623079e6a - std::backtrace_rs::backtrace::dbghelp64::trace
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\..\..\backtrace\src\backtrace\dbghelp64.rs:99
   1:     0x7ff623079e6a - std::backtrace_rs::backtrace::trace_unsynchronized
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
   2:     0x7ff623079e6a - std::sys_common::backtrace::_print_fmt
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\sys_common\backtrace.rs:68
   3:     0x7ff623079e6a - std::sys_common::backtrace::_print::impl$0::fmt
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\sys_common\backtrace.rs:44
   4:     0x7ff623088eab - core::fmt::rt::Argument::fmt
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\core\src\fmt\rt.rs:142
   5:     0x7ff623088eab - core::fmt::write
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\core\src\fmt\mod.rs:1153
   6:     0x7ff623078201 - std::io::Write::write_fmt<std::sys::pal::windows::stdio::Stderr>
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\io\mod.rs:1843
   7:     0x7ff623079c56 - std::sys_common::backtrace::print
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\sys_common\backtrace.rs:34
   8:     0x7ff62307b79f - std::panicking::default_hook::closure$1
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\panicking.rs:272
   9:     0x7ff62307b437 - std::panicking::default_hook
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\panicking.rs:292
  10:     0x7ff62307bcdd - std::panicking::rust_panic_with_hook
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\panicking.rs:779
  11:     0x7ff62307bb5b - std::panicking::begin_panic_handler::closure$0
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\panicking.rs:649
  12:     0x7ff62307a4f9 - std::sys_common::backtrace::__rust_end_short_backtrace<std::panicking::begin_panic_handler::closure_env$0,never$>
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\sys_common\backtrace.rs:171
  13:     0x7ff62307b856 - std::panicking::begin_panic_handler
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\panicking.rs:645
  14:     0x7ff62308e471 - core::panicking::panic_nounwind_fmt::runtime
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\core\src\panicking.rs:110
  15:     0x7ff62308e471 - core::panicking::panic_nounwind_fmt
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\core\src\panicking.rs:123
  16:     0x7ff62308e538 - core::panicking::panic_nounwind
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\core\src\panicking.rs:156
  17:     0x7ff62304c597 - core::slice::raw::from_raw_parts_mut::precondition_check
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\core\src\intrinsics.rs:2799
  18:     0x7ff623041182 - core::slice::raw::from_raw_parts_mut<exe::types::IconDirEntry>
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\core\src\slice\raw.rs:152
  19:     0x7ff62305175e - pkbuffer::buffer::Buffer::get_mut_slice_ref_unaligned<pkbuffer::vec::VecBuffer,exe::types::IconDirEntry>
                               at D:\Users\admin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\pkbuffer-0.4.2\src\buffer.rs:361
  20:     0x7ff62304a83e - exe::types::IconDirMut::parse<pkbuffer::vec::VecBuffer>
                               at D:\Users\admin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\exe-0.5.6\src\types.rs:1606
  21:     0x7ff623043b7c - exe::headers::GrpIconDir::to_icon_buffer<exe::pe::VecPE>
                               at D:\Users\admin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\exe-0.5.6\src\headers.rs:1734
  22:     0x7ff6230419b5 - engine::main
                               at F:\3ngine\src\main.rs:64
  23:     0x7ff62304604b - core::ops::function::FnOnce::call_once<void (*)(),tuple$<> >
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\core\src\ops\function.rs:250
  24:     0x7ff62305004e - core::hint::black_box
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\core\src\hint.rs:337
  25:     0x7ff62305004e - std::sys_common::backtrace::__rust_begin_short_backtrace<void (*)(),tuple$<> >
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\std\src\sys_common\backtrace.rs:155
  26:     0x7ff62304cbe1 - std::rt::lang_start::closure$0<tuple$<> >
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\std\src\rt.rs:166
  27:     0x7ff623075552 - std::rt::lang_start_internal
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library\std\src\rt.rs:148
  28:     0x7ff62304cbba - std::rt::lang_start<tuple$<> >
                               at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6\library\std\src\rt.rs:165
  29:     0x7ff623041d09 - main
  30:     0x7ff62308caf0 - invoke_main
                               at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:78
  31:     0x7ff62308caf0 - __scrt_common_main_seh
                               at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
  32:     0x7ffcbaae257d - BaseThreadInitThunk
  33:     0x7ffcbc84aa48 - RtlUserThreadStart
thread caused non-unwinding panic. aborting.
error: process didn't exit successfully: `target\debug\engine.exe` (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)

The code which I run is available in repo:

use exe::*;

fn main() {
    let pe = VecPE::from_disk_file("rufus-4.4.exe").unwrap();
    let rsrc = ResourceDirectory::parse(&pe).unwrap();
    let icons = rsrc.icon_groups(&pe).unwrap();

    for (id, dir) in &icons {
        let filename = match id {
            ResolvedDirectoryID::ID(val) => format!("{}.ico", val),
            ResolvedDirectoryID::Name(name) => format!("{}.ico", name),
        };

        println!("Writing {}", filename);

        let icon_file = dir.to_icon_buffer(&pe).unwrap();
        icon_file.save(filename).unwrap();
    }

    println!("Icons dumped from executable");
}

3nthusia5t avatar May 23 '24 09:05 3nthusia5t