| 3639 | } while (0) |
| 3640 | |
| 3641 | static bool win_security_init(win_security_t *security) { |
| 3642 | memset(security, 0, sizeof(*security)); |
| 3643 | security->advapi = LoadLibraryW(L"advapi32.dll"); |
| 3644 | if (!security->advapi) { |
| 3645 | return false; |
| 3646 | } |
| 3647 | RESOLVE_ADVAPI_MEMBER(security, open_process_token, open_process_token_fn, "OpenProcessToken"); |
| 3648 | RESOLVE_ADVAPI_MEMBER(security, open_thread_token, open_thread_token_fn, "OpenThreadToken"); |
| 3649 | RESOLVE_ADVAPI_MEMBER(security, get_token_information, get_token_information_fn, |
| 3650 | "GetTokenInformation"); |
| 3651 | RESOLVE_ADVAPI_MEMBER(security, get_length_sid, get_length_sid_fn, "GetLengthSid"); |
| 3652 | RESOLVE_ADVAPI_MEMBER(security, copy_sid, copy_sid_fn, "CopySid"); |
| 3653 | RESOLVE_ADVAPI_MEMBER(security, equal_sid, equal_sid_fn, "EqualSid"); |
| 3654 | RESOLVE_ADVAPI_MEMBER(security, is_valid_sid, is_valid_sid_fn, "IsValidSid"); |
| 3655 | RESOLVE_ADVAPI_MEMBER(security, is_well_known_sid, is_well_known_sid_fn, "IsWellKnownSid"); |
| 3656 | RESOLVE_ADVAPI_MEMBER(security, is_valid_acl, is_valid_acl_fn, "IsValidAcl"); |
| 3657 | RESOLVE_ADVAPI_MEMBER(security, initialize_acl, initialize_acl_fn, "InitializeAcl"); |
| 3658 | RESOLVE_ADVAPI_MEMBER(security, add_access_allowed_ace, add_access_allowed_ace_fn, |
| 3659 | "AddAccessAllowedAce"); |
| 3660 | RESOLVE_ADVAPI_MEMBER(security, add_access_allowed_ace_ex, add_access_allowed_ace_ex_fn, |
| 3661 | "AddAccessAllowedAceEx"); |
| 3662 | RESOLVE_ADVAPI_MEMBER(security, initialize_security_descriptor, |
| 3663 | initialize_security_descriptor_fn, "InitializeSecurityDescriptor"); |
| 3664 | RESOLVE_ADVAPI_MEMBER(security, set_security_descriptor_dacl, set_security_descriptor_dacl_fn, |
| 3665 | "SetSecurityDescriptorDacl"); |
| 3666 | RESOLVE_ADVAPI_MEMBER(security, set_security_descriptor_owner, set_security_descriptor_owner_fn, |
| 3667 | "SetSecurityDescriptorOwner"); |
| 3668 | RESOLVE_ADVAPI_MEMBER(security, get_acl_information, get_acl_information_fn, |
| 3669 | "GetAclInformation"); |
| 3670 | RESOLVE_ADVAPI_MEMBER(security, get_ace, get_ace_fn, "GetAce"); |
| 3671 | RESOLVE_ADVAPI_MEMBER(security, get_security_info, get_security_info_fn, "GetSecurityInfo"); |
| 3672 | RESOLVE_ADVAPI_MEMBER(security, set_security_info, set_security_info_fn, "SetSecurityInfo"); |
| 3673 | RESOLVE_ADVAPI_MEMBER(security, impersonate_named_pipe_client, impersonate_named_pipe_client_fn, |
| 3674 | "ImpersonateNamedPipeClient"); |
| 3675 | RESOLVE_ADVAPI_MEMBER(security, revert_to_self, revert_to_self_fn, "RevertToSelf"); |
| 3676 | |
| 3677 | HANDLE token = NULL; |
| 3678 | if (!security->open_process_token(GetCurrentProcess(), TOKEN_QUERY, &token)) { |
| 3679 | win_security_destroy(security); |
| 3680 | return false; |
| 3681 | } |
| 3682 | PSID token_sid = NULL; |
| 3683 | void *token_user = win_token_user_query(security, token, &token_sid); |
| 3684 | (void)CloseHandle(token); |
| 3685 | if (!token_user || !token_sid) { |
| 3686 | free(token_user); |
| 3687 | win_security_destroy(security); |
| 3688 | return false; |
| 3689 | } |
| 3690 | DWORD sid_length = security->get_length_sid(token_sid); |
| 3691 | security->user_sid = malloc(sid_length); |
| 3692 | if (sid_length == 0 || !security->user_sid || |
| 3693 | !security->copy_sid(sid_length, security->user_sid, token_sid)) { |
| 3694 | free(token_user); |
| 3695 | win_security_destroy(security); |
| 3696 | return false; |
| 3697 | } |
| 3698 | free(token_user); |
no test coverage detected