///|
/// Bound imports (slot 11).
///
/// A bound-import table records the DLL versions an image was linked against.
/// It is advisory and often stripped, but when present it tells a release check
/// which system libraries the build was pinned to.

///|
/// The module names listed in the bound-import directory.
pub fn Pe::bound_imports(self : Pe) -> Array[String] raise PeError {
  let out : Array[String] = []
  let directory = match self.directory(11) {
    None => return out
    Some(directory) => directory
  }
  if directory.virtual_address == 0 || directory.size == 0 {
    return out
  }
  let base = match self.rva_to_offset(directory.virtual_address) {
    Some(offset) => offset
    None =>
      raise PeError::Malformed(
        "bound-import directory RVA " +
        hex(directory.virtual_address) +
        " is not backed by file bytes",
        0,
      )
  }
  let reader = Reader::at(self.bytes, base)
  let mut count = 0
  let mut done = false
  while !done && count < 4096 {
    let timestamp = reader.u32()
    let name_offset = reader.u16()
    let forwarders = reader.u16()
    if timestamp == 0 && name_offset == 0 && forwarders == 0 {
      done = true
    } else {
      reader.skip(forwarders * 8)
      if name_offset != 0 {
        let name_reader = Reader::at(self.bytes, base + name_offset)
        let name = name_reader.cstring(512)
        out.push(name)
      }
      count = count + 1
    }
  }
  out
}