- return(NULL);
- }
- string_len=string_len+block.data_len;
-
- language = g_utf16_to_utf8 (block.key, unicode_bytes (block.key), NULL, NULL, NULL);
- g_strdown (language);
-
- /* Kludge: treat en_US as neutral too */
- if (!strcmp (language, "007f04b0") ||
- !strcmp (language, "000004b0") ||
- !strcmp (language, "040904b0")) {
- /* Got the one we're interested in */
- process_set_field_string_utf8 (filever, "language",
- "Language Neutral");
-
- data_ptr=process_read_string_block (filever, data_ptr,
- block.data_len,
- TRUE);
- } else {
- /* Some other language. We might want to do
- * something with this in the future.
- */
- data_ptr=process_read_string_block (filever, data_ptr,
- block.data_len,
- FALSE);
- }
- g_free (language);
-
- if(data_ptr==NULL) {
- /* Child block hit padding */
-#ifdef DEBUG
- g_message (G_GNUC_PRETTY_FUNCTION ": Child block hit 0-length block, giving up");
-#endif
- return(NULL);
- }
- }
-
- return(data_ptr);
-}
-
-static void process_read_fixedfileinfo_block (MonoObject *filever,
- VS_FIXEDFILEINFO *ffi)
-{
-#ifdef DEBUG
- g_message (G_GNUC_PRETTY_FUNCTION ": ffi: sig 0x%x, strucver 0x%x, fileverm 0x%x, fileverl 0x%x, prodverm 0x%x, prodverl 0x%x, ffmask 0x%x, ff 0x%x, os 0x%x, type 0x%x, subtype 0x%x, datem 0x%x, datel 0x%x", ffi->dwSignature, ffi->dwStrucVersion, ffi->dwFileVersionMS, ffi->dwFileVersionLS, ffi->dwProductVersionMS, ffi->dwProductVersionLS, ffi->dwFileFlagsMask, ffi->dwFileFlags, ffi->dwFileOS, ffi->dwFileType, ffi->dwFileSubtype, ffi->dwFileDateMS, ffi->dwFileDateLS);
-#endif
-
- process_set_field_int (filever, "filemajorpart",
- HIWORD (ffi->dwFileVersionMS));
- process_set_field_int (filever, "fileminorpart",
- LOWORD (ffi->dwFileVersionMS));
- process_set_field_int (filever, "filebuildpart",
- HIWORD (ffi->dwFileVersionLS));
- process_set_field_int (filever, "fileprivatepart",
- LOWORD (ffi->dwFileVersionLS));
-
- process_set_field_int (filever, "productmajorpart",
- HIWORD (ffi->dwProductVersionMS));
- process_set_field_int (filever, "productminorpart",
- LOWORD (ffi->dwProductVersionMS));
- process_set_field_int (filever, "productbuildpart",
- HIWORD (ffi->dwProductVersionLS));
- process_set_field_int (filever, "productprivatepart",
- LOWORD (ffi->dwProductVersionLS));
-
- process_set_field_bool (filever, "isdebug",
- ffi->dwFileFlags&VS_FF_DEBUG);
- process_set_field_bool (filever, "isprerelease",
- ffi->dwFileFlags&VS_FF_PRERELEASE);
- process_set_field_bool (filever, "ispatched",
- ffi->dwFileFlags&VS_FF_PATCHED);
- process_set_field_bool (filever, "isprivatebuild",
- ffi->dwFileFlags&VS_FF_PRIVATEBUILD);
- process_set_field_bool (filever, "isspecialbuild",
- ffi->dwFileFlags&VS_FF_SPECIALBUILD);
-}
-
-static void process_get_fileversion (MonoObject *filever, MonoImage *image)
-{
- MonoPEResourceDataEntry *version_info;
- gpointer data;
+ /* chars includes trailing null */
+ process_set_field_string (filever, fieldname, buffer, chars - 1);
+ } else {
+ process_set_field_string (filever, fieldname, EMPTY_STRING, 0);
+ }
+
+ g_free (lang_key);
+ g_free (lang_key_utf8);
+}
+
+static void process_module_stringtable (MonoObject *filever, gpointer data,
+ guchar lang_hi, guchar lang_lo)
+{
+ process_module_string_read (filever, data, "comments", lang_hi, lang_lo,
+ SFI_COMMENTS);
+ process_module_string_read (filever, data, "companyname", lang_hi,
+ lang_lo, SFI_COMPANYNAME);
+ process_module_string_read (filever, data, "filedescription", lang_hi,
+ lang_lo, SFI_FILEDESCRIPTION);
+ process_module_string_read (filever, data, "fileversion", lang_hi,
+ lang_lo, SFI_FILEVERSION);
+ process_module_string_read (filever, data, "internalname", lang_hi,
+ lang_lo, SFI_INTERNALNAME);
+ process_module_string_read (filever, data, "legalcopyright", lang_hi,
+ lang_lo, SFI_LEGALCOPYRIGHT);
+ process_module_string_read (filever, data, "legaltrademarks", lang_hi,
+ lang_lo, SFI_LEGALTRADEMARKS);
+ process_module_string_read (filever, data, "originalfilename", lang_hi,
+ lang_lo, SFI_ORIGINALFILENAME);
+ process_module_string_read (filever, data, "privatebuild", lang_hi,
+ lang_lo, SFI_PRIVATEBUILD);
+ process_module_string_read (filever, data, "productname", lang_hi,
+ lang_lo, SFI_PRODUCTNAME);
+ process_module_string_read (filever, data, "productversion", lang_hi,
+ lang_lo, SFI_PRODUCTVERSION);
+ process_module_string_read (filever, data, "specialbuild", lang_hi,
+ lang_lo, SFI_SPECIALBUILD);
+}
+
+static void process_get_fileversion (MonoObject *filever, gunichar2 *filename)
+{
+ DWORD verinfohandle;