diff options
Diffstat (limited to 'src/w32.c')
-rw-r--r-- | src/w32.c | 583 |
1 files changed, 432 insertions, 151 deletions
diff --git a/src/w32.c b/src/w32.c index b89e5104dc0..26cfae7a6af 100644 --- a/src/w32.c +++ b/src/w32.c @@ -326,6 +326,9 @@ static BOOL g_b_init_set_file_security_a; static BOOL g_b_init_set_named_security_info_w; static BOOL g_b_init_set_named_security_info_a; static BOOL g_b_init_get_adapters_info; +static BOOL g_b_init_reg_open_key_ex_w; +static BOOL g_b_init_reg_query_value_ex_w; +static BOOL g_b_init_expand_environment_strings_w; BOOL g_b_init_compare_string_w; BOOL g_b_init_debug_break_process; @@ -504,6 +507,9 @@ typedef DWORD (WINAPI *GetAdaptersInfo_Proc) ( int (WINAPI *pMultiByteToWideChar)(UINT,DWORD,LPCSTR,int,LPWSTR,int); int (WINAPI *pWideCharToMultiByte)(UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL); DWORD multiByteToWideCharFlags; +typedef LONG (WINAPI *RegOpenKeyExW_Proc) (HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); +typedef LONG (WINAPI *RegQueryValueExW_Proc) (HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); +typedef DWORD (WINAPI *ExpandEnvironmentStringsW_Proc) (LPCWSTR,LPWSTR,DWORD); /* ** A utility function ** */ static BOOL @@ -529,8 +535,6 @@ static Lisp_Object ltime (ULONGLONG); /* Get total user and system times for get-internal-run-time. Returns a list of integers if the times are provided by the OS (NT derivatives), otherwise it returns the result of current-time. */ -Lisp_Object w32_get_internal_run_time (void); - Lisp_Object w32_get_internal_run_time (void) { @@ -570,8 +574,8 @@ open_process_token (HANDLE ProcessHandle, { g_b_init_open_process_token = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Open_Process_Token = - (OpenProcessToken_Proc) GetProcAddress (hm_advapi32, "OpenProcessToken"); + s_pfn_Open_Process_Token = (OpenProcessToken_Proc) + get_proc_addr (hm_advapi32, "OpenProcessToken"); } if (s_pfn_Open_Process_Token == NULL) { @@ -602,8 +606,8 @@ get_token_information (HANDLE TokenHandle, { g_b_init_get_token_information = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Token_Information = - (GetTokenInformation_Proc) GetProcAddress (hm_advapi32, "GetTokenInformation"); + s_pfn_Get_Token_Information = (GetTokenInformation_Proc) + get_proc_addr (hm_advapi32, "GetTokenInformation"); } if (s_pfn_Get_Token_Information == NULL) { @@ -638,8 +642,8 @@ lookup_account_sid (LPCTSTR lpSystemName, { g_b_init_lookup_account_sid = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Lookup_Account_Sid = - (LookupAccountSid_Proc) GetProcAddress (hm_advapi32, LookupAccountSid_Name); + s_pfn_Lookup_Account_Sid = (LookupAccountSid_Proc) + get_proc_addr (hm_advapi32, LookupAccountSid_Name); } if (s_pfn_Lookup_Account_Sid == NULL) { @@ -671,9 +675,8 @@ get_sid_sub_authority (PSID pSid, DWORD n) { g_b_init_get_sid_sub_authority = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Sid_Sub_Authority = - (GetSidSubAuthority_Proc) GetProcAddress ( - hm_advapi32, "GetSidSubAuthority"); + s_pfn_Get_Sid_Sub_Authority = (GetSidSubAuthority_Proc) + get_proc_addr (hm_advapi32, "GetSidSubAuthority"); } if (s_pfn_Get_Sid_Sub_Authority == NULL) { @@ -696,9 +699,8 @@ get_sid_sub_authority_count (PSID pSid) { g_b_init_get_sid_sub_authority_count = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Sid_Sub_Authority_Count = - (GetSidSubAuthorityCount_Proc) GetProcAddress ( - hm_advapi32, "GetSidSubAuthorityCount"); + s_pfn_Get_Sid_Sub_Authority_Count = (GetSidSubAuthorityCount_Proc) + get_proc_addr (hm_advapi32, "GetSidSubAuthorityCount"); } if (s_pfn_Get_Sid_Sub_Authority_Count == NULL) { @@ -727,9 +729,8 @@ get_security_info (HANDLE handle, { g_b_init_get_security_info = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Security_Info = - (GetSecurityInfo_Proc) GetProcAddress ( - hm_advapi32, "GetSecurityInfo"); + s_pfn_Get_Security_Info = (GetSecurityInfo_Proc) + get_proc_addr (hm_advapi32, "GetSecurityInfo"); } if (s_pfn_Get_Security_Info == NULL) { @@ -763,9 +764,8 @@ get_file_security (const char *lpFileName, { g_b_init_get_file_security_w = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_File_SecurityW = - (GetFileSecurityW_Proc) GetProcAddress (hm_advapi32, - "GetFileSecurityW"); + s_pfn_Get_File_SecurityW = (GetFileSecurityW_Proc) + get_proc_addr (hm_advapi32, "GetFileSecurityW"); } if (s_pfn_Get_File_SecurityW == NULL) { @@ -785,9 +785,8 @@ get_file_security (const char *lpFileName, { g_b_init_get_file_security_a = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_File_SecurityA = - (GetFileSecurityA_Proc) GetProcAddress (hm_advapi32, - "GetFileSecurityA"); + s_pfn_Get_File_SecurityA = (GetFileSecurityA_Proc) + get_proc_addr (hm_advapi32, "GetFileSecurityA"); } if (s_pfn_Get_File_SecurityA == NULL) { @@ -822,9 +821,8 @@ set_file_security (const char *lpFileName, { g_b_init_set_file_security_w = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Set_File_SecurityW = - (SetFileSecurityW_Proc) GetProcAddress (hm_advapi32, - "SetFileSecurityW"); + s_pfn_Set_File_SecurityW = (SetFileSecurityW_Proc) + get_proc_addr (hm_advapi32, "SetFileSecurityW"); } if (s_pfn_Set_File_SecurityW == NULL) { @@ -843,9 +841,8 @@ set_file_security (const char *lpFileName, { g_b_init_set_file_security_a = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Set_File_SecurityA = - (SetFileSecurityA_Proc) GetProcAddress (hm_advapi32, - "SetFileSecurityA"); + s_pfn_Set_File_SecurityA = (SetFileSecurityA_Proc) + get_proc_addr (hm_advapi32, "SetFileSecurityA"); } if (s_pfn_Set_File_SecurityA == NULL) { @@ -883,9 +880,8 @@ set_named_security_info (LPCTSTR lpObjectName, { g_b_init_set_named_security_info_w = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Set_Named_Security_InfoW = - (SetNamedSecurityInfoW_Proc) GetProcAddress (hm_advapi32, - "SetNamedSecurityInfoW"); + s_pfn_Set_Named_Security_InfoW = (SetNamedSecurityInfoW_Proc) + get_proc_addr (hm_advapi32, "SetNamedSecurityInfoW"); } if (s_pfn_Set_Named_Security_InfoW == NULL) { @@ -905,9 +901,8 @@ set_named_security_info (LPCTSTR lpObjectName, { g_b_init_set_named_security_info_a = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Set_Named_Security_InfoA = - (SetNamedSecurityInfoA_Proc) GetProcAddress (hm_advapi32, - "SetNamedSecurityInfoA"); + s_pfn_Set_Named_Security_InfoA = (SetNamedSecurityInfoA_Proc) + get_proc_addr (hm_advapi32, "SetNamedSecurityInfoA"); } if (s_pfn_Set_Named_Security_InfoA == NULL) { @@ -937,9 +932,8 @@ get_security_descriptor_owner (PSECURITY_DESCRIPTOR pSecurityDescriptor, { g_b_init_get_security_descriptor_owner = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Security_Descriptor_Owner = - (GetSecurityDescriptorOwner_Proc) GetProcAddress ( - hm_advapi32, "GetSecurityDescriptorOwner"); + s_pfn_Get_Security_Descriptor_Owner = (GetSecurityDescriptorOwner_Proc) + get_proc_addr (hm_advapi32, "GetSecurityDescriptorOwner"); } if (s_pfn_Get_Security_Descriptor_Owner == NULL) { @@ -966,9 +960,8 @@ get_security_descriptor_group (PSECURITY_DESCRIPTOR pSecurityDescriptor, { g_b_init_get_security_descriptor_group = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Security_Descriptor_Group = - (GetSecurityDescriptorGroup_Proc) GetProcAddress ( - hm_advapi32, "GetSecurityDescriptorGroup"); + s_pfn_Get_Security_Descriptor_Group = (GetSecurityDescriptorGroup_Proc) + get_proc_addr (hm_advapi32, "GetSecurityDescriptorGroup"); } if (s_pfn_Get_Security_Descriptor_Group == NULL) { @@ -996,9 +989,8 @@ get_security_descriptor_dacl (PSECURITY_DESCRIPTOR pSecurityDescriptor, { g_b_init_get_security_descriptor_dacl = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Security_Descriptor_Dacl = - (GetSecurityDescriptorDacl_Proc) GetProcAddress ( - hm_advapi32, "GetSecurityDescriptorDacl"); + s_pfn_Get_Security_Descriptor_Dacl = (GetSecurityDescriptorDacl_Proc) + get_proc_addr (hm_advapi32, "GetSecurityDescriptorDacl"); } if (s_pfn_Get_Security_Descriptor_Dacl == NULL) { @@ -1023,9 +1015,8 @@ is_valid_sid (PSID sid) { g_b_init_is_valid_sid = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Is_Valid_Sid = - (IsValidSid_Proc) GetProcAddress ( - hm_advapi32, "IsValidSid"); + s_pfn_Is_Valid_Sid = (IsValidSid_Proc) + get_proc_addr (hm_advapi32, "IsValidSid"); } if (s_pfn_Is_Valid_Sid == NULL) { @@ -1047,9 +1038,8 @@ equal_sid (PSID sid1, PSID sid2) { g_b_init_equal_sid = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Equal_Sid = - (EqualSid_Proc) GetProcAddress ( - hm_advapi32, "EqualSid"); + s_pfn_Equal_Sid = (EqualSid_Proc) + get_proc_addr (hm_advapi32, "EqualSid"); } if (s_pfn_Equal_Sid == NULL) { @@ -1071,9 +1061,8 @@ get_length_sid (PSID sid) { g_b_init_get_length_sid = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Get_Length_Sid = - (GetLengthSid_Proc) GetProcAddress ( - hm_advapi32, "GetLengthSid"); + s_pfn_Get_Length_Sid = (GetLengthSid_Proc) + get_proc_addr (hm_advapi32, "GetLengthSid"); } if (s_pfn_Get_Length_Sid == NULL) { @@ -1095,9 +1084,8 @@ copy_sid (DWORD destlen, PSID dest, PSID src) { g_b_init_copy_sid = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Copy_Sid = - (CopySid_Proc) GetProcAddress ( - hm_advapi32, "CopySid"); + s_pfn_Copy_Sid = (CopySid_Proc) + get_proc_addr (hm_advapi32, "CopySid"); } if (s_pfn_Copy_Sid == NULL) { @@ -1121,9 +1109,9 @@ get_native_system_info (LPSYSTEM_INFO lpSystemInfo) if (g_b_init_get_native_system_info == 0) { g_b_init_get_native_system_info = 1; - s_pfn_Get_Native_System_Info = - (GetNativeSystemInfo_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"), - "GetNativeSystemInfo"); + s_pfn_Get_Native_System_Info = (GetNativeSystemInfo_Proc) + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "GetNativeSystemInfo"); } if (s_pfn_Get_Native_System_Info != NULL) s_pfn_Get_Native_System_Info (lpSystemInfo); @@ -1145,9 +1133,9 @@ get_system_times (LPFILETIME lpIdleTime, if (g_b_init_get_system_times == 0) { g_b_init_get_system_times = 1; - s_pfn_Get_System_times = - (GetSystemTimes_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"), - "GetSystemTimes"); + s_pfn_Get_System_times = (GetSystemTimes_Proc) + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "GetSystemTimes"); } if (s_pfn_Get_System_times == NULL) return FALSE; @@ -1175,9 +1163,9 @@ create_symbolic_link (LPCSTR lpSymlinkFilename, if (g_b_init_create_symbolic_link_w == 0) { g_b_init_create_symbolic_link_w = 1; - s_pfn_Create_Symbolic_LinkW = - (CreateSymbolicLinkW_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"), - "CreateSymbolicLinkW"); + s_pfn_Create_Symbolic_LinkW = (CreateSymbolicLinkW_Proc) + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "CreateSymbolicLinkW"); } if (s_pfn_Create_Symbolic_LinkW == NULL) { @@ -1210,9 +1198,9 @@ create_symbolic_link (LPCSTR lpSymlinkFilename, if (g_b_init_create_symbolic_link_a == 0) { g_b_init_create_symbolic_link_a = 1; - s_pfn_Create_Symbolic_LinkA = - (CreateSymbolicLinkA_Proc)GetProcAddress (GetModuleHandle ("kernel32.dll"), - "CreateSymbolicLinkA"); + s_pfn_Create_Symbolic_LinkA = (CreateSymbolicLinkA_Proc) + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "CreateSymbolicLinkA"); } if (s_pfn_Create_Symbolic_LinkA == NULL) { @@ -1255,9 +1243,9 @@ is_valid_security_descriptor (PSECURITY_DESCRIPTOR pSecurityDescriptor) if (g_b_init_is_valid_security_descriptor == 0) { g_b_init_is_valid_security_descriptor = 1; - s_pfn_Is_Valid_Security_Descriptor_Proc = - (IsValidSecurityDescriptor_Proc)GetProcAddress (GetModuleHandle ("Advapi32.dll"), - "IsValidSecurityDescriptor"); + s_pfn_Is_Valid_Security_Descriptor_Proc = (IsValidSecurityDescriptor_Proc) + get_proc_addr (GetModuleHandle ("Advapi32.dll"), + "IsValidSecurityDescriptor"); } if (s_pfn_Is_Valid_Security_Descriptor_Proc == NULL) { @@ -1289,12 +1277,14 @@ convert_sd_to_sddl (PSECURITY_DESCRIPTOR SecurityDescriptor, g_b_init_convert_sd_to_sddl = 1; #ifdef _UNICODE s_pfn_Convert_SD_To_SDDL = - (ConvertSecurityDescriptorToStringSecurityDescriptor_Proc)GetProcAddress (GetModuleHandle ("Advapi32.dll"), - "ConvertSecurityDescriptorToStringSecurityDescriptorW"); + (ConvertSecurityDescriptorToStringSecurityDescriptor_Proc) + get_proc_addr (GetModuleHandle ("Advapi32.dll"), + "ConvertSecurityDescriptorToStringSecurityDescriptorW"); #else s_pfn_Convert_SD_To_SDDL = - (ConvertSecurityDescriptorToStringSecurityDescriptor_Proc)GetProcAddress (GetModuleHandle ("Advapi32.dll"), - "ConvertSecurityDescriptorToStringSecurityDescriptorA"); + (ConvertSecurityDescriptorToStringSecurityDescriptor_Proc) + get_proc_addr (GetModuleHandle ("Advapi32.dll"), + "ConvertSecurityDescriptorToStringSecurityDescriptorA"); #endif } if (s_pfn_Convert_SD_To_SDDL == NULL) @@ -1332,12 +1322,14 @@ convert_sddl_to_sd (LPCTSTR StringSecurityDescriptor, g_b_init_convert_sddl_to_sd = 1; #ifdef _UNICODE s_pfn_Convert_SDDL_To_SD = - (ConvertStringSecurityDescriptorToSecurityDescriptor_Proc)GetProcAddress (GetModuleHandle ("Advapi32.dll"), - "ConvertStringSecurityDescriptorToSecurityDescriptorW"); + (ConvertStringSecurityDescriptorToSecurityDescriptor_Proc) + get_proc_addr (GetModuleHandle ("Advapi32.dll"), + "ConvertStringSecurityDescriptorToSecurityDescriptorW"); #else s_pfn_Convert_SDDL_To_SD = - (ConvertStringSecurityDescriptorToSecurityDescriptor_Proc)GetProcAddress (GetModuleHandle ("Advapi32.dll"), - "ConvertStringSecurityDescriptorToSecurityDescriptorA"); + (ConvertStringSecurityDescriptorToSecurityDescriptor_Proc) + get_proc_addr (GetModuleHandle ("Advapi32.dll"), + "ConvertStringSecurityDescriptorToSecurityDescriptorA"); #endif } if (s_pfn_Convert_SDDL_To_SD == NULL) @@ -1369,13 +1361,86 @@ get_adapters_info (PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen) hm_iphlpapi = LoadLibrary ("Iphlpapi.dll"); if (hm_iphlpapi) s_pfn_Get_Adapters_Info = (GetAdaptersInfo_Proc) - GetProcAddress (hm_iphlpapi, "GetAdaptersInfo"); + get_proc_addr (hm_iphlpapi, "GetAdaptersInfo"); } if (s_pfn_Get_Adapters_Info == NULL) return ERROR_NOT_SUPPORTED; return s_pfn_Get_Adapters_Info (pAdapterInfo, pOutBufLen); } +static LONG WINAPI +reg_open_key_ex_w (HKEY hkey, LPCWSTR lpSubKey, DWORD ulOptions, + REGSAM samDesired, PHKEY phkResult) +{ + static RegOpenKeyExW_Proc s_pfn_Reg_Open_Key_Ex_w = NULL; + HMODULE hm_advapi32 = NULL; + + if (is_windows_9x () == TRUE) + return ERROR_NOT_SUPPORTED; + + if (g_b_init_reg_open_key_ex_w == 0) + { + g_b_init_reg_open_key_ex_w = 1; + hm_advapi32 = LoadLibrary ("Advapi32.dll"); + if (hm_advapi32) + s_pfn_Reg_Open_Key_Ex_w = (RegOpenKeyExW_Proc) + get_proc_addr (hm_advapi32, "RegOpenKeyExW"); + } + if (s_pfn_Reg_Open_Key_Ex_w == NULL) + return ERROR_NOT_SUPPORTED; + return s_pfn_Reg_Open_Key_Ex_w (hkey, lpSubKey, ulOptions, + samDesired, phkResult); +} + +static LONG WINAPI +reg_query_value_ex_w (HKEY hkey, LPCWSTR lpValueName, LPDWORD lpReserved, + LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData) +{ + static RegQueryValueExW_Proc s_pfn_Reg_Query_Value_Ex_w = NULL; + HMODULE hm_advapi32 = NULL; + + if (is_windows_9x () == TRUE) + return ERROR_NOT_SUPPORTED; + + if (g_b_init_reg_query_value_ex_w == 0) + { + g_b_init_reg_query_value_ex_w = 1; + hm_advapi32 = LoadLibrary ("Advapi32.dll"); + if (hm_advapi32) + s_pfn_Reg_Query_Value_Ex_w = (RegQueryValueExW_Proc) + get_proc_addr (hm_advapi32, "RegQueryValueExW"); + } + if (s_pfn_Reg_Query_Value_Ex_w == NULL) + return ERROR_NOT_SUPPORTED; + return s_pfn_Reg_Query_Value_Ex_w (hkey, lpValueName, lpReserved, + lpType, lpData, lpcbData); +} + +static DWORD WINAPI +expand_environment_strings_w (LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize) +{ + static ExpandEnvironmentStringsW_Proc s_pfn_Expand_Environment_Strings_w = NULL; + HMODULE hm_kernel32 = NULL; + + if (is_windows_9x () == TRUE) + return ERROR_NOT_SUPPORTED; + + if (g_b_init_expand_environment_strings_w == 0) + { + g_b_init_expand_environment_strings_w = 1; + hm_kernel32 = LoadLibrary ("Kernel32.dll"); + if (hm_kernel32) + s_pfn_Expand_Environment_Strings_w = (ExpandEnvironmentStringsW_Proc) + get_proc_addr (hm_kernel32, "ExpandEnvironmentStringsW"); + } + if (s_pfn_Expand_Environment_Strings_w == NULL) + { + errno = ENOSYS; + return FALSE; + } + return s_pfn_Expand_Environment_Strings_w (lpSrc, lpDst, nSize); +} + /* Return 1 if P is a valid pointer to an object of size SIZE. Return @@ -1978,7 +2043,9 @@ getpwuid (unsigned uid) struct group * getgrgid (gid_t gid) { - return &dflt_group; + if (gid == dflt_passwd.pw_gid) + return &dflt_group; + return NULL; } struct passwd * @@ -2728,7 +2795,8 @@ init_environment (char ** argv) MSIE 5. */ ShGetFolderPath_fn get_folder_path; get_folder_path = (ShGetFolderPath_fn) - GetProcAddress (GetModuleHandle ("shell32.dll"), "SHGetFolderPathA"); + get_proc_addr (GetModuleHandle ("shell32.dll"), + "SHGetFolderPathA"); if (get_folder_path != NULL) { @@ -6560,8 +6628,8 @@ create_toolhelp32_snapshot (DWORD Flags, DWORD Ignored) { g_b_init_create_toolhelp32_snapshot = 1; s_pfn_Create_Toolhelp32_Snapshot = (CreateToolhelp32Snapshot_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "CreateToolhelp32Snapshot"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "CreateToolhelp32Snapshot"); } if (s_pfn_Create_Toolhelp32_Snapshot == NULL) { @@ -6579,8 +6647,8 @@ process32_first (HANDLE hSnapshot, LPPROCESSENTRY32 lppe) { g_b_init_process32_first = 1; s_pfn_Process32_First = (Process32First_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "Process32First"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "Process32First"); } if (s_pfn_Process32_First == NULL) { @@ -6598,8 +6666,8 @@ process32_next (HANDLE hSnapshot, LPPROCESSENTRY32 lppe) { g_b_init_process32_next = 1; s_pfn_Process32_Next = (Process32Next_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "Process32Next"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "Process32Next"); } if (s_pfn_Process32_Next == NULL) { @@ -6625,8 +6693,8 @@ open_thread_token (HANDLE ThreadHandle, { g_b_init_open_thread_token = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Open_Thread_Token = - (OpenThreadToken_Proc) GetProcAddress (hm_advapi32, "OpenThreadToken"); + s_pfn_Open_Thread_Token = (OpenThreadToken_Proc) + get_proc_addr (hm_advapi32, "OpenThreadToken"); } if (s_pfn_Open_Thread_Token == NULL) { @@ -6655,8 +6723,8 @@ impersonate_self (SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) { g_b_init_impersonate_self = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Impersonate_Self = - (ImpersonateSelf_Proc) GetProcAddress (hm_advapi32, "ImpersonateSelf"); + s_pfn_Impersonate_Self = (ImpersonateSelf_Proc) + get_proc_addr (hm_advapi32, "ImpersonateSelf"); } if (s_pfn_Impersonate_Self == NULL) { @@ -6678,8 +6746,8 @@ revert_to_self (void) { g_b_init_revert_to_self = 1; hm_advapi32 = LoadLibrary ("Advapi32.dll"); - s_pfn_Revert_To_Self = - (RevertToSelf_Proc) GetProcAddress (hm_advapi32, "RevertToSelf"); + s_pfn_Revert_To_Self = (RevertToSelf_Proc) + get_proc_addr (hm_advapi32, "RevertToSelf"); } if (s_pfn_Revert_To_Self == NULL) { @@ -6705,7 +6773,7 @@ get_process_memory_info (HANDLE h_proc, hm_psapi = LoadLibrary ("Psapi.dll"); if (hm_psapi) s_pfn_Get_Process_Memory_Info = (GetProcessMemoryInfo_Proc) - GetProcAddress (hm_psapi, "GetProcessMemoryInfo"); + get_proc_addr (hm_psapi, "GetProcessMemoryInfo"); } if (s_pfn_Get_Process_Memory_Info == NULL) { @@ -6730,8 +6798,8 @@ get_process_working_set_size (HANDLE h_proc, { g_b_init_get_process_working_set_size = 1; s_pfn_Get_Process_Working_Set_Size = (GetProcessWorkingSetSize_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "GetProcessWorkingSetSize"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "GetProcessWorkingSetSize"); } if (s_pfn_Get_Process_Working_Set_Size == NULL) { @@ -6753,8 +6821,8 @@ global_memory_status (MEMORYSTATUS *buf) { g_b_init_global_memory_status = 1; s_pfn_Global_Memory_Status = (GlobalMemoryStatus_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "GlobalMemoryStatus"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "GlobalMemoryStatus"); } if (s_pfn_Global_Memory_Status == NULL) { @@ -6776,8 +6844,8 @@ global_memory_status_ex (MEMORY_STATUS_EX *buf) { g_b_init_global_memory_status_ex = 1; s_pfn_Global_Memory_Status_Ex = (GlobalMemoryStatusEx_Proc) - GetProcAddress (GetModuleHandle ("kernel32.dll"), - "GlobalMemoryStatusEx"); + get_proc_addr (GetModuleHandle ("kernel32.dll"), + "GlobalMemoryStatusEx"); } if (s_pfn_Global_Memory_Status_Ex == NULL) { @@ -6805,7 +6873,7 @@ list_system_processes (void) res = process32_next (h_snapshot, &proc_entry)) { proc_id = proc_entry.th32ProcessID; - proclist = Fcons (make_fixnum_or_float (proc_id), proclist); + proclist = Fcons (INT_TO_INTEGER (proc_id), proclist); } CloseHandle (h_snapshot); @@ -6963,8 +7031,8 @@ system_process_attributes (Lisp_Object pid) double pcpu; BOOL result = FALSE; - CHECK_NUMBER_OR_FLOAT (pid); - proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid); + CHECK_NUMBER (pid); + proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XFIXNUM (pid); h_snapshot = create_toolhelp32_snapshot (TH32CS_SNAPPROCESS, 0); @@ -6993,12 +7061,12 @@ system_process_attributes (Lisp_Object pid) } attrs = Fcons (Fcons (Qcomm, decoded_cmd), attrs); attrs = Fcons (Fcons (Qppid, - make_fixnum_or_float (pe.th32ParentProcessID)), + INT_TO_INTEGER (pe.th32ParentProcessID)), attrs); - attrs = Fcons (Fcons (Qpri, make_number (pe.pcPriClassBase)), + attrs = Fcons (Fcons (Qpri, make_fixnum (pe.pcPriClassBase)), attrs); attrs = Fcons (Fcons (Qthcount, - make_fixnum_or_float (pe.cntThreads)), + INT_TO_INTEGER (pe.cntThreads)), attrs); found_proc = 1; break; @@ -7146,12 +7214,12 @@ system_process_attributes (Lisp_Object pid) CloseHandle (token); } - attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (euid)), attrs); + attrs = Fcons (Fcons (Qeuid, INT_TO_INTEGER (euid)), attrs); tem = make_unibyte_string (uname, ulength); attrs = Fcons (Fcons (Quser, code_convert_string_norecord (tem, Vlocale_coding_system, 0)), attrs); - attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (egid)), attrs); + attrs = Fcons (Fcons (Qegid, INT_TO_INTEGER (egid)), attrs); tem = make_unibyte_string (gname, glength); attrs = Fcons (Fcons (Qgroup, code_convert_string_norecord (tem, Vlocale_coding_system, 0)), @@ -7182,12 +7250,12 @@ system_process_attributes (Lisp_Object pid) SIZE_T rss = mem_ex.WorkingSetSize / 1024; attrs = Fcons (Fcons (Qmajflt, - make_fixnum_or_float (mem_ex.PageFaultCount)), + INT_TO_INTEGER (mem_ex.PageFaultCount)), attrs); attrs = Fcons (Fcons (Qvsize, - make_fixnum_or_float (mem_ex.PrivateUsage / 1024)), + INT_TO_INTEGER (mem_ex.PrivateUsage / 1024)), attrs); - attrs = Fcons (Fcons (Qrss, make_fixnum_or_float (rss)), attrs); + attrs = Fcons (Fcons (Qrss, INT_TO_INTEGER (rss)), attrs); if (totphys) attrs = Fcons (Fcons (Qpmem, make_float (100. * rss / totphys)), attrs); } @@ -7197,9 +7265,9 @@ system_process_attributes (Lisp_Object pid) SIZE_T rss = mem_ex.WorkingSetSize / 1024; attrs = Fcons (Fcons (Qmajflt, - make_fixnum_or_float (mem.PageFaultCount)), + INT_TO_INTEGER (mem.PageFaultCount)), attrs); - attrs = Fcons (Fcons (Qrss, make_fixnum_or_float (rss)), attrs); + attrs = Fcons (Fcons (Qrss, INT_TO_INTEGER (rss)), attrs); if (totphys) attrs = Fcons (Fcons (Qpmem, make_float (100. * rss / totphys)), attrs); } @@ -7208,7 +7276,7 @@ system_process_attributes (Lisp_Object pid) { DWORD rss = maxrss / 1024; - attrs = Fcons (Fcons (Qrss, make_fixnum_or_float (maxrss / 1024)), attrs); + attrs = Fcons (Fcons (Qrss, INT_TO_INTEGER (maxrss / 1024)), attrs); if (totphys) attrs = Fcons (Fcons (Qpmem, make_float (100. * rss / totphys)), attrs); } @@ -7350,8 +7418,8 @@ init_winsock (int load_now) return TRUE; pfn_SetHandleInformation - = (void *) GetProcAddress (GetModuleHandle ("kernel32.dll"), - "SetHandleInformation"); + = (void *) get_proc_addr (GetModuleHandle ("kernel32.dll"), + "SetHandleInformation"); winsock_lib = LoadLibrary ("Ws2_32.dll"); @@ -7360,7 +7428,7 @@ init_winsock (int load_now) /* dynamically link to socket functions */ #define LOAD_PROC(fn) \ - if ((pfn_##fn = (void *) GetProcAddress (winsock_lib, #fn)) == NULL) \ + if ((pfn_##fn = (void *) get_proc_addr (winsock_lib, #fn)) == NULL) \ goto fail; LOAD_PROC (WSAStartup); @@ -7395,8 +7463,8 @@ init_winsock (int load_now) #undef LOAD_PROC /* Try loading functions not available before XP. */ - pfn_getaddrinfo = (void *) GetProcAddress (winsock_lib, "getaddrinfo"); - pfn_freeaddrinfo = (void *) GetProcAddress (winsock_lib, "freeaddrinfo"); + pfn_getaddrinfo = (void *) get_proc_addr (winsock_lib, "getaddrinfo"); + pfn_freeaddrinfo = (void *) get_proc_addr (winsock_lib, "freeaddrinfo"); /* Paranoia: these two functions should go together, so if one is absent, we cannot use the other. */ if (pfn_getaddrinfo == NULL) @@ -8391,13 +8459,14 @@ _sys_read_ahead (int fd) { rc = _read (fd, &cp->chr, sizeof (char)); - /* Give subprocess time to buffer some more output for us before - reporting that input is available; we need this because Windows 95 - connects DOS programs to pipes by making the pipe appear to be - the normal console stdout - as a result most DOS programs will - write to stdout without buffering, ie. one character at a - time. Even some W32 programs do this - "dir" in a command - shell on NT is very slow if we don't do this. */ + /* Optionally give subprocess time to buffer some more output + for us before reporting that input is available; we may need + this because Windows 9X connects DOS programs to pipes by + making the pipe appear to be the normal console stdout -- as + a result most DOS programs will write to stdout without + buffering, i.e., one character at a time. Even some W32 + programs do this -- "dir" in a command shell on NT is very + slow if we don't do this. */ if (rc > 0) { int wait = w32_pipe_read_delay; @@ -9135,7 +9204,7 @@ network_interface_get_info (Lisp_Object ifname) res); else if (strcmp (namebuf, SSDATA (ifname)) == 0) { - Lisp_Object hwaddr = Fmake_vector (make_number (6), Qnil); + Lisp_Object hwaddr = Fmake_vector (make_fixnum (6), Qnil); register struct Lisp_Vector *p = XVECTOR (hwaddr); Lisp_Object flags = Qnil; int n; @@ -9164,11 +9233,11 @@ network_interface_get_info (Lisp_Object ifname) /* Hardware address and its family. */ for (n = 0; n < adapter->AddressLength; n++) - p->contents[n] = make_number ((int) adapter->Address[n]); + p->contents[n] = make_fixnum ((int) adapter->Address[n]); /* Windows does not support AF_LINK or AF_PACKET family of addresses. Use an arbitrary family number that is identical to what GNU/Linux returns. */ - res = Fcons (Fcons (make_number (1), hwaddr), res); + res = Fcons (Fcons (make_fixnum (1), hwaddr), res); /* Network mask. */ sa.sin_family = AF_INET; @@ -9230,9 +9299,9 @@ network_interface_get_info (Lisp_Object ifname) Fcons (intern ("up"), Qnil))), Qnil); /* 772 is what 3 different GNU/Linux systems report for the loopback interface. */ - res = Fcons (Fcons (make_number (772), - Fmake_vector (make_number (6), - make_number (0))), + res = Fcons (Fcons (make_fixnum (772), + Fmake_vector (make_fixnum (6), + make_fixnum (0))), res); sa.sin_addr.s_addr = sys_inet_addr ("255.0.0.0"); res = Fcons (conv_sockaddr_to_lisp ((struct sockaddr *) &sa, @@ -9270,6 +9339,215 @@ network_interface_info (Lisp_Object ifname) } +/* Workhorse for w32-read-registry, which see. */ +Lisp_Object +w32_read_registry (HKEY rootkey, Lisp_Object lkey, Lisp_Object lname) +{ + HKEY hkey = NULL; + LONG status; + DWORD vsize, vtype; + LPBYTE pvalue; + Lisp_Object val, retval; + const char *key, *value_name = NULL; + /* The following sizes are according to size limitations + documented in MSDN. */ + wchar_t key_w[255+1]; + wchar_t value_w[16*1024+1]; + bool use_unicode = is_windows_9x () == 0; + + if (use_unicode) + { + Lisp_Object encoded_key, encoded_vname; + + /* Convert input strings to UTF-16. */ + encoded_key = code_convert_string_norecord (lkey, Qutf_16le, 1); + memcpy (key_w, SSDATA (encoded_key), SBYTES (encoded_key)); + /* wchar_t strings need to be terminated by 2 null bytes. */ + key_w [SBYTES (encoded_key)/2] = L'\0'; + encoded_vname = code_convert_string_norecord (lname, Qutf_16le, 1); + memcpy (value_w, SSDATA (encoded_vname), SBYTES (encoded_vname)); + value_w[SBYTES (encoded_vname)/2] = L'\0'; + + /* Mirror the slashes, if required. */ + for (int i = 0; i < SBYTES (encoded_key)/2; i++) + { + if (key_w[i] == L'/') + key_w[i] = L'\\'; + } + if ((status = reg_open_key_ex_w (rootkey, key_w, 0, + KEY_READ, &hkey)) == ERROR_NOT_SUPPORTED + || (status = reg_query_value_ex_w (hkey, value_w, NULL, NULL, NULL, + &vsize)) == ERROR_NOT_SUPPORTED + || status != ERROR_SUCCESS) + { + if (hkey) + RegCloseKey (hkey); + if (status != ERROR_NOT_SUPPORTED) + return Qnil; + use_unicode = 0; /* fall back to non-Unicode calls */ + } + } + if (!use_unicode) + { + /* Need to copy LKEY because we are going to modify it. */ + Lisp_Object local_lkey = Fcopy_sequence (lkey); + + /* Mirror the slashes. Note: this has to be done before + encoding, because after encoding we cannot guarantee that a + slash '/' always stands for itself, it could be part of some + multibyte sequence. */ + for (int i = 0; i < SBYTES (local_lkey); i++) + { + if (SSDATA (local_lkey)[i] == '/') + SSDATA (local_lkey)[i] = '\\'; + } + + key = SSDATA (ENCODE_SYSTEM (local_lkey)); + value_name = SSDATA (ENCODE_SYSTEM (lname)); + + if ((status = RegOpenKeyEx (rootkey, key, 0, + KEY_READ, &hkey)) != ERROR_SUCCESS + || (status = RegQueryValueEx (hkey, value_name, NULL, + NULL, NULL, &vsize)) != ERROR_SUCCESS) + { + if (hkey) + RegCloseKey (hkey); + return Qnil; + } + } + + pvalue = xzalloc (vsize); + if (use_unicode) + status = reg_query_value_ex_w (hkey, value_w, NULL, &vtype, pvalue, &vsize); + else + status = RegQueryValueEx (hkey, value_name, NULL, &vtype, pvalue, &vsize); + if (status != ERROR_SUCCESS) + { + xfree (pvalue); + RegCloseKey (hkey); + return Qnil; + } + + switch (vtype) + { + case REG_NONE: + retval = Qt; + break; + case REG_DWORD: + retval = INT_TO_INTEGER (*((DWORD *)pvalue)); + break; + case REG_QWORD: + retval = INT_TO_INTEGER (*((long long *)pvalue)); + break; + case REG_BINARY: + { + int i; + unsigned char *dbuf = (unsigned char *)pvalue; + + val = make_uninit_vector (vsize); + for (i = 0; i < vsize; i++) + ASET (val, i, make_fixnum (dbuf[i])); + + retval = val; + break; + } + case REG_SZ: + if (use_unicode) + { + /* pvalue ends with 2 null bytes, but we need only one, + and AUTO_STRING_WITH_LEN will add it. */ + if (pvalue[vsize - 1] == '\0') + vsize -= 2; + AUTO_STRING_WITH_LEN (sval, (char *)pvalue, vsize); + retval = from_unicode (sval); + } + else + { + /* Don't waste a byte on the terminating null character, + since make_unibyte_string will add one anyway. */ + if (pvalue[vsize - 1] == '\0') + vsize--; + retval = DECODE_SYSTEM (make_unibyte_string (pvalue, vsize)); + } + break; + case REG_EXPAND_SZ: + if (use_unicode) + { + wchar_t expanded_w[32*1024]; + DWORD dsize = sizeof (expanded_w) / 2; + DWORD produced = expand_environment_strings_w ((wchar_t *)pvalue, + expanded_w, + dsize); + if (produced > 0 && produced < dsize) + { + AUTO_STRING_WITH_LEN (sval, (char *)expanded_w, + produced * 2 - 2); + retval = from_unicode (sval); + } + else + { + if (pvalue[vsize - 1] == '\0') + vsize -= 2; + AUTO_STRING_WITH_LEN (sval, (char *)pvalue, vsize); + retval = from_unicode (sval); + } + } + else + { + char expanded[32*1024]; /* size limitation according to MSDN */ + DWORD produced = ExpandEnvironmentStrings ((char *)pvalue, + expanded, + sizeof (expanded)); + if (produced > 0 && produced < sizeof (expanded)) + retval = make_unibyte_string (expanded, produced - 1); + else + { + if (pvalue[vsize - 1] == '\0') + vsize--; + retval = make_unibyte_string (pvalue, vsize); + } + + retval = DECODE_SYSTEM (retval); + } + break; + case REG_MULTI_SZ: + if (use_unicode) + { + wchar_t *wp = (wchar_t *)pvalue; + + val = Qnil; + do { + size_t wslen = wcslen (wp); + AUTO_STRING_WITH_LEN (sval, (char *)wp, wslen * 2); + val = Fcons (from_unicode (sval), val); + wp += wslen + 1; + } while (*wp); + } + else + { + char *p = (char *)pvalue; + + val = Qnil; + do { + size_t slen = strlen (p); + + val = Fcons (DECODE_SYSTEM (make_unibyte_string (p, slen)), val); + p += slen + 1; + } while (*p); + } + + retval = Fnreverse (val); + break; + default: + error ("unsupported registry data type: %d", (int)vtype); + } + + xfree (pvalue); + RegCloseKey (hkey); + return retval; +} + + /* The Windows CRT functions are "optimized for speed", so they don't check for timezone and DST changes if they were last called less than 1 minute ago (see http://support.microsoft.com/kb/821231). So @@ -9604,10 +9882,10 @@ maybe_load_unicows_dll (void) pointers, and assign the correct addresses to these pointers at program startup (see emacs.c, which calls this function early on). */ - pMultiByteToWideChar = - (MultiByteToWideChar_Proc)GetProcAddress (ret, "MultiByteToWideChar"); - pWideCharToMultiByte = - (WideCharToMultiByte_Proc)GetProcAddress (ret, "WideCharToMultiByte"); + pMultiByteToWideChar = (MultiByteToWideChar_Proc) + get_proc_addr (ret, "MultiByteToWideChar"); + pWideCharToMultiByte = (WideCharToMultiByte_Proc) + get_proc_addr (ret, "WideCharToMultiByte"); multiByteToWideCharFlags = MB_ERR_INVALID_CHARS; return ret; } @@ -9658,7 +9936,7 @@ globals_of_w32 (void) HMODULE kernel32 = GetModuleHandle ("kernel32.dll"); get_process_times_fn = (GetProcessTimes_Proc) - GetProcAddress (kernel32, "GetProcessTimes"); + get_proc_addr (kernel32, "GetProcessTimes"); DEFSYM (QCloaded_from, ":loaded-from"); @@ -9700,6 +9978,9 @@ globals_of_w32 (void) g_b_init_set_named_security_info_w = 0; g_b_init_set_named_security_info_a = 0; g_b_init_get_adapters_info = 0; + g_b_init_reg_open_key_ex_w = 0; + g_b_init_reg_query_value_ex_w = 0; + g_b_init_expand_environment_strings_w = 0; g_b_init_compare_string_w = 0; g_b_init_debug_break_process = 0; num_of_processors = 0; @@ -9815,8 +10096,8 @@ serial_configure (struct Lisp_Process *p, Lisp_Object contact) tem = Fplist_get (contact, QCspeed); else tem = Fplist_get (p->childp, QCspeed); - CHECK_NUMBER (tem); - dcb.BaudRate = XINT (tem); + CHECK_FIXNUM (tem); + dcb.BaudRate = XFIXNUM (tem); childp2 = Fplist_put (childp2, QCspeed, tem); /* Configure bytesize. */ @@ -9825,12 +10106,12 @@ serial_configure (struct Lisp_Process *p, Lisp_Object contact) else tem = Fplist_get (p->childp, QCbytesize); if (NILP (tem)) - tem = make_number (8); - CHECK_NUMBER (tem); - if (XINT (tem) != 7 && XINT (tem) != 8) + tem = make_fixnum (8); + CHECK_FIXNUM (tem); + if (XFIXNUM (tem) != 7 && XFIXNUM (tem) != 8) error (":bytesize must be nil (8), 7, or 8"); - dcb.ByteSize = XINT (tem); - summary[0] = XINT (tem) + '0'; + dcb.ByteSize = XFIXNUM (tem); + summary[0] = XFIXNUM (tem) + '0'; childp2 = Fplist_put (childp2, QCbytesize, tem); /* Configure parity. */ @@ -9869,14 +10150,14 @@ serial_configure (struct Lisp_Process *p, Lisp_Object contact) else tem = Fplist_get (p->childp, QCstopbits); if (NILP (tem)) - tem = make_number (1); - CHECK_NUMBER (tem); - if (XINT (tem) != 1 && XINT (tem) != 2) + tem = make_fixnum (1); + CHECK_FIXNUM (tem); + if (XFIXNUM (tem) != 1 && XFIXNUM (tem) != 2) error (":stopbits must be nil (1 stopbit), 1, or 2"); - summary[2] = XINT (tem) + '0'; - if (XINT (tem) == 1) + summary[2] = XFIXNUM (tem) + '0'; + if (XFIXNUM (tem) == 1) dcb.StopBits = ONESTOPBIT; - else if (XINT (tem) == 2) + else if (XFIXNUM (tem) == 2) dcb.StopBits = TWOSTOPBITS; childp2 = Fplist_put (childp2, QCstopbits, tem); |