]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Support WinPE with PESET.EXE
authorlongpanda <admin@ventoy.net>
Tue, 12 Oct 2021 03:24:04 +0000 (11:24 +0800)
committerlongpanda <admin@ventoy.net>
Tue, 12 Oct 2021 03:24:04 +0000 (11:24 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
INSTALL/grub/grub.cfg

index 14dae6e00e6965475326dcd30b4647cacd02a027..8d6a8272ab822f4d8e1fb1cdd15dbf1ccb4a97f1 100644 (file)
@@ -53,6 +53,26 @@ void ventoy_debug(const char *fmt, ...)
     va_end (args);
 }
 
     va_end (args);
 }
 
+void ventoy_str_tolower(char *str)
+{
+    while (*str)
+    {
+        *str = grub_tolower(*str);
+        str++;
+    }
+}
+
+void ventoy_str_toupper(char *str)
+{
+    while (*str)
+    {
+        *str = grub_toupper(*str);
+        str++;
+    }
+}
+
+
+
 int ventoy_strcmp(const char *pattern, const char *str)
 {
     while (*pattern && *str)
 int ventoy_strcmp(const char *pattern, const char *str)
 {
     while (*pattern && *str)
index df1cce76486843217cc37adc26b758fff4eb7303..b7e7ce0a00ceb15bae7d969fd11b4b72987bbdcb 100644 (file)
@@ -5087,7 +5087,6 @@ static cmd_para ventoy_cmds[] =
     { "vt_check_json_path_case", ventoy_cmd_chk_json_pathcase, 0, NULL, "", "", NULL },
     { "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL },
     { "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL },
     { "vt_check_json_path_case", ventoy_cmd_chk_json_pathcase, 0, NULL, "", "", NULL },
     { "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL },
     { "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL },
-    { "vt_wim_peset", ventoy_cmd_wim_peset, 0, NULL, "", "", NULL },
 };
 
 int ventoy_register_all_cmd(void)
 };
 
 int ventoy_register_all_cmd(void)
index 670ae56d54352315859088cac941068dbdb4d497..470b0f88e35732a5b059807d7fe703f31f216f6b 100644 (file)
@@ -434,6 +434,18 @@ typedef struct wim_directory_entry
 /** No security information exists for this file */
 #define WIM_NO_SECURITY 0xffffffffUL
 
 /** No security information exists for this file */
 #define WIM_NO_SECURITY 0xffffffffUL
 
+typedef struct reg_vk
+{
+    grub_uint32_t res1;
+    grub_uint16_t sig;
+    grub_uint16_t namesize;
+    grub_uint32_t datasize;
+    grub_uint32_t dataoffset;
+    grub_uint32_t datatype;
+    grub_uint16_t flag;
+    grub_uint16_t res2;
+}reg_vk;
+
 #pragma pack()
 
 
 #pragma pack()
 
 
@@ -586,7 +598,6 @@ grub_err_t ventoy_cmd_is_pe64(grub_extcmd_context_t ctxt, int argc, char **args)
 grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
-grub_err_t ventoy_cmd_wim_peset(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
 grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -1018,6 +1029,8 @@ extern grub_uint32_t g_ventoy_plat_data;
 #define ventoy_syscall0(name) grub_##name()
 #define ventoy_syscall1(name, a) grub_##name(a)
 
 #define ventoy_syscall0(name) grub_##name()
 #define ventoy_syscall1(name, a) grub_##name(a)
 
+void ventoy_str_tolower(char *str);
+void ventoy_str_toupper(char *str);
 char * ventoy_get_line(char *start);
 int ventoy_cmp_img(img_info *img1, img_info *img2);
 void ventoy_swap_img(img_info *img1, img_info *img2);
 char * ventoy_get_line(char *start);
 int ventoy_cmp_img(img_info *img1, img_info *img2);
 void ventoy_swap_img(img_info *img1, img_info *img2);
index 69f3feab246fe08a71c40157528cea939172e1cb..654eaebde784bc408c8b1e62abdec057a7996bb0 100644 (file)
@@ -40,7 +40,6 @@
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
-static int g_peset_flag = 0;
 static int g_iso_fs_type = 0;
 static int g_wim_total_patch_count = 0;
 static int g_wim_valid_patch_count = 0;
 static int g_iso_fs_type = 0;
 static int g_wim_total_patch_count = 0;
 static int g_wim_valid_patch_count = 0;
@@ -418,7 +417,6 @@ grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char *
     g_wim_patch_head = NULL;
     g_wim_total_patch_count = 0;
     g_wim_valid_patch_count = 0;
     g_wim_patch_head = NULL;
     g_wim_total_patch_count = 0;
     g_wim_valid_patch_count = 0;
-    g_peset_flag = 0;
 
     return 0;
 }
 
     return 0;
 }
@@ -660,57 +658,186 @@ static wim_directory_entry * search_full_wim_dirent
     return search;
 }
 
     return search;
 }
 
-static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir)
+
+
+static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_entry *lookup, wim_hash *hash)
+{
+    grub_uint32_t i = 0;
+    
+    for (i = 0; i < (grub_uint32_t)header->lookup.raw_size / sizeof(wim_lookup_entry); i++)
+    {
+        if (grub_memcmp(&lookup[i].hash, hash, sizeof(wim_hash)) == 0)
+        {
+            return lookup + i;
+        }
+    }
+
+    return NULL;
+}
+
+static int parse_registry_setup_cmdline
+(
+    grub_file_t file, 
+    wim_header *head, 
+    wim_lookup_entry *lookup, 
+    void *meta_data, 
+    wim_directory_entry *dir, 
+    char *buf, 
+    grub_uint32_t buflen
+)
 {
 {
-    wim_directory_entry *tmp_dirent = NULL;
+    char c;
+    grub_uint32_t i = 0;    
+    grub_uint32_t reglen = 0;
+    wim_hash zerohash;
+    reg_vk *regvk = NULL;
+    wim_lookup_entry *look = NULL;
     wim_directory_entry *wim_dirent = NULL;
     wim_directory_entry *wim_dirent = NULL;
-    const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL };
-    const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL };
-    const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
+    char *decompress_data = NULL;
+    const char *reg_path[] = { "Windows", "System32", "config", "SYSTEM", NULL };
 
 
-    wim_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
-    debug("search pecmd.exe %p\n", wim_dirent);
-    if (wim_dirent)
+    wim_dirent = search_full_wim_dirent(meta_data, dir, reg_path);
+    debug("search reg SYSTEM %p\n", wim_dirent);
+    if (!wim_dirent)
+    {
+        return 1;
+    }
+
+    grub_memset(&zerohash, 0, sizeof(zerohash));
+    if (grub_memcmp(&zerohash, wim_dirent->hash.sha1, sizeof(wim_hash)) == 0)
     {
     {
-        if (g_peset_flag)
+        return 2;
+    }
+
+    look = ventoy_find_look_entry(head, lookup, &wim_dirent->hash);
+    if (!look)
+    {
+        return 3;
+    }
+
+    reglen = (grub_uint32_t)look->resource.raw_size;
+    debug("find system lookup entry_id:%ld raw_size:%u\n", 
+        ((long)look - (long)lookup) / sizeof(wim_lookup_entry), reglen);
+
+    if (0 != ventoy_read_resource(file, head, &(look->resource), (void **)&(decompress_data)))
+    {
+        return 4;
+    }
+
+    if (grub_strncmp(decompress_data + 0x1000, "hbin", 4))
+    {
+        return 5;
+    }
+
+    for (i = 0x1000; i + sizeof(reg_vk) < reglen; i += 8)
+    {
+        regvk = (reg_vk *)(decompress_data + i);
+        if (regvk->sig == 0x6B76 && regvk->namesize == 7 &&
+            regvk->datatype == 1 && regvk->flag == 1)
         {
         {
-            tmp_dirent = search_full_wim_dirent(meta_data, dir, peset_path);
-            debug("search peset.exe %p\n", tmp_dirent);
-            if (tmp_dirent)
+            if (grub_strncasecmp((char *)(regvk + 1), "cmdline", 7) == 0)
             {
             {
-                return tmp_dirent;
+                debug("find registry cmdline i:%u offset:(0x%x)%u size:(0x%x)%u\n", 
+                        i, regvk->dataoffset, regvk->dataoffset, regvk->datasize, regvk->datasize);
+                break;
             }
         }
             }
         }
+    }
 
 
-        return wim_dirent;
+    if (i + sizeof(reg_vk) >= reglen || regvk == NULL)
+    {
+        return 6;
     }
 
     }
 
-    wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
-    debug("search winpeshl.exe %p\n", wim_dirent);
-    if (wim_dirent)
+    if (regvk->datasize == 0 || (regvk->datasize & 0x80000000) > 0 ||
+        regvk->dataoffset == 0 || regvk->dataoffset == 0xFFFFFFFF)
     {
     {
-        return wim_dirent;
+        return 7;
     }
 
     }
 
-    return NULL;
-}
+    if (regvk->datasize / 2 >= buflen)
+    {
+        return 8;
+    }
 
 
+    debug("start offset is 0x%x(%u)\n", 0x1000 + regvk->dataoffset + 4, 0x1000 + regvk->dataoffset + 4);
 
 
-static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_entry *lookup, wim_hash *hash)
+    for (i = 0; i < regvk->datasize; i+=2)
+    {
+        c = (char)(*(grub_uint16_t *)(decompress_data + 0x1000 + regvk->dataoffset + 4 + i));
+        *buf++ = c;
+    }
+
+    grub_free(decompress_data);
+    return 0;
+}
+
+static wim_directory_entry * search_replace_wim_dirent
+(
+    grub_file_t file, 
+    wim_header *head, 
+    wim_lookup_entry *lookup, 
+    void *meta_data, 
+    wim_directory_entry *dir
+)
 {
 {
-    grub_uint32_t i = 0;
-    
-    for (i = 0; i < (grub_uint32_t)header->lookup.raw_size / sizeof(wim_lookup_entry); i++)
+    int ret;
+    char cmdline[256] = {0};
+    wim_directory_entry *wim_dirent = NULL;
+    const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL };
+    const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL };
+    const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
+
+    ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline));
+    if (0 == ret)
     {
     {
-        if (grub_memcmp(&lookup[i].hash, hash, sizeof(wim_hash)) == 0)
+        debug("registry setup cmdline:<%s>\n", cmdline);
+        ventoy_str_toupper(cmdline);
+        
+        if (grub_strncmp(cmdline, "PECMD", 5) == 0)
         {
         {
-            return lookup + i;
+            wim_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
+            debug("search pecmd.exe %p\n", wim_dirent);
+        }
+        else if (grub_strncmp(cmdline, "PESET", 5) == 0)
+        {
+            wim_dirent = search_full_wim_dirent(meta_data, dir, peset_path);
+            debug("search peset.exe %p\n", wim_dirent);
         }
         }
+        else if (grub_strncmp(cmdline, "WINPESHL", 8) == 0)
+        {
+            wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
+            debug("search winpeshl.exe %p\n", wim_dirent);
+        }
+
+        if (wim_dirent)
+        {
+            return wim_dirent;
+        }
+    }
+    else
+    {
+        debug("registry setup cmdline failed : %d\n", ret);
+    }
+
+    wim_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
+    debug("search pecmd.exe %p\n", wim_dirent);
+    if (wim_dirent)
+    {
+        return wim_dirent;
+    }
+
+    wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
+    debug("search winpeshl.exe %p\n", wim_dirent);
+    if (wim_dirent)
+    {
+        return wim_dirent;
     }
 
     return NULL;
 }
 
     }
 
     return NULL;
 }
 
+
 static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_entry *lookup)
 {
     grub_uint32_t i = 0;
 static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_entry *lookup)
 {
     grub_uint32_t i = 0;
@@ -1022,8 +1149,16 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
         rootdir = (wim_directory_entry *)(decompress_data + 8);
     }
 
         rootdir = (wim_directory_entry *)(decompress_data + 8);
     }
 
+
+    debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
+    lookup = grub_malloc(head->lookup.raw_size);
+    grub_file_seek(file, head->lookup.offset);
+    grub_file_read(file, lookup, head->lookup.raw_size);
+
+
+
     /* search winpeshl.exe dirent entry */
     /* search winpeshl.exe dirent entry */
-    search = search_replace_wim_dirent(decompress_data, rootdir);
+    search = search_replace_wim_dirent(file, head, lookup, decompress_data, rootdir);
     if (!search)
     {
         debug("Failed to find replace file %p\n", search);
     if (!search)
     {
         debug("Failed to find replace file %p\n", search);
@@ -1055,11 +1190,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
         grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash));        
     }
 
         grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash));        
     }
 
-    debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
-    lookup = grub_malloc(head->lookup.raw_size);
-    grub_file_seek(file, head->lookup.offset);
-    grub_file_read(file, lookup, head->lookup.raw_size);
-
+    
     /* find and extact winpeshl.exe */
     patch->replace_look = ventoy_find_look_entry(head, lookup, &patch->old_hash);
     if (patch->replace_look)
     /* find and extact winpeshl.exe */
     patch->replace_look = ventoy_find_look_entry(head, lookup, &patch->old_hash);
     if (patch->replace_look)
@@ -1843,17 +1974,6 @@ grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, c
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
-grub_err_t ventoy_cmd_wim_peset(grub_extcmd_context_t ctxt, int argc, char **args)
-{
-    (void)ctxt;
-    (void)argc;
-    (void)args;
-    
-    g_peset_flag = 1;
-
-    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
-}
-
 grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     grub_uint32_t i = 0;
 grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     grub_uint32_t i = 0;
index 7784b31d449255d2fecbbd8804cea09c984c90ac..cb538c9a371d57acff7ed4eae4065b7a531e0788 100644 (file)
@@ -156,12 +156,6 @@ function locate_initrd {
 }
 
 function locate_wim {
 }
 
 function locate_wim {
-    if vt_strstr "$vt_volume_id" "yr"; then
-        if [ -f (loop)/isyl/isyl ]; then
-            vt_wim_peset
-        fi
-    fi
-
     vt_windows_locate_wim_patch (loop)
     
     if [ -n "${vtdebug_flag}" ]; then
     vt_windows_locate_wim_patch (loop)
     
     if [ -n "${vtdebug_flag}" ]; then