3 * Windows icall support.
5 * Copyright 2016 Microsoft
6 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
11 #if defined(HOST_WIN32)
14 #include <mono/metadata/icall-internals.h>
15 #include <mono/utils/w32subset.h>
18 mono_icall_make_platform_path (gchar
*path
)
20 for (size_t i
= strlen (path
); i
> 0; i
--)
21 if (path
[i
-1] == '\\')
26 mono_icall_get_file_path_prefix (const gchar
*path
)
28 if (*path
== '/' && *(path
+ 1) == '/') {
36 mono_icall_module_get_hinstance (MonoImage
*image
)
38 if (image
&& m_image_is_module_handle (image
))
39 return image
->raw_data
;
41 return (gpointer
) (-1);
44 #if HAVE_API_SUPPORT_WIN32_GET_COMPUTER_NAME
46 mono_icall_get_machine_name (MonoError
*error
)
48 gunichar2 buf
[MAX_COMPUTERNAME_LENGTH
+ 1];
49 DWORD len
= G_N_ELEMENTS (buf
);
51 if (GetComputerNameW (buf
, &len
))
52 return mono_string_new_utf16_handle (mono_domain_get (), buf
, len
, error
);
53 return MONO_HANDLE_NEW (MonoString
, NULL
);
55 #elif !HAVE_EXTERN_DEFINED_WIN32_GET_COMPUTER_NAME
57 mono_icall_get_machine_name (MonoError
*error
)
59 g_unsupported_api ("GetComputerName");
60 return mono_string_new_handle (mono_domain_get (), "mono", error
);
65 mono_icall_get_platform (void)
72 mono_icall_get_new_line (MonoError
*error
)
74 return mono_string_new_handle (mono_domain_get (), "\r\n", error
);
78 mono_icall_is_64bit_os (void)
80 #if SIZEOF_VOID_P == 8
83 gboolean isWow64Process
= FALSE
;
84 if (IsWow64Process (GetCurrentProcess (), &isWow64Process
)) {
85 return (MonoBoolean
)isWow64Process
;
92 mono_icall_get_environment_variable_names (MonoError
*error
)
94 MonoArrayHandle names
;
102 env_strings
= GetEnvironmentStrings();
105 env_string
= env_strings
;
106 while (*env_string
!= '\0') {
107 /* weird case that MS seems to skip */
108 if (*env_string
!= '=')
110 while (*env_string
!= '\0')
116 domain
= mono_domain_get ();
117 names
= mono_array_new_handle (domain
, mono_defaults
.string_class
, n
, error
);
118 return_val_if_nok (error
, NULL_HANDLE_ARRAY
);
122 str
= MONO_HANDLE_NEW (MonoString
, NULL
);
123 env_string
= env_strings
;
124 while (*env_string
!= '\0') {
125 /* weird case that MS seems to skip */
126 if (*env_string
!= '=') {
127 equal_str
= wcschr(env_string
, '=');
129 MonoString
*s
= mono_string_new_utf16_checked (domain
, env_string
, (gint32
)(equal_str
- env_string
), error
);
130 goto_if_nok (error
, cleanup
);
131 MONO_HANDLE_ASSIGN_RAW (str
, s
);
133 mono_array_handle_setref (names
, n
, str
);
136 while (*env_string
!= '\0')
145 FreeEnvironmentStrings (env_strings
);
147 return NULL_HANDLE_ARRAY
;
151 #if HAVE_API_SUPPORT_WIN32_SH_GET_FOLDER_PATH
154 mono_icall_get_windows_folder_path (int folder
, MonoError
*error
)
157 #ifndef CSIDL_FLAG_CREATE
158 #define CSIDL_FLAG_CREATE 0x8000
161 WCHAR path
[MAX_PATH
];
162 /* Create directory if no existing */
163 if (SUCCEEDED (SHGetFolderPathW (NULL
, folder
| CSIDL_FLAG_CREATE
, NULL
, 0, path
))) {
167 return mono_string_new_utf16_handle (mono_domain_get (), path
, len
, error
);
169 return mono_string_new_handle (mono_domain_get (), "", error
);
171 #elif !HAVE_EXTERN_DEFINED_WIN32_SH_GET_FOLDER_PATH
173 mono_icall_get_windows_folder_path (int folder
, MonoError
*error
)
176 g_unsupported_api ("SHGetFolderPath");
177 return mono_string_new_handle (mono_domain_get (), "", error
);
181 #if HAVE_API_SUPPORT_WIN32_SEND_MESSAGE_TIMEOUT
183 ves_icall_System_Environment_BroadcastSettingChange (MonoError
*error
)
185 SendMessageTimeoutW (HWND_BROADCAST
, WM_SETTINGCHANGE
, (WPARAM
)NULL
, (LPARAM
)L
"Environment", SMTO_ABORTIFHUNG
, 2000, 0);
187 #elif !HAVE_EXTERN_DEFINED_WIN32_SEND_MESSAGE_TIMEOUT
189 ves_icall_System_Environment_BroadcastSettingChange (MonoError
*error
)
191 g_unsupported_api ("SendMessageTimeout");
192 mono_error_set_not_supported (error
, G_UNSUPPORTED_API
, "SendMessageTimeout");
193 SetLastError (ERROR_NOT_SUPPORTED
);
197 #if HAVE_API_SUPPORT_WIN32_WAIT_FOR_INPUT_IDLE
199 mono_icall_wait_for_input_idle (gpointer handle
, gint32 milliseconds
)
201 return WaitForInputIdle (handle
, milliseconds
);
203 #elif !HAVE_EXTERN_DEFINED_WIN32_WAIT_FOR_INPUT_IDLE
205 mono_icall_wait_for_input_idle (gpointer handle
, gint32 milliseconds
)
208 g_unsupported_api ("WaitForInputIdle");
209 mono_error_set_not_supported (error
, G_UNSUPPORTED_API
, "WaitForInputIdle");
210 mono_error_set_pending_exception (error
);
216 mono_icall_write_windows_debug_string (const gunichar2
*message
)
218 OutputDebugString (message
);
221 #endif /* HOST_WIN32 */