X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Finspect.c;h=154207b9a7f34020eea82681fbd9327af6686d16;hp=238e6e517a2ad2e63e61685648dfc4269a32be2b;hb=9e7c6a548353bde925c16434711bcc6208038d83;hpb=64bc4495031a1942472038db7aee0bf3b746949d diff --git a/src/inspect.c b/src/inspect.c index 238e6e5..154207b 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef HAVE_PCRE #include @@ -229,7 +230,7 @@ static int check_windows_root (guestfs_h *g, struct inspect_fs *fs); static int check_windows_arch (guestfs_h *g, struct inspect_fs *fs); static int check_windows_software_registry (guestfs_h *g, struct inspect_fs *fs); static int check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs); -static char *resolve_windows_path_silently (guestfs_h *g, const char *); +static char *case_sensitive_path_silently (guestfs_h *g, const char *); static int is_file_nocase (guestfs_h *g, const char *); static int is_dir_nocase (guestfs_h *g, const char *); static int extend_fses (guestfs_h *g); @@ -1422,7 +1423,7 @@ check_windows_root (guestfs_h *g, struct inspect_fs *fs) for (i = 0; systemroot == NULL && i < sizeof systemroots / sizeof systemroots[0]; ++i) { - systemroot = resolve_windows_path_silently (g, systemroots[i]); + systemroot = case_sensitive_path_silently (g, systemroots[i]); } if (!systemroot) { @@ -1459,7 +1460,7 @@ check_windows_arch (guestfs_h *g, struct inspect_fs *fs) char cmd_exe[len]; snprintf (cmd_exe, len, "%s/system32/cmd.exe", fs->windows_systemroot); - char *cmd_exe_path = resolve_windows_path_silently (g, cmd_exe); + char *cmd_exe_path = case_sensitive_path_silently (g, cmd_exe); if (!cmd_exe_path) return 0; @@ -1486,7 +1487,7 @@ check_windows_software_registry (guestfs_h *g, struct inspect_fs *fs) snprintf (software, len, "%s/system32/config/software", fs->windows_systemroot); - char *software_path = resolve_windows_path_silently (g, software); + char *software_path = case_sensitive_path_silently (g, software); if (!software_path) /* If the software hive doesn't exist, just accept that we cannot * find product_name etc. @@ -1603,7 +1604,7 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) snprintf (system, len, "%s/system32/config/system", fs->windows_systemroot); - char *system_path = resolve_windows_path_silently (g, system); + char *system_path = case_sensitive_path_silently (g, system); if (!system_path) /* If the system hive doesn't exist, just accept that we cannot * find hostname etc. @@ -1612,7 +1613,10 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) int ret = -1; hive_h *h = NULL; - hive_value_h *values = NULL; + hive_node_h root, node; + hive_value_h value, *values = NULL; + int32_t dword; + size_t i; if (download_to_tmp (g, system_path, system_local, MAX_REGISTRY_SIZE) == -1) goto out; @@ -1623,21 +1627,49 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) goto out; } - hive_node_h node = hivex_root (h); - /* XXX Don't hard-code ControlSet001. The current control set would - * be another good thing to expose up through the inspection API. - */ + root = hivex_root (h); + if (root == 0) { + perrorf (g, "hivex_root"); + goto out; + } + + /* Get the CurrentControlSet. */ + errno = 0; + node = hivex_node_get_child (h, root, "Select"); + if (node == 0) { + if (errno != 0) + perrorf (g, "hivex_node_get_child"); + else + error (g, "hivex: could not locate HKLM\\SYSTEM\\Select"); + goto out; + } + + errno = 0; + value = hivex_node_get_value (h, node, "Current"); + if (value == 0) { + if (errno != 0) + perrorf (g, "hivex_node_get_value"); + else + error (g, "hivex: HKLM\\System\\Select Default entry not found."); + goto out; + } + + /* XXX Should check the type. */ + dword = hivex_value_dword (h, value); + fs->windows_current_control_set = safe_asprintf (g, "ControlSet%03d", dword); + + /* Get the hostname. */ const char *hivepath[] = - { "ControlSet001", "Services", "Tcpip", "Parameters" }; - size_t i; - for (i = 0; + { fs->windows_current_control_set, "Services", "Tcpip", "Parameters" }; + for (node = root, i = 0; node != 0 && i < sizeof hivepath / sizeof hivepath[0]; ++i) { node = hivex_node_get_child (h, node, hivepath[i]); } if (node == 0) { - perrorf (g, "hivex: cannot locate HKLM\\SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters"); + perrorf (g, "hivex: cannot locate HKLM\\SYSTEM\\%s\\Services\\Tcpip\\Parameters", + fs->windows_current_control_set); goto out; } @@ -1678,7 +1710,7 @@ check_windows_system_registry (guestfs_h *g, struct inspect_fs *fs) } static char * -resolve_windows_path_silently (guestfs_h *g, const char *path) +case_sensitive_path_silently (guestfs_h *g, const char *path) { guestfs_error_handler_cb old_error_cb = g->error_cb; g->error_cb = NULL; @@ -1693,7 +1725,7 @@ is_file_nocase (guestfs_h *g, const char *path) char *p; int r; - p = resolve_windows_path_silently (g, path); + p = case_sensitive_path_silently (g, path); if (!p) return 0; r = guestfs_is_file (g, p); @@ -1707,7 +1739,7 @@ is_dir_nocase (guestfs_h *g, const char *path) char *p; int r; - p = resolve_windows_path_silently (g, path); + p = case_sensitive_path_silently (g, path); if (!p) return 0; r = guestfs_is_dir (g, p); @@ -2011,6 +2043,22 @@ guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root) } char * +guestfs__inspect_get_windows_current_control_set (guestfs_h *g, + const char *root) +{ + struct inspect_fs *fs = search_for_root (g, root); + if (!fs) + return NULL; + + if (!fs->windows_current_control_set) { + error (g, _("not a Windows guest, or CurrentControlSet could not be determined")); + return NULL; + } + + return safe_strdup (g, fs->windows_current_control_set); +} + +char * guestfs__inspect_get_format (guestfs_h *g, const char *root) { struct inspect_fs *fs = search_for_root (g, root); @@ -2476,7 +2524,7 @@ list_applications_windows (guestfs_h *g, struct inspect_fs *fs) snprintf (software, len, "%s/system32/config/software", fs->windows_systemroot); - char *software_path = resolve_windows_path_silently (g, software); + char *software_path = case_sensitive_path_silently (g, software); if (!software_path) /* If the software hive doesn't exist, just accept that we cannot * find product_name etc. @@ -2905,6 +2953,13 @@ guestfs__inspect_get_windows_systemroot (guestfs_h *g, const char *root) NOT_IMPL(NULL); } +char * +guestfs__inspect_get_windows_current_control_set (guestfs_h *g, + const char *root) +{ + NOT_IMPL(NULL); +} + char ** guestfs__inspect_get_mountpoints (guestfs_h *g, const char *root) { @@ -2978,6 +3033,7 @@ guestfs___free_inspect_info (guestfs_h *g) free (g->fses[i].arch); free (g->fses[i].hostname); free (g->fses[i].windows_systemroot); + free (g->fses[i].windows_current_control_set); size_t j; for (j = 0; j < g->fses[i].nr_fstab; ++j) { free (g->fses[i].fstab[j].device);