[io-layer] Extract file (#4255)
[mono.git] / mono / metadata / w32process.c
index 614168ed5873dd3a486656513b5c2dfb2b87f41f..78a622af6531296c1e25710931a85a77c00742ca 100644 (file)
@@ -4,12 +4,14 @@
 #include "w32process.h"
 #include "w32process-internals.h"
 #include "w32process-win32-internals.h"
+#include "w32file.h"
 #include "object.h"
 #include "object-internals.h"
 #include "class.h"
 #include "class-internals.h"
 #include "image.h"
 #include "utils/mono-proclib.h"
+#include "io-layer/io-layer.h"
 
 #define LOGDEBUG(...)
 /* define LOGDEBUG(...) g_message(__VA_ARGS__)  */
@@ -46,6 +48,30 @@ mono_w32process_module_get_information (gpointer process, gpointer module, MODUL
        return GetModuleInformation (process, module, modinfo, size);
 }
 
+static guint32
+mono_w32process_get_fileversion_info_size (gunichar2 *filename, guint32 *handle)
+{
+       return GetFileVersionInfoSize (filename, handle);
+}
+
+static gboolean
+mono_w32process_get_fileversion_info (gunichar2 *filename, guint32 handle, guint32 len, gpointer data)
+{
+       return GetFileVersionInfo (filename, handle, len, data);
+}
+
+static gboolean
+mono_w32process_ver_query_value (gconstpointer datablock, const gunichar2 *subblock, gpointer *buffer, guint32 *len)
+{
+       return VerQueryValue (datablock, subblock, buffer, len);
+}
+
+static guint32
+mono_w32process_ver_language_name (guint32 lang, gunichar2 *lang_out, guint32 lang_len)
+{
+       return VerLanguageName (lang, lang_out, lang_len);
+}
+
 #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) && defined(HOST_WIN32) */
 
 static MonoImage *system_image;
@@ -263,7 +289,7 @@ process_module_string_read (MonoObject *filever, gpointer data, const gchar *fie
 
        lang_key = g_utf8_to_utf16 (lang_key_utf8, -1, NULL, NULL, NULL);
 
-       if (VerQueryValue (data, lang_key, (gpointer *)&buffer, &chars) && chars > 0) {
+       if (mono_w32process_ver_query_value (data, lang_key, (gpointer *)&buffer, &chars) && chars > 0) {
                LOGDEBUG (g_message ("%s: found %d chars of [%s]", __func__, chars, g_utf16_to_utf8 (buffer, chars, NULL, NULL, NULL)));
                /* chars includes trailing null */
                process_set_field_string (filever, fieldname, buffer, chars - 1, error);
@@ -301,10 +327,10 @@ mono_w32process_get_fileversion (MonoObject *filever, gunichar2 *filename, MonoE
 
        mono_error_init (error);
 
-       datalen = GetFileVersionInfoSize (filename, &verinfohandle);
+       datalen = mono_w32process_get_fileversion_info_size (filename, &verinfohandle);
        if (datalen) {
                data = g_malloc0 (datalen);
-               ok = GetFileVersionInfo (filename, verinfohandle, datalen, data);
+               ok = mono_w32process_get_fileversion_info (filename, verinfohandle, datalen, data);
                if (ok) {
                        query = g_utf8_to_utf16 ("\\", -1, NULL, NULL, NULL);
                        if (query == NULL) {
@@ -312,8 +338,13 @@ mono_w32process_get_fileversion (MonoObject *filever, gunichar2 *filename, MonoE
                                return;
                        }
 
-                       if (VerQueryValue (data, query, (gpointer *)&ffi, &ffi_size)) {
-                               LOGDEBUG (g_message ("%s: recording assembly: FileName [%s] FileVersionInfo [%d.%d.%d.%d]", __func__, g_utf16_to_utf8 (filename, -1, NULL, NULL, NULL), HIWORD (ffi->dwFileVersionMS), LOWORD (ffi->dwFileVersionMS), HIWORD (ffi->dwFileVersionLS), LOWORD (ffi->dwFileVersionLS)));
+                       if (mono_w32process_ver_query_value (data, query, (gpointer *)&ffi, &ffi_size)) {
+                               #define LOWORD(i32) ((guint16)((i32) & 0xFFFF))
+                               #define HIWORD(i32) ((guint16)(((guint32)(i32) >> 16) & 0xFFFF))
+
+                               LOGDEBUG (g_message ("%s: recording assembly: FileName [%s] FileVersionInfo [%d.%d.%d.%d]",
+                                       __func__, g_utf16_to_utf8 (filename, -1, NULL, NULL, NULL), HIWORD (ffi->dwFileVersionMS),
+                                               LOWORD (ffi->dwFileVersionMS), HIWORD (ffi->dwFileVersionLS), LOWORD (ffi->dwFileVersionLS)));
 
                                process_set_field_int (filever, "filemajorpart", HIWORD (ffi->dwFileVersionMS));
                                process_set_field_int (filever, "fileminorpart", LOWORD (ffi->dwFileVersionMS));
@@ -330,6 +361,9 @@ mono_w32process_get_fileversion (MonoObject *filever, gunichar2 *filename, MonoE
                                process_set_field_bool (filever, "ispatched", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PATCHED) != 0);
                                process_set_field_bool (filever, "isprivatebuild", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_PRIVATEBUILD) != 0);
                                process_set_field_bool (filever, "isspecialbuild", ((ffi->dwFileFlags & ffi->dwFileFlagsMask) & VS_FF_SPECIALBUILD) != 0);
+
+                               #undef LOWORD
+                               #undef HIWORD
                        }
                        g_free (query);
 
@@ -339,13 +373,13 @@ mono_w32process_get_fileversion (MonoObject *filever, gunichar2 *filename, MonoE
                                return;
                        }
 
-                       if (VerQueryValue (data, query, (gpointer *)&trans_data, &trans_size)) {
+                       if (mono_w32process_ver_query_value (data, query, (gpointer *)&trans_data, &trans_size)) {
                                /* use the first language ID we see */
                                if (trans_size >= 4) {
                                        LOGDEBUG (g_message("%s: %s has 0x%0x 0x%0x 0x%0x 0x%0x", __func__, g_utf16_to_utf8 (filename, -1, NULL, NULL, NULL), trans_data[0], trans_data[1], trans_data[2], trans_data[3]));
                                        lang = (trans_data[0]) | (trans_data[1] << 8) | (trans_data[2] << 16) | (trans_data[3] << 24);
-                                       /* Only give the lower 16 bits to VerLanguageName, as Windows gets confused otherwise  */
-                                       lang_count = VerLanguageName (lang & 0xFFFF, lang_buf, 128);
+                                       /* Only give the lower 16 bits to mono_w32process_ver_language_name, as Windows gets confused otherwise  */
+                                       lang_count = mono_w32process_ver_language_name (lang & 0xFFFF, lang_buf, 128);
                                        if (lang_count) {
                                                process_set_field_string (filever, "language", lang_buf, lang_count, error);
                                                return_if_nok (error);
@@ -363,7 +397,7 @@ mono_w32process_get_fileversion (MonoObject *filever, gunichar2 *filename, MonoE
                                }
 
                                /* And language seems to be set to en_US according to bug 374600 */
-                               lang_count = VerLanguageName (0x0409, lang_buf, 128);
+                               lang_count = mono_w32process_ver_language_name (0x0409, lang_buf, 128);
                                if (lang_count) {
                                        process_set_field_string (filever, "language", lang_buf, lang_count, error);
                                        return_if_nok (error);