From c0af637714a8dfde5739e335810e3e2290be5084 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 7 Sep 2015 17:16:24 +0100 Subject: [PATCH] v2v: windows: Refactor Xen uninstaller detection code. No change, just refactoring. (cherry picked from commit 8f889f0c3e65908299d68376b79fbda4fceb2fbe) --- v2v/convert_windows.ml | 70 ++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml index a89c908..e3d3a39 100644 --- a/v2v/convert_windows.ml +++ b/v2v/convert_windows.ml @@ -103,43 +103,45 @@ let convert ~verbose ~keep_serial_console (g : G.guestfs) inspect source = (*----------------------------------------------------------------------*) (* Inspect the Windows guest. *) - let find_xenpv_uninst root = - try - let xenpvreg = "Red Hat Paravirtualized Xen Drivers for Windows(R)" in - let node = - get_node root - ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"; xenpvreg] in - let uninstkey = "UninstallString" in - let valueh = g#hivex_node_get_value node uninstkey in - if valueh = 0L then ( - warning ~prog (f_"cannot uninstall Xen PV drivers: registry key 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s' does not contain an '%s' key") - xenpvreg uninstkey; - raise Not_found - ); - let data = g#hivex_value_value valueh in - let data = decode_utf16le ~prog data in - - (* The uninstall program will be uninst.exe. This is a wrapper - * around _uninst.exe which prompts the user. As we don't want - * the user to be prompted, we run _uninst.exe explicitly. - *) - let len = String.length data in - let data = - if len >= 8 && - String.lowercase (String.sub data (len-8) 8) = "uninst.exe" then - (String.sub data 0 (len-8)) ^ "_uninst.exe" - else - data in - - Some data - with - Not_found -> None - in - (* Open the software hive (readonly) and find the Xen PV uninstaller, * if it exists. *) - let xenpv_uninst = with_hive "software" ~write:false find_xenpv_uninst in + let xenpv_uninst = + let xenpvreg = "Red Hat Paravirtualized Xen Drivers for Windows(R)" in + + let find_xenpv_uninst root = + try + let node = + get_node root + ["Microsoft"; "Windows"; "CurrentVersion"; "Uninstall"; + xenpvreg] in + let uninstkey = "UninstallString" in + let valueh = g#hivex_node_get_value node uninstkey in + if valueh = 0L then ( + warning ~prog (f_"cannot uninstall Xen PV drivers: registry key 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s' does not contain an '%s' key") + xenpvreg uninstkey; + raise Not_found + ); + let data = g#hivex_value_value valueh in + let data = decode_utf16le ~prog data in + + (* The uninstall program will be uninst.exe. This is a wrapper + * around _uninst.exe which prompts the user. As we don't want + * the user to be prompted, we run _uninst.exe explicitly. + *) + let len = String.length data in + let data = + if len >= 8 && + String.lowercase (String.sub data (len-8) 8) = "uninst.exe" then + (String.sub data 0 (len-8)) ^ "_uninst.exe" + else + data in + + Some data + with + Not_found -> None + in + with_hive "software" ~write:false find_xenpv_uninst in (*----------------------------------------------------------------------*) (* Perform the conversion of the Windows guest. *) -- 1.8.3.1