// Generated by Lisette bindgen
// Source: debug/pe (Go stdlib)
// Go: 1.25.5
// Lisette: 0.1.20

import "go:debug/dwarf"
import "go:io"

pub fn NewFile(r: io.ReaderAt) -> Result<Ref<File>, error>

pub fn Open(name: string) -> Result<Ref<File>, error>

/// COFFSymbol represents single COFF symbol table record.
pub struct COFFSymbol {
  // SKIPPED field "Name": array-currently-not-representable — fixed-size array cannot currently be represented in Lisette
  pub Value: uint32,
  pub SectionNumber: int16,
  pub Type: uint16,
  pub StorageClass: uint8,
  pub NumberOfAuxSymbols: uint8,
}

/// COFFSymbolAuxFormat5 describes the expected form of an aux symbol
/// attached to a section definition symbol. The PE format defines a
/// number of different aux symbol formats: format 1 for function
/// definitions, format 2 for .be and .ef symbols, and so on. Format 5
/// holds extra info associated with a section definition, including
/// number of relocations + line numbers, as well as COMDAT info. See
/// https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#auxiliary-format-5-section-definitions
/// for more on what's going on here.
pub struct COFFSymbolAuxFormat5 {
  pub Size: uint32,
  pub NumRelocs: uint16,
  pub NumLineNumbers: uint16,
  pub Checksum: uint32,
  pub SecNum: uint16,
  pub Selection: uint8,
}

pub struct DataDirectory {
  pub VirtualAddress: uint32,
  pub Size: uint32,
}

/// A File represents an open PE file.
pub struct File {
  pub FileHeader: FileHeader,
  pub OptionalHeader: Unknown,
  pub Sections: Slice<Option<Ref<Section>>>,
  pub Symbols: Slice<Option<Ref<Symbol>>>,
  pub COFFSymbols: Slice<COFFSymbol>,
  pub StringTable: StringTable,
}

pub struct FileHeader {
  pub Machine: uint16,
  pub NumberOfSections: uint16,
  pub TimeDateStamp: uint32,
  pub PointerToSymbolTable: uint32,
  pub NumberOfSymbols: uint32,
  pub SizeOfOptionalHeader: uint16,
  pub Characteristics: uint16,
}

/// FormatError is unused.
/// The type is retained for compatibility.
pub type FormatError

pub struct ImportDirectory {
  pub OriginalFirstThunk: uint32,
  pub TimeDateStamp: uint32,
  pub ForwarderChain: uint32,
  pub Name: uint32,
  pub FirstThunk: uint32,
}

pub struct OptionalHeader32 {
  pub Magic: uint16,
  pub MajorLinkerVersion: uint8,
  pub MinorLinkerVersion: uint8,
  pub SizeOfCode: uint32,
  pub SizeOfInitializedData: uint32,
  pub SizeOfUninitializedData: uint32,
  pub AddressOfEntryPoint: uint32,
  pub BaseOfCode: uint32,
  pub BaseOfData: uint32,
  pub ImageBase: uint32,
  pub SectionAlignment: uint32,
  pub FileAlignment: uint32,
  pub MajorOperatingSystemVersion: uint16,
  pub MinorOperatingSystemVersion: uint16,
  pub MajorImageVersion: uint16,
  pub MinorImageVersion: uint16,
  pub MajorSubsystemVersion: uint16,
  pub MinorSubsystemVersion: uint16,
  pub Win32VersionValue: uint32,
  pub SizeOfImage: uint32,
  pub SizeOfHeaders: uint32,
  pub CheckSum: uint32,
  pub Subsystem: uint16,
  pub DllCharacteristics: uint16,
  pub SizeOfStackReserve: uint32,
  pub SizeOfStackCommit: uint32,
  pub SizeOfHeapReserve: uint32,
  pub SizeOfHeapCommit: uint32,
  pub LoaderFlags: uint32,
  pub NumberOfRvaAndSizes: uint32,
  // SKIPPED field "DataDirectory": array-currently-not-representable — fixed-size array cannot currently be represented in Lisette
}

pub struct OptionalHeader64 {
  pub Magic: uint16,
  pub MajorLinkerVersion: uint8,
  pub MinorLinkerVersion: uint8,
  pub SizeOfCode: uint32,
  pub SizeOfInitializedData: uint32,
  pub SizeOfUninitializedData: uint32,
  pub AddressOfEntryPoint: uint32,
  pub BaseOfCode: uint32,
  pub ImageBase: uint64,
  pub SectionAlignment: uint32,
  pub FileAlignment: uint32,
  pub MajorOperatingSystemVersion: uint16,
  pub MinorOperatingSystemVersion: uint16,
  pub MajorImageVersion: uint16,
  pub MinorImageVersion: uint16,
  pub MajorSubsystemVersion: uint16,
  pub MinorSubsystemVersion: uint16,
  pub Win32VersionValue: uint32,
  pub SizeOfImage: uint32,
  pub SizeOfHeaders: uint32,
  pub CheckSum: uint32,
  pub Subsystem: uint16,
  pub DllCharacteristics: uint16,
  pub SizeOfStackReserve: uint64,
  pub SizeOfStackCommit: uint64,
  pub SizeOfHeapReserve: uint64,
  pub SizeOfHeapCommit: uint64,
  pub LoaderFlags: uint32,
  pub NumberOfRvaAndSizes: uint32,
  // SKIPPED field "DataDirectory": array-currently-not-representable — fixed-size array cannot currently be represented in Lisette
}

/// Reloc represents a PE COFF relocation.
/// Each section contains its own relocation list.
pub struct Reloc {
  pub VirtualAddress: uint32,
  pub SymbolTableIndex: uint32,
  pub Type: uint16,
}

/// Section provides access to PE COFF section.
pub struct Section {
  pub SectionHeader: SectionHeader,
  pub Relocs: Slice<Reloc>,
  pub ReaderAt: Option<io.ReaderAt>,
}

/// SectionHeader is similar to [SectionHeader32] with Name
/// field replaced by Go string.
pub struct SectionHeader {
  pub Name: string,
  pub VirtualSize: uint32,
  pub VirtualAddress: uint32,
  pub Size: uint32,
  pub Offset: uint32,
  pub PointerToRelocations: uint32,
  pub PointerToLineNumbers: uint32,
  pub NumberOfRelocations: uint16,
  pub NumberOfLineNumbers: uint16,
  pub Characteristics: uint32,
}

/// SectionHeader32 represents real PE COFF section header.
pub struct SectionHeader32 {
  // SKIPPED field "Name": array-currently-not-representable — fixed-size array cannot currently be represented in Lisette
  pub VirtualSize: uint32,
  pub VirtualAddress: uint32,
  pub SizeOfRawData: uint32,
  pub PointerToRawData: uint32,
  pub PointerToRelocations: uint32,
  pub PointerToLineNumbers: uint32,
  pub NumberOfRelocations: uint16,
  pub NumberOfLineNumbers: uint16,
  pub Characteristics: uint32,
}

/// StringTable is a COFF string table.
pub struct StringTable(Slice<uint8>)

/// Symbol is similar to [COFFSymbol] with Name field replaced
/// by Go string. Symbol also does not have NumberOfAuxSymbols.
pub struct Symbol {
  pub Name: string,
  pub Value: uint32,
  pub SectionNumber: int16,
  pub Type: uint16,
  pub StorageClass: uint8,
}

pub const COFFSymbolSize = 18

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_ANY = 2

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_ASSOCIATIVE = 5

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_EXACT_MATCH = 4

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_LARGEST = 6

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_NODUPLICATES = 1

/// These constants make up the possible values for the 'Selection'
/// field in an AuxFormat5.
pub const IMAGE_COMDAT_SELECT_SAME_SIZE = 3

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_BASERELOC = 5

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_DEBUG = 6

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT = 13

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_EXPORT = 0

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_IAT = 12

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_IMPORT = 1

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_RESOURCE = 2

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_SECURITY = 4

/// IMAGE_DIRECTORY_ENTRY constants
pub const IMAGE_DIRECTORY_ENTRY_TLS = 9

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x0080

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x0100

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000

/// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
/// values. These can be combined together.
pub const IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_32BIT_MACHINE = 0x0100

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x0010

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_BYTES_REVERSED_HI = 0x8000

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_BYTES_REVERSED_LO = 0x0080

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_DEBUG_STRIPPED = 0x0200

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_DLL = 0x2000

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008

pub const IMAGE_FILE_MACHINE_AM33 = 0x1d3

pub const IMAGE_FILE_MACHINE_AMD64 = 0x8664

pub const IMAGE_FILE_MACHINE_ARM = 0x1c0

pub const IMAGE_FILE_MACHINE_ARM64 = 0xaa64

pub const IMAGE_FILE_MACHINE_ARMNT = 0x1c4

pub const IMAGE_FILE_MACHINE_EBC = 0xebc

pub const IMAGE_FILE_MACHINE_I386 = 0x14c

pub const IMAGE_FILE_MACHINE_IA64 = 0x200

pub const IMAGE_FILE_MACHINE_LOONGARCH32 = 0x6232

pub const IMAGE_FILE_MACHINE_LOONGARCH64 = 0x6264

pub const IMAGE_FILE_MACHINE_M32R = 0x9041

pub const IMAGE_FILE_MACHINE_MIPS16 = 0x266

pub const IMAGE_FILE_MACHINE_MIPSFPU = 0x366

pub const IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466

pub const IMAGE_FILE_MACHINE_POWERPC = 0x1f0

pub const IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1

pub const IMAGE_FILE_MACHINE_R4000 = 0x166

pub const IMAGE_FILE_MACHINE_RISCV128 = 0x5128

pub const IMAGE_FILE_MACHINE_RISCV32 = 0x5032

pub const IMAGE_FILE_MACHINE_RISCV64 = 0x5064

pub const IMAGE_FILE_MACHINE_SH3 = 0x1a2

pub const IMAGE_FILE_MACHINE_SH3DSP = 0x1a3

pub const IMAGE_FILE_MACHINE_SH4 = 0x1a6

pub const IMAGE_FILE_MACHINE_SH5 = 0x1a8

pub const IMAGE_FILE_MACHINE_THUMB = 0x1c2

pub const IMAGE_FILE_MACHINE_UNKNOWN = 0x0

pub const IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_RELOCS_STRIPPED = 0x0001

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_SYSTEM = 0x1000

/// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
pub const IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000

/// Section characteristics flags.
pub const IMAGE_SCN_CNT_CODE = 0x00000020

/// Section characteristics flags.
pub const IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040

/// Section characteristics flags.
pub const IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080

/// Section characteristics flags.
pub const IMAGE_SCN_LNK_COMDAT = 0x00001000

/// Section characteristics flags.
pub const IMAGE_SCN_MEM_DISCARDABLE = 0x02000000

/// Section characteristics flags.
pub const IMAGE_SCN_MEM_EXECUTE = 0x20000000

/// Section characteristics flags.
pub const IMAGE_SCN_MEM_READ = 0x40000000

/// Section characteristics flags.
pub const IMAGE_SCN_MEM_WRITE = 0x80000000

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_EFI_APPLICATION = 10

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_EFI_ROM = 13

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_NATIVE = 1

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_OS2_CUI = 5

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_POSIX_CUI = 7

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_UNKNOWN = 0

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_WINDOWS_CUI = 3

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_WINDOWS_GUI = 2

/// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
pub const IMAGE_SUBSYSTEM_XBOX = 14

impl COFFSymbol {
  /// FullName finds real name of symbol sym. Normally name is stored
  /// in sym.Name, but if it is longer then 8 characters, it is stored
  /// in COFF string table st instead.
  fn FullName(self: Ref<COFFSymbol>, st: StringTable) -> Result<string, error>
}

impl File {
  /// COFFSymbolReadSectionDefAux returns a blob of auxiliary information
  /// (including COMDAT info) for a section definition symbol. Here 'idx'
  /// is the index of a section symbol in the main [COFFSymbol] array for
  /// the File. Return value is a pointer to the appropriate aux symbol
  /// struct. For more info, see:
  /// 
  /// auxiliary symbols: https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#auxiliary-symbol-records
  /// COMDAT sections: https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#comdat-sections-object-only
  /// auxiliary info for section definitions: https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#auxiliary-format-5-section-definitions
  fn COFFSymbolReadSectionDefAux(self: Ref<File>, idx: int) -> Result<Ref<COFFSymbolAuxFormat5>, error>

  /// Close closes the [File].
  /// If the [File] was created using [NewFile] directly instead of [Open],
  /// Close has no effect.
  #[allow(unused_result)]
  fn Close(self: Ref<File>) -> Result<(), error>

  fn DWARF(self: Ref<File>) -> Result<Ref<dwarf.Data>, error>

  /// ImportedLibraries returns the names of all libraries
  /// referred to by the binary f that are expected to be
  /// linked with the binary at dynamic link time.
  fn ImportedLibraries(self: Ref<File>) -> Result<Slice<string>, error>

  /// ImportedSymbols returns the names of all symbols
  /// referred to by the binary f that are expected to be
  /// satisfied by other libraries at dynamic load time.
  /// It does not return weak symbols.
  fn ImportedSymbols(self: Ref<File>) -> Result<Slice<string>, error>

  /// Section returns the first section with the given name, or nil if no such
  /// section exists.
  fn Section(self: Ref<File>, name: string) -> Option<Ref<Section>>
}

impl FormatError {
  fn Error(self: Ref<FormatError>) -> string
}

impl Section {
  /// Data reads and returns the contents of the PE section s.
  /// 
  /// If s.Offset is 0, the section has no contents,
  /// and Data will always return a non-nil error.
  fn Data(self: Ref<Section>) -> Result<Slice<uint8>, error>

  /// Open returns a new ReadSeeker reading the PE section s.
  /// 
  /// If s.Offset is 0, the section has no contents, and all calls
  /// to the returned reader will return a non-nil error.
  fn Open(self: Ref<Section>) -> io.ReadSeeker

  fn ReadAt(self, mut p: Slice<uint8>, off: int64) -> Partial<int, error>
}

impl StringTable {
  /// String extracts string from COFF string table st at offset start.
  fn String(self, start: uint32) -> Result<string, error>
}
