2009-06-01 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / metadata / pedump.c
index dc3feacb3a3aeca33f4b4a94e7b399ddab6e242a..6ab39c39f762b819669016dc808c2dab0e776211 100644 (file)
@@ -307,7 +307,7 @@ dump_metadata (MonoImage *meta)
                        mono_meta_table_name (table),
                        meta->tables [table].rows,
                        meta->tables [table].row_size,
-                       meta->tables [table].base - meta->raw_data
+                       (unsigned int)(meta->tables [table].base - meta->raw_data)
                        );
        }
 }
@@ -417,41 +417,42 @@ usage (void)
 static int
 verify_image_file (const char *fname)
 {
-       FILE *filed;
-       struct stat stat_buf;
-       void *raw_data_handle;
-       char *raw_data;
-       GSList *errors, *tmp;
+       GSList *errors = NULL, *tmp;
+       MonoImage *image;
+       MonoImageOpenStatus status;
        int count = 0;
        const char* desc [] = {
                "Ok", "Error", "Warning", NULL, "CLS", NULL, NULL, NULL, "Not Verifiable"
        };
 
-       if ((filed = fopen (fname, "rb")) == NULL) {
-               fprintf (stderr, "Cannot open file %s\n", fname);
-               exit (1);
+       image = mono_image_open_raw (fname, &status);
+       if (!image) {
+               printf ("Could not open %s\n", fname);
+               return 1;
        }
 
-       if (fstat (fileno (filed), &stat_buf)) {
-               fclose (filed);
-               fprintf (stderr, "Cannot stat file %s\n", fname);
-               exit (1);
+       if (!mono_verifier_verify_pe_data (image, &errors))
+               goto invalid_image;
+
+       if (!mono_image_load_pe_data (image)) {
+               printf ("Could not load pe data for assembly %s\n", fname);
+               return 1;
        }
 
-       raw_data = mono_file_map (stat_buf.st_size, MONO_MMAP_READ|MONO_MMAP_PRIVATE, fileno (filed), 0, &raw_data_handle);
+       if (!mono_verifier_verify_cli_data (image, &errors))
+               goto invalid_image;
 
-       if (!raw_data) {
-               fprintf (stderr, "Could not mmap file %s\n", fname);
-               exit (1);
+       if (!mono_image_load_cli_data (image)) {
+               printf ("Could not load cli data for assembly %s\n", fname);
+               return 1;
        }
-       fclose (filed);
 
-       errors = mono_image_verify (raw_data, stat_buf.st_size, strcmp (fname, "mscorlib.dll") == 0);
-       mono_file_unmap (raw_data, raw_data_handle);
+       if (!mono_verifier_verify_table_data (image, &errors))
+               goto invalid_image;
 
-       if (!errors)
-               return 0;
+       return 0;
 
+invalid_image:
        for (tmp = errors; tmp; tmp = tmp->next) {
                MonoVerifyInfo *info = tmp->data;
                g_print ("%s: %s\n", desc [info->status], info->message);
@@ -461,8 +462,7 @@ verify_image_file (const char *fname)
        mono_free_verify_list (errors);
        if (count)
                g_print ("Error count: %d\n", count);
-
-       return count > 0 ? 1 : 0;
+       return 1;
 }
 
 static gboolean
@@ -642,8 +642,26 @@ main (int argc, char *argv [])
                /**/
        }
 
-       if (run_new_metadata_verifier)
-               return verify_image_file (file);
+       if (verify_pe || run_new_metadata_verifier) {
+               mono_install_assembly_load_hook (pedump_assembly_load_hook, NULL);
+               mono_install_assembly_search_hook (pedump_assembly_search_hook, NULL);
+
+               mono_init_version ("pedump", "v2.0.50727");
+
+               mono_install_assembly_preload_hook (pedump_preload, GUINT_TO_POINTER (FALSE));
+
+               mono_marshal_init ();
+               run_new_metadata_verifier = 1;
+       }
+       
+       if (run_new_metadata_verifier) {
+               int res;
+               mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE);
+
+               res = verify_image_file (file);
+               if (res || !verify_code)
+                       return res;
+       }
 
        image = mono_image_open (file, NULL);
        if (!image){
@@ -655,17 +673,19 @@ main (int argc, char *argv [])
                dump_dotnet_iinfo (image);
        if (verify_pe) {
                MonoAssembly *assembly;
+               MonoImage *image;
+               MonoImageOpenStatus status;
 
-               mono_install_assembly_load_hook (pedump_assembly_load_hook, NULL);
-               mono_install_assembly_search_hook (pedump_assembly_search_hook, NULL);
-
-               mono_init_from_assembly (file, file);
-
-               mono_install_assembly_preload_hook (pedump_preload, GUINT_TO_POINTER (FALSE));
-
-               mono_marshal_init ();
+               mono_verifier_set_mode (verifier_mode);
 
                assembly = mono_assembly_open (file, NULL);
+               /*fake an assembly for netmodules so the verifier works*/
+               if (!assembly && (image = mono_image_open (file, &status)) && image->tables [MONO_TABLE_ASSEMBLY].rows == 0) {
+                       assembly = g_new0 (MonoAssembly, 1);
+                       assembly->in_gac = FALSE;
+                       assembly->image = image;
+                       image->assembly = assembly;
+               }
 
                if (!assembly) {
                        g_print ("Could not open assembly %s\n", file);