module OCI8::Util

def self.check_win32_pe_arch(filename, package)

def self.check_win32_pe_arch(filename, package)
  open(filename, 'rb') do |f|
    # DOS header.
    if f.read(2) == 'MZ'
      f.seek(60, IO::SEEK_SET)
      pe_offset = f.read(4).unpack('V')[0]
      f.seek(pe_offset)
      # PE header.
      if f.read(4) == "PE\000\000"
        case f.read(2).unpack('v')[0]
        when 0x8664
          if [nil].pack('P').size == 4
            raise LoadError, "\"#{filename}\" is x64 DLL. Use 32-bit #{package} instead."
          end
          return true
        when 0x014c
          if [nil].pack('P').size == 8
            raise LoadError, "\"#{filename}\" is 32-bit DLL. Use x64 #{package} instead."
          end
          return true
        end
      end
    end
    raise LoadError, "\"#{filename}\" is not a valid Win32 application."
  end
  nil
rescue
  nil
end # self.check_win32_pe_arch