Updated after version 2.2.6 to compile again, and with MinGW, even (only?)
cross-compiling. (Hopefully it works with MSVC too.)
-To use this port, you need to install WinIO.dll first. You can get it
-from http://www.internals.com/.
+For simple listing PCI devices in system via win32-cfgmgr32 access method
+which provides only basic information and emulated config space, there is no
+special requirement. To list PCI resources on Windows 8 and higher versions,
+it is necessary to have architecture-native version (e.g. AMD64 version on
+AMD64 systems).
-However, you need to use win32/config.{h,mk} instead of the automatically
-generated lib/config.{h,mk} as lib/configure does not run on Windows.
+For config space access there are different windows specific access methods:
+- win32-kldbg - Kernel Local Debugging Driver kldbgdrv.sys
+- win32-sysdbg - NT SysDbg interface
+- intel-conf1 - Direct hardware access via Intel configuration mechanism 1
-================================================================================
-BEWARE: The current implementation pokes I/O ports to access the PCI devices
-directly. This leads to several problems: some devices are invisible, extended
-PCIe configuration space is not available, and there are many potential race
-conditions. Instead, libpci should use the proper Windows drivers.
+The default access method is win32-cfgmgr32 and by default it tries to use
+one of the above config access access method to provide as much as possible
+information to application. More details about particular access method and
+caveats are described in the pcilib(8) manual page.
-Unfortunately, the Windows port currently lacks a maintainer. If you are willing
-to step up and fix the issues, please let me know. -- Martin Mares
-================================================================================
+The default access method for config space is win32-kldbg. It uses Microsoft's
+Kernel Local Debugging Driver kldbgdrv.sys. This driver is not part of the
+Windows system but is part of the Microsoft WinDbg tool. It is required to
+have kldbgdrv.sys driver installed in the system32 directory or to have
+windbg.exe or kd.exe binary in PATH. kldbgdrv.sys driver has some restrictions.
+Process needs to have Debug privilege and Windows system has to be booted with
+Debugging option. Debugging option can be enabled by calling (takes effect
+after next boot): bcdedit /debug on
+
+Download links for WinDbg 6.12.2.633 standalone installer from Microsoft:
+https://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi
+https://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi
+
+To access config space via intel-conf1 access method on NT-based systems via
+NT ProcessUserModeIOPL system call, it is required to have SeTcbPrivilege
+(Act as part of the operating system privilege), which can be enabled in User
+Accounts settings (take effect after next login). By default this privilege is
+not enabled for any non-system user. Or alternatively it is required to be in
+local Administrators group and on Windows 2000 SP4 or higher systems to have
+SeImpersonatePrivilege (Impersonate a client after authentication privilege)
+which is by default enabled for all local Administrators accounts. There is no
+special requirement for DOS-based systems. 64-bit systems do not have to allow
+users to access config space even with SeTcbPrivilege.
+
+To compile this port, run following command:
+
+ make CROSS_COMPILE=i586-mingw32msvc- HOST=i586-windows ZLIB=no IDSDIR=""
+
+To build 64-bit version, run:
+
+ make CROSS_COMPILE=x86_64-w64-mingw32- HOST=x86_64-windows ZLIB=no IDSDIR=""
+
+Sometimes compilation may fail due to broken or missing getopt implementation.
+In this case try to compile with additional make option: COMPAT_GETOPT=yes
+
+Building of shared DLL library libpci3.dll is supported too but needs to be
+manually enabled by make option: SHARED=yes
+
+This DLL library libpci3.dll has versioned symbols with stable ordinal numbers
+which provides backward and forward compatibility. Every symbol in DLL library
+has '@LIBPCI_3.<version>' suffix to achieve it. For linking application to
+libpci3.dll it is possible to generate import library from libpci3.def file.
+Such import library will provide import symbol names without versioned suffix
+as an alias for the latest symbol version, which matches function name in pci.h
+header file. The alias is resolved by the linker at linking time, so the final
+application binary would always reference only versioned symbol. DLL library
+libpci3.dll does not provide unversioned symbols, so for using GetProcAddress()
+or dlsym() it is needed to specify full versioned symbol name.