[Libguestfs] [PATCH 3/3] v2v: windows: Use '*.inf' files to control how Windows drivers are installed.

Denis V. Lunev den at virtuozzo.com
Wed Nov 18 08:05:26 UTC 2015


On 11/18/2015 01:03 AM, Richard W.M. Jones wrote:
> 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
adding roman to CC:




More information about the Libguestfs mailing list