Instead of trying to split and parse elements from virtio-win paths, use the '*.inf' files supplied with the drivers to control how Windows drivers are installed.
The following emails best explain how this works: https://www.redhat.com/archives/libguestfs/2015-October/msg00352.html https://www.redhat.com/archives/libguestfs/2015-November/msg00065.html Currently the product variant (eg. client or server) is ignored. --- v2v/v2v_unit_tests.ml | 623 ++++++++------------------------------------------ v2v/windows.ml | 289 +++++++++++++---------- v2v/windows.mli | 2 +- 3 files changed, 265 insertions(+), 649 deletions(-) diff --git a/v2v/v2v_unit_tests.ml b/v2v/v2v_unit_tests.ml index 169eea9..5cc1f3e 100644 --- a/v2v/v2v_unit_tests.ml +++ b/v2v/v2v_unit_tests.ml @@ -225,7 +225,7 @@ let test_windows_inf_of_string ctx = assert_equal ~printer expected sections (* Test the code which matches [*.inf] files to Windows guests. *) -let test_virtio_iso_path_matches_guest_os ctx = +let test_virtio_inf_matches_guest_os ctx = (* Windows OSes fake inspection data. *) let make_win name major minor variant arch = { inspect_defaults with @@ -262,591 +262,149 @@ let test_virtio_iso_path_matches_guest_os ctx = ] in let paths = [ - (* Paths from the virtio-win 1.7.4 ISO. *) - "Balloon/2k12/amd64/WdfCoInstaller01011.dll", None; - "Balloon/2k12/amd64/balloon.cat", Some win2k12_64; - "Balloon/2k12/amd64/balloon.inf", Some win2k12_64; - "Balloon/2k12/amd64/balloon.pdb", Some win2k12_64; - "Balloon/2k12/amd64/balloon.sys", Some win2k12_64; - "Balloon/2k12/amd64/blnsvr.exe", None; - "Balloon/2k12/amd64/blnsvr.pdb", Some win2k12_64; - "Balloon/2k12R2/amd64/WdfCoInstaller01011.dll", None; - "Balloon/2k12R2/amd64/balloon.cat", Some win2k12r2_64; - "Balloon/2k12R2/amd64/balloon.inf", Some win2k12r2_64; - "Balloon/2k12R2/amd64/balloon.pdb", Some win2k12r2_64; - "Balloon/2k12R2/amd64/balloon.sys", Some win2k12r2_64; - "Balloon/2k12R2/amd64/blnsvr.exe", None; - "Balloon/2k12R2/amd64/blnsvr.pdb", Some win2k12r2_64; - "Balloon/2k3/amd64/WdfCoInstaller01009.dll", None; - "Balloon/2k3/amd64/balloon.cat", Some win2k3_64; - "Balloon/2k3/amd64/balloon.inf", Some win2k3_64; - "Balloon/2k3/amd64/balloon.pdb", Some win2k3_64; - "Balloon/2k3/amd64/balloon.sys", Some win2k3_64; - "Balloon/2k3/amd64/blnsvr.exe", None; - "Balloon/2k3/amd64/blnsvr.pdb", Some win2k3_64; - "Balloon/2k3/x86/WdfCoInstaller01009.dll", None; - "Balloon/2k3/x86/balloon.cat", Some win2k3_32; - "Balloon/2k3/x86/balloon.inf", Some win2k3_32; - "Balloon/2k3/x86/balloon.pdb", Some win2k3_32; - "Balloon/2k3/x86/balloon.sys", Some win2k3_32; - "Balloon/2k3/x86/blnsvr.exe", None; - "Balloon/2k3/x86/blnsvr.pdb", Some win2k3_32; - "Balloon/2k8/amd64/WdfCoInstaller01009.dll", None; - "Balloon/2k8/amd64/balloon.cat", Some win2k8_64; - "Balloon/2k8/amd64/balloon.inf", Some win2k8_64; - "Balloon/2k8/amd64/balloon.pdb", Some win2k8_64; - "Balloon/2k8/amd64/balloon.sys", Some win2k8_64; - "Balloon/2k8/amd64/blnsvr.exe", None; - "Balloon/2k8/amd64/blnsvr.pdb", Some win2k8_64; - "Balloon/2k8/x86/WdfCoInstaller01009.dll", None; - "Balloon/2k8/x86/balloon.cat", Some win2k8_32; - "Balloon/2k8/x86/balloon.inf", Some win2k8_32; - "Balloon/2k8/x86/balloon.pdb", Some win2k8_32; - "Balloon/2k8/x86/balloon.sys", Some win2k8_32; - "Balloon/2k8/x86/blnsvr.exe", None; - "Balloon/2k8/x86/blnsvr.pdb", Some win2k8_32; - "Balloon/2k8R2/amd64/WdfCoInstaller01009.dll", None; - "Balloon/2k8R2/amd64/balloon.cat", Some win2k8r2_64; - "Balloon/2k8R2/amd64/balloon.inf", Some win2k8r2_64; - "Balloon/2k8R2/amd64/balloon.pdb", Some win2k8r2_64; - "Balloon/2k8R2/amd64/balloon.sys", Some win2k8r2_64; - "Balloon/2k8R2/amd64/blnsvr.exe", None; - "Balloon/2k8R2/amd64/blnsvr.pdb", Some win2k8r2_64; - "Balloon/w7/amd64/WdfCoInstaller01009.dll", None; - "Balloon/w7/amd64/balloon.cat", Some win7_64; - "Balloon/w7/amd64/balloon.inf", Some win7_64; - "Balloon/w7/amd64/balloon.pdb", Some win7_64; - "Balloon/w7/amd64/balloon.sys", Some win7_64; - "Balloon/w7/amd64/blnsvr.exe", None; - "Balloon/w7/amd64/blnsvr.pdb", Some win7_64; - "Balloon/w7/x86/WdfCoInstaller01009.dll", None; - "Balloon/w7/x86/balloon.cat", Some win7_32; - "Balloon/w7/x86/balloon.inf", Some win7_32; - "Balloon/w7/x86/balloon.pdb", Some win7_32; - "Balloon/w7/x86/balloon.sys", Some win7_32; - "Balloon/w7/x86/blnsvr.exe", None; - "Balloon/w7/x86/blnsvr.pdb", Some win7_32; - "Balloon/w8.1/amd64/WdfCoInstaller01011.dll", None; - "Balloon/w8.1/amd64/balloon.cat", Some win8_1_64; - "Balloon/w8.1/amd64/balloon.inf", Some win8_1_64; - "Balloon/w8.1/amd64/balloon.pdb", Some win8_1_64; - "Balloon/w8.1/amd64/balloon.sys", Some win8_1_64; - "Balloon/w8.1/amd64/blnsvr.exe", None; - "Balloon/w8.1/amd64/blnsvr.pdb", Some win8_1_64; - "Balloon/w8.1/x86/WdfCoInstaller01011.dll", None; - "Balloon/w8.1/x86/balloon.cat", Some win8_1_32; - "Balloon/w8.1/x86/balloon.inf", Some win8_1_32; - "Balloon/w8.1/x86/balloon.pdb", Some win8_1_32; - "Balloon/w8.1/x86/balloon.sys", Some win8_1_32; - "Balloon/w8.1/x86/blnsvr.exe", None; - "Balloon/w8.1/x86/blnsvr.pdb", Some win8_1_32; - "Balloon/w8/amd64/WdfCoInstaller01011.dll", None; - "Balloon/w8/amd64/balloon.cat", Some win8_64; - "Balloon/w8/amd64/balloon.inf", Some win8_64; - "Balloon/w8/amd64/balloon.pdb", Some win8_64; - "Balloon/w8/amd64/balloon.sys", Some win8_64; - "Balloon/w8/amd64/blnsvr.exe", None; - "Balloon/w8/amd64/blnsvr.pdb", Some win8_64; - "Balloon/w8/x86/WdfCoInstaller01011.dll", None; - "Balloon/w8/x86/balloon.cat", Some win8_32; - "Balloon/w8/x86/balloon.inf", Some win8_32; - "Balloon/w8/x86/balloon.pdb", Some win8_32; - "Balloon/w8/x86/balloon.sys", Some win8_32; - "Balloon/w8/x86/blnsvr.exe", None; - "Balloon/w8/x86/blnsvr.pdb", Some win8_32; - "Balloon/xp/x86/WdfCoInstaller01009.dll", None; - "Balloon/xp/x86/balloon.cat", Some winxp_32; - "Balloon/xp/x86/balloon.inf", Some winxp_32; - "Balloon/xp/x86/balloon.pdb", Some winxp_32; - "Balloon/xp/x86/balloon.sys", Some winxp_32; - "Balloon/xp/x86/blnsvr.exe", None; - "Balloon/xp/x86/blnsvr.pdb", Some winxp_32; - "NetKVM/2k12/amd64/netkvm.cat", Some win2k12_64; - "NetKVM/2k12/amd64/netkvm.inf", Some win2k12_64; - "NetKVM/2k12/amd64/netkvm.pdb", Some win2k12_64; - "NetKVM/2k12/amd64/netkvm.sys", Some win2k12_64; - "NetKVM/2k12/amd64/netkvmco.dll", None; - "NetKVM/2k12/amd64/readme.doc", None; - "NetKVM/2k12R2/amd64/netkvm.cat", Some win2k12r2_64; - "NetKVM/2k12R2/amd64/netkvm.inf", Some win2k12r2_64; - "NetKVM/2k12R2/amd64/netkvm.pdb", Some win2k12r2_64; - "NetKVM/2k12R2/amd64/netkvm.sys", Some win2k12r2_64; - "NetKVM/2k12R2/amd64/netkvmco.dll", None; - "NetKVM/2k12R2/amd64/readme.doc", None; - "NetKVM/2k3/amd64/netkvm.cat", Some win2k3_64; - "NetKVM/2k3/amd64/netkvm.inf", Some win2k3_64; - "NetKVM/2k3/amd64/netkvm.pdb", Some win2k3_64; - "NetKVM/2k3/amd64/netkvm.sys", Some win2k3_64; - "NetKVM/2k3/x86/netkvm.cat", Some win2k3_32; - "NetKVM/2k3/x86/netkvm.inf", Some win2k3_32; - "NetKVM/2k3/x86/netkvm.pdb", Some win2k3_32; - "NetKVM/2k3/x86/netkvm.sys", Some win2k3_32; - "NetKVM/2k8/amd64/netkvm.cat", Some win2k8_64; - "NetKVM/2k8/amd64/netkvm.inf", Some win2k8_64; - "NetKVM/2k8/amd64/netkvm.pdb", Some win2k8_64; - "NetKVM/2k8/amd64/netkvm.sys", Some win2k8_64; - "NetKVM/2k8/amd64/netkvmco.dll", None; - "NetKVM/2k8/amd64/readme.doc", None; - "NetKVM/2k8/x86/netkvm.cat", Some win2k8_32; - "NetKVM/2k8/x86/netkvm.inf", Some win2k8_32; - "NetKVM/2k8/x86/netkvm.pdb", Some win2k8_32; - "NetKVM/2k8/x86/netkvm.sys", Some win2k8_32; - "NetKVM/2k8/x86/netkvmco.dll", None; - "NetKVM/2k8/x86/readme.doc", None; - "NetKVM/2k8R2/amd64/netkvm.cat", Some win2k8r2_64; - "NetKVM/2k8R2/amd64/netkvm.inf", Some win2k8r2_64; - "NetKVM/2k8R2/amd64/netkvm.pdb", Some win2k8r2_64; - "NetKVM/2k8R2/amd64/netkvm.sys", Some win2k8r2_64; - "NetKVM/2k8R2/amd64/netkvmco.dll", None; - "NetKVM/2k8R2/amd64/readme.doc", None; - "NetKVM/w7/amd64/netkvm.cat", Some win7_64; - "NetKVM/w7/amd64/netkvm.inf", Some win7_64; - "NetKVM/w7/amd64/netkvm.pdb", Some win7_64; - "NetKVM/w7/amd64/netkvm.sys", Some win7_64; - "NetKVM/w7/amd64/netkvmco.dll", None; - "NetKVM/w7/amd64/readme.doc", None; - "NetKVM/w7/x86/netkvm.cat", Some win7_32; - "NetKVM/w7/x86/netkvm.inf", Some win7_32; - "NetKVM/w7/x86/netkvm.pdb", Some win7_32; - "NetKVM/w7/x86/netkvm.sys", Some win7_32; - "NetKVM/w7/x86/netkvmco.dll", None; - "NetKVM/w7/x86/readme.doc", None; - "NetKVM/w8.1/amd64/netkvm.cat", Some win8_1_64; - "NetKVM/w8.1/amd64/netkvm.inf", Some win8_1_64; - "NetKVM/w8.1/amd64/netkvm.pdb", Some win8_1_64; - "NetKVM/w8.1/amd64/netkvm.sys", Some win8_1_64; - "NetKVM/w8.1/amd64/netkvmco.dll", None; - "NetKVM/w8.1/amd64/readme.doc", None; - "NetKVM/w8.1/x86/netkvm.cat", Some win8_1_32; - "NetKVM/w8.1/x86/netkvm.inf", Some win8_1_32; - "NetKVM/w8.1/x86/netkvm.pdb", Some win8_1_32; - "NetKVM/w8.1/x86/netkvm.sys", Some win8_1_32; - "NetKVM/w8.1/x86/netkvmco.dll", None; - "NetKVM/w8.1/x86/readme.doc", None; - "NetKVM/w8/amd64/netkvm.cat", Some win8_64; - "NetKVM/w8/amd64/netkvm.inf", Some win8_64; - "NetKVM/w8/amd64/netkvm.pdb", Some win8_64; - "NetKVM/w8/amd64/netkvm.sys", Some win8_64; - "NetKVM/w8/amd64/netkvmco.dll", None; - "NetKVM/w8/amd64/readme.doc", None; - "NetKVM/w8/x86/netkvm.cat", Some win8_32; - "NetKVM/w8/x86/netkvm.inf", Some win8_32; - "NetKVM/w8/x86/netkvm.pdb", Some win8_32; - "NetKVM/w8/x86/netkvm.sys", Some win8_32; - "NetKVM/w8/x86/netkvmco.dll", None; - "NetKVM/w8/x86/readme.doc", None; - "NetKVM/xp/x86/netkvm.cat", Some winxp_32; - "NetKVM/xp/x86/netkvm.inf", Some winxp_32; - "NetKVM/xp/x86/netkvm.pdb", Some winxp_32; - "NetKVM/xp/x86/netkvm.sys", Some winxp_32; - "guest-agent/qemu-ga-x64.msi", None; - "guest-agent/qemu-ga-x86.msi", None; - "qemupciserial/qemupciserial.inf", None; - "viorng/2k12/amd64/WdfCoInstaller01011.dll", None; - "viorng/2k12/amd64/viorng.cat", Some win2k12_64; - "viorng/2k12/amd64/viorng.inf", Some win2k12_64; - "viorng/2k12/amd64/viorng.pdb", Some win2k12_64; - "viorng/2k12/amd64/viorng.sys", Some win2k12_64; - "viorng/2k12/amd64/viorngci.dll", None; - "viorng/2k12/amd64/viorngum.dll", None; - "viorng/2k12R2/amd64/WdfCoInstaller01011.dll", None; - "viorng/2k12R2/amd64/viorng.cat", Some win2k12r2_64; - "viorng/2k12R2/amd64/viorng.inf", Some win2k12r2_64; - "viorng/2k12R2/amd64/viorng.pdb", Some win2k12r2_64; - "viorng/2k12R2/amd64/viorng.sys", Some win2k12r2_64; - "viorng/2k12R2/amd64/viorngci.dll", None; - "viorng/2k12R2/amd64/viorngum.dll", None; - "viorng/2k8/amd64/WdfCoInstaller01009.dll", None; - "viorng/2k8/amd64/viorng.cat", Some win2k8_64; - "viorng/2k8/amd64/viorng.inf", Some win2k8_64; - "viorng/2k8/amd64/viorng.pdb", Some win2k8_64; - "viorng/2k8/amd64/viorng.sys", Some win2k8_64; - "viorng/2k8/amd64/viorngci.dll", None; - "viorng/2k8/amd64/viorngum.dll", None; - "viorng/2k8/x86/WdfCoInstaller01009.dll", None; - "viorng/2k8/x86/viorng.cat", Some win2k8_32; - "viorng/2k8/x86/viorng.inf", Some win2k8_32; - "viorng/2k8/x86/viorng.pdb", Some win2k8_32; - "viorng/2k8/x86/viorng.sys", Some win2k8_32; - "viorng/2k8/x86/viorngci.dll", None; - "viorng/2k8/x86/viorngum.dll", None; - "viorng/2k8R2/amd64/WdfCoInstaller01009.dll", None; - "viorng/2k8R2/amd64/viorng.cat", Some win2k8r2_64; - "viorng/2k8R2/amd64/viorng.inf", Some win2k8r2_64; - "viorng/2k8R2/amd64/viorng.pdb", Some win2k8r2_64; - "viorng/2k8R2/amd64/viorng.sys", Some win2k8r2_64; - "viorng/2k8R2/amd64/viorngci.dll", None; - "viorng/2k8R2/amd64/viorngum.dll", None; - "viorng/w7/amd64/WdfCoInstaller01009.dll", None; - "viorng/w7/amd64/viorng.cat", Some win7_64; - "viorng/w7/amd64/viorng.inf", Some win7_64; - "viorng/w7/amd64/viorng.pdb", Some win7_64; - "viorng/w7/amd64/viorng.sys", Some win7_64; - "viorng/w7/amd64/viorngci.dll", None; - "viorng/w7/amd64/viorngum.dll", None; - "viorng/w7/x86/WdfCoInstaller01009.dll", None; - "viorng/w7/x86/viorng.cat", Some win7_32; - "viorng/w7/x86/viorng.inf", Some win7_32; - "viorng/w7/x86/viorng.pdb", Some win7_32; - "viorng/w7/x86/viorng.sys", Some win7_32; - "viorng/w7/x86/viorngci.dll", None; - "viorng/w7/x86/viorngum.dll", None; - "viorng/w8.1/amd64/WdfCoInstaller01011.dll", None; - "viorng/w8.1/amd64/viorng.cat", Some win8_1_64; - "viorng/w8.1/amd64/viorng.inf", Some win8_1_64; - "viorng/w8.1/amd64/viorng.pdb", Some win8_1_64; - "viorng/w8.1/amd64/viorng.sys", Some win8_1_64; - "viorng/w8.1/amd64/viorngci.dll", None; - "viorng/w8.1/amd64/viorngum.dll", None; - "viorng/w8.1/x86/WdfCoInstaller01011.dll", None; - "viorng/w8.1/x86/viorng.cat", Some win8_1_32; - "viorng/w8.1/x86/viorng.inf", Some win8_1_32; - "viorng/w8.1/x86/viorng.pdb", Some win8_1_32; - "viorng/w8.1/x86/viorng.sys", Some win8_1_32; - "viorng/w8.1/x86/viorngci.dll", None; - "viorng/w8.1/x86/viorngum.dll", None; - "viorng/w8/amd64/WdfCoInstaller01011.dll", None; - "viorng/w8/amd64/viorng.cat", Some win8_64; - "viorng/w8/amd64/viorng.inf", Some win8_64; - "viorng/w8/amd64/viorng.pdb", Some win8_64; - "viorng/w8/amd64/viorng.sys", Some win8_64; - "viorng/w8/amd64/viorngci.dll", None; - "viorng/w8/amd64/viorngum.dll", None; - "viorng/w8/x86/WdfCoInstaller01011.dll", None; - "viorng/w8/x86/viorng.cat", Some win8_32; - "viorng/w8/x86/viorng.inf", Some win8_32; - "viorng/w8/x86/viorng.pdb", Some win8_32; - "viorng/w8/x86/viorng.sys", Some win8_32; - "viorng/w8/x86/viorngci.dll", None; - "viorng/w8/x86/viorngum.dll", None; - "vioscsi/2k12/amd64/vioscsi.cat", Some win2k12_64; - "vioscsi/2k12/amd64/vioscsi.inf", Some win2k12_64; - "vioscsi/2k12/amd64/vioscsi.pdb", Some win2k12_64; - "vioscsi/2k12/amd64/vioscsi.sys", Some win2k12_64; - "vioscsi/2k12R2/amd64/vioscsi.cat", Some win2k12r2_64; - "vioscsi/2k12R2/amd64/vioscsi.inf", Some win2k12r2_64; - "vioscsi/2k12R2/amd64/vioscsi.pdb", Some win2k12r2_64; - "vioscsi/2k12R2/amd64/vioscsi.sys", Some win2k12r2_64; - "vioscsi/2k8/amd64/vioscsi.cat", Some win2k8_64; - "vioscsi/2k8/amd64/vioscsi.inf", Some win2k8_64; - "vioscsi/2k8/amd64/vioscsi.pdb", Some win2k8_64; - "vioscsi/2k8/amd64/vioscsi.sys", Some win2k8_64; - "vioscsi/2k8/x86/vioscsi.cat", Some win2k8_32; - "vioscsi/2k8/x86/vioscsi.inf", Some win2k8_32; - "vioscsi/2k8/x86/vioscsi.pdb", Some win2k8_32; - "vioscsi/2k8/x86/vioscsi.sys", Some win2k8_32; - "vioscsi/2k8R2/amd64/vioscsi.cat", Some win2k8r2_64; - "vioscsi/2k8R2/amd64/vioscsi.inf", Some win2k8r2_64; - "vioscsi/2k8R2/amd64/vioscsi.pdb", Some win2k8r2_64; - "vioscsi/2k8R2/amd64/vioscsi.sys", Some win2k8r2_64; - "vioscsi/w7/amd64/vioscsi.cat", Some win7_64; - "vioscsi/w7/amd64/vioscsi.inf", Some win7_64; - "vioscsi/w7/amd64/vioscsi.pdb", Some win7_64; - "vioscsi/w7/amd64/vioscsi.sys", Some win7_64; - "vioscsi/w7/x86/vioscsi.cat", Some win7_32; - "vioscsi/w7/x86/vioscsi.inf", Some win7_32; - "vioscsi/w7/x86/vioscsi.pdb", Some win7_32; - "vioscsi/w7/x86/vioscsi.sys", Some win7_32; - "vioscsi/w8.1/amd64/vioscsi.cat", Some win8_1_64; - "vioscsi/w8.1/amd64/vioscsi.inf", Some win8_1_64; - "vioscsi/w8.1/amd64/vioscsi.pdb", Some win8_1_64; - "vioscsi/w8.1/amd64/vioscsi.sys", Some win8_1_64; - "vioscsi/w8.1/x86/vioscsi.cat", Some win8_1_32; - "vioscsi/w8.1/x86/vioscsi.inf", Some win8_1_32; - "vioscsi/w8.1/x86/vioscsi.pdb", Some win8_1_32; - "vioscsi/w8.1/x86/vioscsi.sys", Some win8_1_32; - "vioscsi/w8/amd64/vioscsi.cat", Some win8_64; - "vioscsi/w8/amd64/vioscsi.inf", Some win8_64; - "vioscsi/w8/amd64/vioscsi.pdb", Some win8_64; - "vioscsi/w8/amd64/vioscsi.sys", Some win8_64; - "vioscsi/w8/x86/vioscsi.cat", Some win8_32; - "vioscsi/w8/x86/vioscsi.inf", Some win8_32; - "vioscsi/w8/x86/vioscsi.pdb", Some win8_32; - "vioscsi/w8/x86/vioscsi.sys", Some win8_32; - "vioserial/2k12/amd64/WdfCoInstaller01011.dll", None; - "vioserial/2k12/amd64/vioser.cat", Some win2k12_64; - "vioserial/2k12/amd64/vioser.inf", Some win2k12_64; - "vioserial/2k12/amd64/vioser.pdb", Some win2k12_64; - "vioserial/2k12/amd64/vioser.sys", Some win2k12_64; - "vioserial/2k12R2/amd64/WdfCoInstaller01011.dll", None; - "vioserial/2k12R2/amd64/vioser.cat", Some win2k12r2_64; - "vioserial/2k12R2/amd64/vioser.inf", Some win2k12r2_64; - "vioserial/2k12R2/amd64/vioser.pdb", Some win2k12r2_64; - "vioserial/2k12R2/amd64/vioser.sys", Some win2k12r2_64; - "vioserial/2k3/amd64/WdfCoInstaller01009.dll", None; - "vioserial/2k3/amd64/vioser.cat", Some win2k3_64; - "vioserial/2k3/amd64/vioser.inf", Some win2k3_64; - "vioserial/2k3/amd64/vioser.pdb", Some win2k3_64; - "vioserial/2k3/amd64/vioser.sys", Some win2k3_64; - "vioserial/2k3/x86/WdfCoInstaller01009.dll", None; - "vioserial/2k3/x86/vioser.cat", Some win2k3_32; - "vioserial/2k3/x86/vioser.inf", Some win2k3_32; - "vioserial/2k3/x86/vioser.pdb", Some win2k3_32; - "vioserial/2k3/x86/vioser.sys", Some win2k3_32; - "vioserial/2k8/amd64/WdfCoInstaller01009.dll", None; - "vioserial/2k8/amd64/vioser.cat", Some win2k8_64; - "vioserial/2k8/amd64/vioser.inf", Some win2k8_64; - "vioserial/2k8/amd64/vioser.pdb", Some win2k8_64; - "vioserial/2k8/amd64/vioser.sys", Some win2k8_64; - "vioserial/2k8/x86/WdfCoInstaller01009.dll", None; - "vioserial/2k8/x86/vioser.cat", Some win2k8_32; - "vioserial/2k8/x86/vioser.inf", Some win2k8_32; - "vioserial/2k8/x86/vioser.pdb", Some win2k8_32; - "vioserial/2k8/x86/vioser.sys", Some win2k8_32; - "vioserial/2k8R2/amd64/WdfCoInstaller01009.dll", None; - "vioserial/2k8R2/amd64/vioser.cat", Some win2k8r2_64; - "vioserial/2k8R2/amd64/vioser.inf", Some win2k8r2_64; - "vioserial/2k8R2/amd64/vioser.pdb", Some win2k8r2_64; - "vioserial/2k8R2/amd64/vioser.sys", Some win2k8r2_64; - "vioserial/w7/amd64/WdfCoInstaller01009.dll", None; - "vioserial/w7/amd64/vioser.cat", Some win7_64; - "vioserial/w7/amd64/vioser.inf", Some win7_64; - "vioserial/w7/amd64/vioser.pdb", Some win7_64; - "vioserial/w7/amd64/vioser.sys", Some win7_64; - "vioserial/w7/x86/WdfCoInstaller01009.dll", None; - "vioserial/w7/x86/vioser.cat", Some win7_32; - "vioserial/w7/x86/vioser.inf", Some win7_32; - "vioserial/w7/x86/vioser.pdb", Some win7_32; - "vioserial/w7/x86/vioser.sys", Some win7_32; - "vioserial/w8.1/amd64/WdfCoInstaller01011.dll", None; - "vioserial/w8.1/amd64/vioser.cat", Some win8_1_64; - "vioserial/w8.1/amd64/vioser.inf", Some win8_1_64; - "vioserial/w8.1/amd64/vioser.pdb", Some win8_1_64; - "vioserial/w8.1/amd64/vioser.sys", Some win8_1_64; - "vioserial/w8.1/x86/WdfCoInstaller01011.dll", None; - "vioserial/w8.1/x86/vioser.cat", Some win8_1_32; - "vioserial/w8.1/x86/vioser.inf", Some win8_1_32; - "vioserial/w8.1/x86/vioser.pdb", Some win8_1_32; - "vioserial/w8.1/x86/vioser.sys", Some win8_1_32; - "vioserial/w8/amd64/WdfCoInstaller01011.dll", None; - "vioserial/w8/amd64/vioser.cat", Some win8_64; - "vioserial/w8/amd64/vioser.inf", Some win8_64; - "vioserial/w8/amd64/vioser.pdb", Some win8_64; - "vioserial/w8/amd64/vioser.sys", Some win8_64; - "vioserial/w8/x86/WdfCoInstaller01011.dll", None; - "vioserial/w8/x86/vioser.cat", Some win8_32; - "vioserial/w8/x86/vioser.inf", Some win8_32; - "vioserial/w8/x86/vioser.pdb", Some win8_32; - "vioserial/w8/x86/vioser.sys", Some win8_32; - "vioserial/xp/x86/WdfCoInstaller01009.dll", None; - "vioserial/xp/x86/vioser.cat", Some winxp_32; - "vioserial/xp/x86/vioser.inf", Some winxp_32; - "vioserial/xp/x86/vioser.pdb", Some winxp_32; - "vioserial/xp/x86/vioser.sys", Some winxp_32; - "viostor/2k12/amd64/viostor.cat", Some win2k12_64; - "viostor/2k12/amd64/viostor.inf", Some win2k12_64; - "viostor/2k12/amd64/viostor.pdb", Some win2k12_64; - "viostor/2k12/amd64/viostor.sys", Some win2k12_64; - "viostor/2k12R2/amd64/viostor.cat", Some win2k12r2_64; - "viostor/2k12R2/amd64/viostor.inf", Some win2k12r2_64; - "viostor/2k12R2/amd64/viostor.pdb", Some win2k12r2_64; - "viostor/2k12R2/amd64/viostor.sys", Some win2k12r2_64; - "viostor/2k3/amd64/viostor.cat", Some win2k3_64; - "viostor/2k3/amd64/viostor.inf", Some win2k3_64; - "viostor/2k3/amd64/viostor.pdb", Some win2k3_64; - "viostor/2k3/amd64/viostor.sys", Some win2k3_64; - "viostor/2k3/x86/viostor.cat", Some win2k3_32; - "viostor/2k3/x86/viostor.inf", Some win2k3_32; - "viostor/2k3/x86/viostor.pdb", Some win2k3_32; - "viostor/2k3/x86/viostor.sys", Some win2k3_32; - "viostor/2k8/amd64/viostor.cat", Some win2k8_64; - "viostor/2k8/amd64/viostor.inf", Some win2k8_64; - "viostor/2k8/amd64/viostor.pdb", Some win2k8_64; - "viostor/2k8/amd64/viostor.sys", Some win2k8_64; - "viostor/2k8/x86/viostor.cat", Some win2k8_32; - "viostor/2k8/x86/viostor.inf", Some win2k8_32; - "viostor/2k8/x86/viostor.pdb", Some win2k8_32; - "viostor/2k8/x86/viostor.sys", Some win2k8_32; - "viostor/2k8R2/amd64/viostor.cat", Some win2k8r2_64; - "viostor/2k8R2/amd64/viostor.inf", Some win2k8r2_64; - "viostor/2k8R2/amd64/viostor.pdb", Some win2k8r2_64; - "viostor/2k8R2/amd64/viostor.sys", Some win2k8r2_64; - "viostor/w7/amd64/viostor.cat", Some win7_64; - "viostor/w7/amd64/viostor.inf", Some win7_64; - "viostor/w7/amd64/viostor.pdb", Some win7_64; - "viostor/w7/amd64/viostor.sys", Some win7_64; - "viostor/w7/x86/viostor.cat", Some win7_32; - "viostor/w7/x86/viostor.inf", Some win7_32; - "viostor/w7/x86/viostor.pdb", Some win7_32; - "viostor/w7/x86/viostor.sys", Some win7_32; - "viostor/w8.1/amd64/viostor.cat", Some win8_1_64; - "viostor/w8.1/amd64/viostor.inf", Some win8_1_64; - "viostor/w8.1/amd64/viostor.pdb", Some win8_1_64; - "viostor/w8.1/amd64/viostor.sys", Some win8_1_64; - "viostor/w8.1/x86/viostor.cat", Some win8_1_32; - "viostor/w8.1/x86/viostor.inf", Some win8_1_32; - "viostor/w8.1/x86/viostor.pdb", Some win8_1_32; - "viostor/w8.1/x86/viostor.sys", Some win8_1_32; - "viostor/w8/amd64/viostor.cat", Some win8_64; - "viostor/w8/amd64/viostor.inf", Some win8_64; - "viostor/w8/amd64/viostor.pdb", Some win8_64; - "viostor/w8/amd64/viostor.sys", Some win8_64; - "viostor/w8/x86/viostor.cat", Some win8_32; - "viostor/w8/x86/viostor.inf", Some win8_32; - "viostor/w8/x86/viostor.pdb", Some win8_32; - "viostor/w8/x86/viostor.sys", Some win8_32; - "viostor/xp/x86/viostor.cat", Some winxp_32; - "viostor/xp/x86/viostor.inf", Some winxp_32; - "viostor/xp/x86/viostor.pdb", Some winxp_32; - "viostor/xp/x86/viostor.sys", Some winxp_32; - "virtio-win-1.7.4_amd64.vfd", None; - "virtio-win-1.7.4_x86.vfd", None; - "virtio-win_license.txt", None; + (* Paths relative to $srcdir/test-data/fake-virtio-win. *) + "cd/Balloon/2k12/amd64/balloon.inf", Some win2k12_64; + "cd/Balloon/2k12R2/amd64/balloon.inf", Some win2k12r2_64; + "cd/Balloon/2k3/amd64/balloon.inf", Some win2k3_64; + "cd/Balloon/2k3/x86/balloon.inf", Some win2k3_32; + "cd/Balloon/2k8/amd64/balloon.inf", Some win2k8_64; + "cd/Balloon/2k8/x86/balloon.inf", Some win2k8_32; + "cd/Balloon/2k8R2/amd64/balloon.inf", Some win2k8r2_64; + "cd/Balloon/w7/amd64/balloon.inf", Some win7_64; + "cd/Balloon/w7/x86/balloon.inf", Some win7_32; + "cd/Balloon/w8.1/amd64/balloon.inf", Some win8_1_64; + "cd/Balloon/w8.1/x86/balloon.inf", Some win8_1_32; + "cd/Balloon/w8/amd64/balloon.inf", Some win8_64; + "cd/Balloon/w8/x86/balloon.inf", Some win8_32; + "cd/Balloon/xp/x86/balloon.inf", Some winxp_32; + "cd/NetKVM/2k12/amd64/netkvm.inf", Some win2k12_64; + "cd/NetKVM/2k12R2/amd64/netkvm.inf", Some win2k12r2_64; + "cd/NetKVM/2k3/amd64/netkvm.inf", Some win2k3_64; + "cd/NetKVM/2k3/x86/netkvm.inf", Some win2k3_32; + "cd/NetKVM/2k8/amd64/netkvm.inf", Some win2k8_64; + "cd/NetKVM/2k8/x86/netkvm.inf", Some win2k8_32; + "cd/NetKVM/2k8R2/amd64/netkvm.inf", Some win2k8r2_64; + "cd/NetKVM/w7/amd64/netkvm.inf", Some win7_64; + "cd/NetKVM/w7/x86/netkvm.inf", Some win7_32; + "cd/NetKVM/w8.1/amd64/netkvm.inf", Some win8_1_64; + "cd/NetKVM/w8.1/x86/netkvm.inf", Some win8_1_32; + "cd/NetKVM/w8/amd64/netkvm.inf", Some win8_64; + "cd/NetKVM/w8/x86/netkvm.inf", Some win8_32; + "cd/NetKVM/xp/x86/netkvm.inf", Some winxp_32; + "cd/qemupciserial/qemupciserial.inf", None; + "cd/viorng/2k12/amd64/viorng.inf", Some win2k12_64; + "cd/viorng/2k12R2/amd64/viorng.inf", Some win2k12r2_64; + "cd/viorng/2k8/amd64/viorng.inf", Some win2k8_64; + "cd/viorng/2k8/x86/viorng.inf", Some win2k8_32; + "cd/viorng/2k8R2/amd64/viorng.inf", Some win2k8r2_64; + "cd/viorng/w7/amd64/viorng.inf", Some win7_64; + "cd/viorng/w7/x86/viorng.inf", Some win7_32; + "cd/viorng/w8.1/amd64/viorng.inf", Some win8_1_64; + "cd/viorng/w8.1/x86/viorng.inf", Some win8_1_32; + "cd/viorng/w8/amd64/viorng.inf", Some win8_64; + "cd/viorng/w8/x86/viorng.inf", Some win8_32; + "cd/vioscsi/2k12/amd64/vioscsi.inf", Some win2k12_64; + "cd/vioscsi/2k12R2/amd64/vioscsi.inf", Some win2k12r2_64; + "cd/vioscsi/2k8/amd64/vioscsi.inf", Some win2k8_64; + "cd/vioscsi/2k8/x86/vioscsi.inf", Some win2k8_32; + "cd/vioscsi/2k8R2/amd64/vioscsi.inf", Some win2k8r2_64; + "cd/vioscsi/w7/amd64/vioscsi.inf", Some win7_64; + "cd/vioscsi/w7/x86/vioscsi.inf", Some win7_32; + "cd/vioscsi/w8.1/amd64/vioscsi.inf", Some win8_1_64; + "cd/vioscsi/w8.1/x86/vioscsi.inf", Some win8_1_32; + "cd/vioscsi/w8/amd64/vioscsi.inf", Some win8_64; + "cd/vioscsi/w8/x86/vioscsi.inf", Some win8_32; + "cd/vioserial/2k12/amd64/vioser.inf", Some win2k12_64; + "cd/vioserial/2k12R2/amd64/vioser.inf", Some win2k12r2_64; + "cd/vioserial/2k3/amd64/vioser.inf", Some win2k3_64; + "cd/vioserial/2k3/x86/vioser.inf", Some win2k3_32; + "cd/vioserial/2k8/amd64/vioser.inf", Some win2k8_64; + "cd/vioserial/2k8/x86/vioser.inf", Some win2k8_32; + "cd/vioserial/2k8R2/amd64/vioser.inf", Some win2k8r2_64; + "cd/vioserial/w7/amd64/vioser.inf", Some win7_64; + "cd/vioserial/w7/x86/vioser.inf", Some win7_32; + "cd/vioserial/w8.1/amd64/vioser.inf", Some win8_1_64; + "cd/vioserial/w8.1/x86/vioser.inf", Some win8_1_32; + "cd/vioserial/w8/amd64/vioser.inf", Some win8_64; + "cd/vioserial/w8/x86/vioser.inf", Some win8_32; + "cd/vioserial/w8/x86/vioser.pdb", Some win8_32; + "cd/vioserial/xp/x86/vioser.inf", Some winxp_32; + "cd/viostor/2k12/amd64/viostor.inf", Some win2k12_64; + "cd/viostor/2k12R2/amd64/viostor.inf", Some win2k12r2_64; + "cd/viostor/2k3/amd64/viostor.inf", Some win2k3_64; + "cd/viostor/2k3/x86/viostor.inf", Some win2k3_32; + "cd/viostor/2k8/amd64/viostor.inf", Some win2k8_64; + "cd/viostor/2k8/x86/viostor.inf", Some win2k8_32; + "cd/viostor/2k8R2/amd64/viostor.inf", Some win2k8r2_64; + "cd/viostor/w7/amd64/viostor.inf", Some win7_64; + "cd/viostor/w7/x86/viostor.inf", Some win7_32; + "cd/viostor/w8.1/amd64/viostor.inf", Some win8_1_64; + "cd/viostor/w8.1/x86/viostor.inf", Some win8_1_32; + "cd/viostor/w8/amd64/viostor.inf", Some win8_64; + "cd/viostor/w8/x86/viostor.inf", Some win8_32; + "cd/viostor/xp/x86/viostor.inf", Some winxp_32; - (* Paths from the unpacked virtio-win 1.7.4 directory. *) - "virtio-win-1.7.4.iso", None; - "virtio-win-1.7.4_amd64.vfd", None; - "guest-agent/qemu-ga-x86.msi", None; - "guest-agent/qemu-ga-x64.msi", None; "drivers/i386/Win8.1/viostor.inf", Some win8_1_32; - "drivers/i386/Win8.1/viostor.sys", Some win8_1_32; - "drivers/i386/Win8.1/vioscsi.cat", Some win8_1_32; "drivers/i386/Win8.1/netkvm.inf", Some win8_1_32; - "drivers/i386/Win8.1/netkvm.sys", Some win8_1_32; - "drivers/i386/Win8.1/viostor.cat", Some win8_1_32; - "drivers/i386/Win8.1/vioscsi.sys", Some win8_1_32; - "drivers/i386/Win8.1/netkvm.cat", Some win8_1_32; "drivers/i386/Win8.1/vioscsi.inf", Some win8_1_32; "drivers/i386/Win2008/viostor.inf", Some win2k8_32; - "drivers/i386/Win2008/viostor.sys", Some win2k8_32; - "drivers/i386/Win2008/vioscsi.cat", Some win2k8_32; "drivers/i386/Win2008/netkvm.inf", Some win2k8_32; - "drivers/i386/Win2008/netkvm.sys", Some win2k8_32; - "drivers/i386/Win2008/viostor.cat", Some win2k8_32; - "drivers/i386/Win2008/vioscsi.sys", Some win2k8_32; - "drivers/i386/Win2008/netkvm.cat", Some win2k8_32; "drivers/i386/Win2008/vioscsi.inf", Some win2k8_32; "drivers/i386/Win7/viostor.inf", Some win7_32; - "drivers/i386/Win7/viostor.sys", Some win7_32; - "drivers/i386/Win7/qxldd.dll", None; - "drivers/i386/Win7/qxl.sys", Some win7_32; - "drivers/i386/Win7/vioscsi.cat", Some win7_32; "drivers/i386/Win7/netkvm.inf", Some win7_32; - "drivers/i386/Win7/netkvm.sys", Some win7_32; - "drivers/i386/Win7/viostor.cat", Some win7_32; "drivers/i386/Win7/qxl.inf", Some win7_32; - "drivers/i386/Win7/vioscsi.sys", Some win7_32; - "drivers/i386/Win7/qxl.cat", Some win7_32; - "drivers/i386/Win7/netkvm.cat", Some win7_32; "drivers/i386/Win7/vioscsi.inf", Some win7_32; "drivers/i386/Win2003/viostor.inf", Some win2k3_32; - "drivers/i386/Win2003/viostor.sys", Some win2k3_32; "drivers/i386/Win2003/netkvm.inf", Some win2k3_32; - "drivers/i386/Win2003/netkvm.sys", Some win2k3_32; - "drivers/i386/Win2003/viostor.cat", Some win2k3_32; - "drivers/i386/Win2003/netkvm.cat", Some win2k3_32; "drivers/i386/Win8/viostor.inf", Some win8_32; - "drivers/i386/Win8/viostor.sys", Some win8_32; - "drivers/i386/Win8/vioscsi.cat", Some win8_32; "drivers/i386/Win8/netkvm.inf", Some win8_32; - "drivers/i386/Win8/netkvm.sys", Some win8_32; - "drivers/i386/Win8/viostor.cat", Some win8_32; - "drivers/i386/Win8/vioscsi.sys", Some win8_32; - "drivers/i386/Win8/netkvm.cat", Some win8_32; "drivers/i386/Win8/vioscsi.inf", Some win8_32; "drivers/i386/WinXP/viostor.inf", Some winxp_32; - "drivers/i386/WinXP/viostor.sys", Some winxp_32; - "drivers/i386/WinXP/qxldd.dll", None; - "drivers/i386/WinXP/qxl.sys", Some winxp_32; "drivers/i386/WinXP/netkvm.inf", Some winxp_32; - "drivers/i386/WinXP/netkvm.sys", Some winxp_32; - "drivers/i386/WinXP/viostor.cat", Some winxp_32; "drivers/i386/WinXP/qxl.inf", Some winxp_32; - "drivers/i386/WinXP/qxl.cat", Some winxp_32; - "drivers/i386/WinXP/netkvm.cat", Some winxp_32; "drivers/amd64/Win8.1/viostor.inf", Some win8_1_64; - "drivers/amd64/Win8.1/viostor.sys", Some win8_1_64; - "drivers/amd64/Win8.1/vioscsi.cat", Some win8_1_64; "drivers/amd64/Win8.1/netkvm.inf", Some win8_1_64; - "drivers/amd64/Win8.1/netkvm.sys", Some win8_1_64; - "drivers/amd64/Win8.1/viostor.cat", Some win8_1_64; - "drivers/amd64/Win8.1/vioscsi.sys", Some win8_1_64; - "drivers/amd64/Win8.1/netkvm.cat", Some win8_1_64; "drivers/amd64/Win8.1/vioscsi.inf", Some win8_1_64; "drivers/amd64/Win2008/viostor.inf", Some win2k8_64; - "drivers/amd64/Win2008/viostor.sys", Some win2k8_64; - "drivers/amd64/Win2008/vioscsi.cat", Some win2k8_64; "drivers/amd64/Win2008/netkvm.inf", Some win2k8_64; - "drivers/amd64/Win2008/netkvm.sys", Some win2k8_64; - "drivers/amd64/Win2008/viostor.cat", Some win2k8_64; - "drivers/amd64/Win2008/vioscsi.sys", Some win2k8_64; - "drivers/amd64/Win2008/netkvm.cat", Some win2k8_64; "drivers/amd64/Win2008/vioscsi.inf", Some win2k8_64; "drivers/amd64/Win7/viostor.inf", Some win7_64; - "drivers/amd64/Win7/viostor.sys", Some win7_64; - "drivers/amd64/Win7/qxldd.dll", None; - "drivers/amd64/Win7/qxl.sys", Some win7_64; - "drivers/amd64/Win7/vioscsi.cat", Some win7_64; "drivers/amd64/Win7/netkvm.inf", Some win7_64; - "drivers/amd64/Win7/netkvm.sys", Some win7_64; - "drivers/amd64/Win7/viostor.cat", Some win7_64; "drivers/amd64/Win7/qxl.inf", Some win7_64; - "drivers/amd64/Win7/vioscsi.sys", Some win7_64; - "drivers/amd64/Win7/qxl.cat", Some win7_64; - "drivers/amd64/Win7/netkvm.cat", Some win7_64; "drivers/amd64/Win7/vioscsi.inf", Some win7_64; "drivers/amd64/Win2003/viostor.inf", Some win2k3_64; - "drivers/amd64/Win2003/viostor.sys", Some win2k3_64; "drivers/amd64/Win2003/netkvm.inf", Some win2k3_64; - "drivers/amd64/Win2003/netkvm.sys", Some win2k3_64; - "drivers/amd64/Win2003/viostor.cat", Some win2k3_64; - "drivers/amd64/Win2003/netkvm.cat", Some win2k3_64; "drivers/amd64/Win8/viostor.inf", Some win8_64; - "drivers/amd64/Win8/viostor.sys", Some win8_64; - "drivers/amd64/Win8/vioscsi.cat", Some win8_64; "drivers/amd64/Win8/netkvm.inf", Some win8_64; - "drivers/amd64/Win8/netkvm.sys", Some win8_64; - "drivers/amd64/Win8/viostor.cat", Some win8_64; - "drivers/amd64/Win8/vioscsi.sys", Some win8_64; - "drivers/amd64/Win8/netkvm.cat", Some win8_64; "drivers/amd64/Win8/vioscsi.inf", Some win8_64; "drivers/amd64/Win2012/viostor.inf", Some win2k12_64; - "drivers/amd64/Win2012/viostor.sys", Some win2k12_64; - "drivers/amd64/Win2012/vioscsi.cat", Some win2k12_64; "drivers/amd64/Win2012/netkvm.inf", Some win2k12_64; - "drivers/amd64/Win2012/netkvm.sys", Some win2k12_64; - "drivers/amd64/Win2012/viostor.cat", Some win2k12_64; - "drivers/amd64/Win2012/vioscsi.sys", Some win2k12_64; - "drivers/amd64/Win2012/netkvm.cat", Some win2k12_64; "drivers/amd64/Win2012/vioscsi.inf", Some win2k12_64; "drivers/amd64/Win2008R2/viostor.inf", Some win2k8r2_64; - "drivers/amd64/Win2008R2/viostor.sys", Some win2k8r2_64; - "drivers/amd64/Win2008R2/qxldd.dll", None; - "drivers/amd64/Win2008R2/qxl.sys", Some win2k8r2_64; - "drivers/amd64/Win2008R2/vioscsi.cat", Some win2k8r2_64; "drivers/amd64/Win2008R2/netkvm.inf", Some win2k8r2_64; - "drivers/amd64/Win2008R2/netkvm.sys", Some win2k8r2_64; - "drivers/amd64/Win2008R2/viostor.cat", Some win2k8r2_64; "drivers/amd64/Win2008R2/qxl.inf", Some win2k8r2_64; - "drivers/amd64/Win2008R2/vioscsi.sys", Some win2k8r2_64; - "drivers/amd64/Win2008R2/qxl.cat", Some win2k8r2_64; - "drivers/amd64/Win2008R2/netkvm.cat", Some win2k8r2_64; "drivers/amd64/Win2008R2/vioscsi.inf", Some win2k8r2_64; "drivers/amd64/Win2012R2/viostor.inf", Some win2k12r2_64; - "drivers/amd64/Win2012R2/viostor.sys", Some win2k12r2_64; - "drivers/amd64/Win2012R2/vioscsi.cat", Some win2k12r2_64; "drivers/amd64/Win2012R2/netkvm.inf", Some win2k12r2_64; - "drivers/amd64/Win2012R2/netkvm.sys", Some win2k12r2_64; - "drivers/amd64/Win2012R2/viostor.cat", Some win2k12r2_64; - "drivers/amd64/Win2012R2/vioscsi.sys", Some win2k12r2_64; - "drivers/amd64/Win2012R2/netkvm.cat", Some win2k12r2_64; "drivers/amd64/Win2012R2/vioscsi.inf", Some win2k12r2_64; - "virtio-win-1.7.4_x86.vfd", None; ] in - (* Test each path against each version of Windows. *) + (* Test each inf file against each version of Windows. *) let printer = string_of_bool in List.iter ( fun (path, correct_windows) -> + let path = srcdir // ".." // "test-data" // "fake-virtio-win" // path in + match correct_windows with | None -> List.iter ( fun win -> let msg = sprintf "path %s should not match %s" path win.i_product_name in + let content = read_whole_file path in assert_equal ~printer ~msg false - (Windows.UNIT_TESTS.virtio_iso_path_matches_guest_os path win) + (Windows.UNIT_TESTS.virtio_inf_matches_guest_os content path win) ) all_windows | Some correct_windows -> List.iter ( @@ -859,8 +417,9 @@ let test_virtio_iso_path_matches_guest_os ctx = else sprintf "path %s should not match %s" path win.i_product_name in + let content = read_whole_file path in assert_equal ~printer ~msg expected - (Windows.UNIT_TESTS.virtio_iso_path_matches_guest_os path win) + (Windows.UNIT_TESTS.virtio_inf_matches_guest_os content path win) ) all_windows ) paths @@ -872,8 +431,8 @@ let suite = "Utils.drive_name" >:: test_drive_name; "Utils.drive_index" >:: test_drive_index; "Windows_inf.of_string" >:: test_windows_inf_of_string; - "Windows.virtio_iso_path_matches_guest_os" >:: - test_virtio_iso_path_matches_guest_os; + "Windows.virtio_inf_matches_guest_os" >:: + test_virtio_inf_matches_guest_os; ] let () = diff --git a/v2v/windows.ml b/v2v/windows.ml index 6503b57..2e18307 100644 --- a/v2v/windows.ml +++ b/v2v/windows.ml @@ -50,128 +50,185 @@ and (=~) str rex = (* Copy the matching drivers to the driverdir; return true if any have * been copied. *) +type virtio_win_source = + | Virtio_Win_Directory + | Virtio_Win_ISO of Guestfs.guestfs + let rec copy_virtio_drivers g inspect virtio_win driverdir = - let ret = ref false in - if is_directory virtio_win then ( - let cmd = sprintf "cd %s && find -type f" (quote virtio_win) in - let paths = external_command cmd in - List.iter ( - fun path -> - if virtio_iso_path_matches_guest_os path inspect then ( - let source = virtio_win // path in - let target = driverdir // - String.lowercase_ascii (Filename.basename path) in - if verbose () then - printf "Copying virtio driver bits: 'host:%s' -> '%s'\n" - source target; - - g#write target (read_whole_file source); - ret := true - ) - ) paths - ) - else if is_regular_file virtio_win then ( - try - let g2 = open_guestfs ~identifier:"virtio_win" () in - g2#add_drive_opts virtio_win ~readonly:true; - g2#launch (); - let vio_root = "/" in - g2#mount_ro "/dev/sda" vio_root; - let paths = g2#find vio_root in - Array.iter ( - fun path -> - let source = vio_root // path in - if g2#is_file source ~followsymlinks:false && - virtio_iso_path_matches_guest_os path inspect then ( - let target = driverdir // - String.lowercase_ascii (Filename.basename path) in - if verbose () then - printf "Copying virtio driver bits: '%s:%s' -> '%s'\n" - virtio_win path target; - - g#write target (g2#read_file source); - ret := true - ) - ) paths; - g2#close() - with Guestfs.Error msg -> - error (f_"%s: cannot open virtio-win ISO file: %s") virtio_win msg - ); - !ret - -(* Given a path of a file relative to the root of the directory tree - * with virtio-win drivers, figure out if it's suitable for the - * specific Windows flavor of the current guest. + (* Does $VIRTIO_WIN point to a directory or an ISO file? *) + let virtio_win_source = + if is_directory virtio_win then + Some Virtio_Win_Directory + else if is_regular_file virtio_win then ( + try + let g2 = open_guestfs ~identifier:"virtio_win" () in + g2#add_drive_opts virtio_win ~readonly:true; + g2#launch (); + g2#mount_ro "/dev/sda" "/"; + Some (Virtio_Win_ISO g2) + with Guestfs.Error msg -> + error (f_"%s: cannot open virtio-win ISO file: %s") virtio_win msg + ) else + None in + + match virtio_win_source with + | None -> + (* [$VIRTIO_WIN] does not point to a directory or regular file. This + * is not an error, but at the same time, no drivers were copied + * so we return [false] here. + *) + false + + | Some virtio_win_source -> + (* Find and load all the *.inf files from the virtio-win directory + * or ISO. Returns a list of pairs [(inf_content, inf_name, directory)] + * where [inf_content] is the unparsed inf file, [inf_name] is a debug + * string we can use in error messages to refer to the inf file, + * and [directory] is a string used to track the directory containing + * the inf file. + *) + let inf_files : (string * string * string) list = + match virtio_win_source with + | Virtio_Win_Directory -> + let cmd = + sprintf "find %s -name '*.inf' -type f" (quote virtio_win) in + let paths = external_command cmd in + List.map (fun path -> + read_whole_file path, path, Filename.dirname path) paths + | Virtio_Win_ISO g2 -> + let paths = g2#find "/" in + let paths = Array.to_list paths in + let paths = + List.filter ( + fun path -> + String.is_suffix path ".inf" && + g2#is_file path ~followsymlinks:false + ) paths in + List.map ( + fun path -> + let path = "/" ^ path in + let i = String.rindex path '/' in + let dir = String.sub path 0 i in + g2#read_file path, sprintf "%s:%s" virtio_win path, dir + ) paths in + + (* Get only the *.inf files which match the operating system. *) + let inf_files = + List.filter ( + fun (inf_content, inf_name, directory) -> + virtio_inf_matches_guest_os inf_content inf_name inspect + ) inf_files in + + (* If a directory contains any matching *.inf file, then we will + * copy all the files from that directory. So get the unique list + * of directories that we will copy. + *) + let directories = List.map (fun (_,_,dir) -> dir) inf_files in + let directories = sort_uniq directories in + + (* Copy the directories. *) + List.iter ( + fun dir -> + match virtio_win_source with + | Virtio_Win_Directory -> copy_host_directory dir g driverdir + | Virtio_Win_ISO g2 -> copy_iso_directory g2 dir g driverdir + ) directories; + + (* Return true if some drivers were copied. *) + directories <> [] + +(* Copy host files in same directory as inf_path to driverdir. *) +and copy_host_directory dir g driverdir = + g#copy_in dir driverdir + +(* Copy files from ISO in same directory as inf_path to driverdir. *) +and copy_iso_directory g2 dir g driverdir = + let files = g2#find dir in + let files = Array.to_list files in + assert (files <> []); (* at least the .inf file must be here *) + + List.iter ( + fun filename -> + let content = g2#read_file (dir ^ filename) in + g#write (driverdir ^ "/" ^ filename) content + ) files + +(* Given the content of a [*.inf] file from the virtio-win drivers, + * figure out if it's suitable for the specific Windows flavor of the + * current guest. + *) +and virtio_inf_matches_guest_os inf_content inf_name inspect = + let sections = Windows_inf.of_string inf_content in + + (* Try to find the [Version] / DriverVer. *) + let driver_ver = parse_driver_ver inf_name sections in + + (* Try to find the [Manufacturer] line. *) + let driver_arch = parse_manufacturer inf_name sections in + + (* If we got both, we can continue, else give up. *) + match driver_ver, driver_arch with + | None, None | Some _, None | None, Some _ -> false + | Some driver_ver, Some driver_arch -> + (* XXX This ignores i_product_variant. However that may not matter. + * There appears to be no material difference in the inf file. + *) + let { Types.i_major_version = major; i_minor_version = minor; + i_arch = arch } = inspect in + + let ver = major * 10 + minor in + + driver_ver = ver && driver_arch = arch + +(* Find the [Version] section in the [*.inf] file, and find the + * [DriverVer] from that, and parse it. Returns [None] if we couldn't + * find / parse it. + * Reference: https://www.redhat.com/archives/libguestfs/2015-October/msg00352.html *) -and virtio_iso_path_matches_guest_os path inspect = - let { Types.i_major_version = os_major; i_minor_version = os_minor; - i_arch = arch; i_product_variant = os_variant } = inspect in +and parse_driver_ver inf_name sections = try - (* Lowercased path, since the ISO may contain upper or lowercase path - * elements. - *) - let lc_path = String.lowercase_ascii path in - let lc_basename = Filename.basename path in - - let extension = - match last_part_of lc_basename '.' with - | Some x -> x - | None -> raise Not_found - in - - (* Skip files without specific extensions. *) - let extensions = ["cat"; "inf"; "pdb"; "sys"] in - if not (List.mem extension extensions) then raise Not_found; - - (* Using the full path, work out what version of Windows - * this driver is for. Paths can be things like: - * "NetKVM/2k12R2/amd64/netkvm.sys" or - * "./drivers/amd64/Win2012R2/netkvm.sys". - * Note we check lowercase paths. - *) - let pathelem elem = String.find lc_path ("/" ^ elem ^ "/") >= 0 in - let p_arch = - if pathelem "x86" || pathelem "i386" then "i386" - else if pathelem "amd64" then "x86_64" - else raise Not_found in - - let is_client os_variant = os_variant = "Client" - and not_client os_variant = os_variant <> "Client" - and any_variant os_variant = true in - let p_os_major, p_os_minor, match_os_variant = - if pathelem "xp" || pathelem "winxp" then - (5, 1, any_variant) - else if pathelem "2k3" || pathelem "win2003" then - (5, 2, any_variant) - else if pathelem "vista" then - (6, 0, is_client) - else if pathelem "2k8" || pathelem "win2008" then - (6, 0, not_client) - else if pathelem "w7" || pathelem "win7" then - (6, 1, is_client) - else if pathelem "2k8r2" || pathelem "win2008r2" then - (6, 1, not_client) - else if pathelem "w8" || pathelem "win8" then - (6, 2, is_client) - else if pathelem "2k12" || pathelem "win2012" then - (6, 2, not_client) - else if pathelem "w8.1" || pathelem "win8.1" then - (6, 3, is_client) - else if pathelem "2k12r2" || pathelem "win2012r2" then - (6, 3, not_client) - else if pathelem "w10" || pathelem "win10" then - (10, 0, is_client) - else - raise Not_found in - - arch = p_arch && os_major = p_os_major && os_minor = p_os_minor && - match_os_variant os_variant - - with Not_found -> false + let driver_ver = Windows_inf.find_key sections "Version" "DriverVer" in + if Str.string_match driver_ver_rex driver_ver 0 then + Some (int_of_string (Str.matched_group 1 driver_ver)) + else + raise Not_found + with + Not_found -> + warning (f_"%s: could not find or parse the [Version] DriverVer key in the Windows inf file") + inf_name; + None + +and driver_ver_rex = + Str.regexp "[0-9/]+,\\([0-9]+\\)" + +(* Find the [Manufacturer] section and try to find the first line. + * There is no consistent naming of this line unfortunately. + * Reference: https://www.redhat.com/archives/libguestfs/2015-November/msg00065.html + *) +and parse_manufacturer inf_name sections = + try + let lines = Windows_inf.find_section sections "Manufacturer" in + match lines with + | [] -> raise Not_found + | (_, manufacturer) :: _ -> + if Str.string_match manufacturer_rex manufacturer 0 then ( + let arch = Str.matched_group 1 manufacturer in + if arch = "x86" || arch = "X86" then Some "i386" else Some "x86_64" + ) + else + raise Not_found + with + Not_found -> + warning (f_"%s: could not find or parse the [Manufacturer] section in the Windows inf file") + inf_name; + None + +and manufacturer_rex = + Str.regexp_case_fold ".*,NT\\(x86\\|amd64\\)" (* The following function is only exported for unit tests. *) module UNIT_TESTS = struct - let virtio_iso_path_matches_guest_os = virtio_iso_path_matches_guest_os + let virtio_inf_matches_guest_os = virtio_inf_matches_guest_os end (* This is a wrapper that handles opening and closing the hive diff --git a/v2v/windows.mli b/v2v/windows.mli index 863a605..4098b27 100644 --- a/v2v/windows.mli +++ b/v2v/windows.mli @@ -45,5 +45,5 @@ val get_node : Guestfs.guestfs -> int64 -> string list -> int64 option (* The following function is only exported for unit tests. *) module UNIT_TESTS : sig - val virtio_iso_path_matches_guest_os : string -> Types.inspect -> bool + val virtio_inf_matches_guest_os : string -> string -> Types.inspect -> bool end -- 2.5.0 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs