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