| 3596 | } while (0) |
| 3597 | |
| 3598 | static bool win_security_init(win_security_t *security) { |
| 3599 | memset(security, 0, sizeof(*security)); |
| 3600 | security->advapi = LoadLibraryW(L"advapi32.dll"); |
| 3601 | if (!security->advapi) { |
| 3602 | return false; |
| 3603 | } |
| 3604 | RESOLVE_ADVAPI_MEMBER(security, open_process_token, open_process_token_fn, "OpenProcessToken"); |
| 3605 | RESOLVE_ADVAPI_MEMBER(security, open_thread_token, open_thread_token_fn, "OpenThreadToken"); |
| 3606 | RESOLVE_ADVAPI_MEMBER(security, get_token_information, get_token_information_fn, |
| 3607 | "GetTokenInformation"); |
| 3608 | RESOLVE_ADVAPI_MEMBER(security, get_length_sid, get_length_sid_fn, "GetLengthSid"); |
| 3609 | RESOLVE_ADVAPI_MEMBER(security, copy_sid, copy_sid_fn, "CopySid"); |
| 3610 | RESOLVE_ADVAPI_MEMBER(security, equal_sid, equal_sid_fn, "EqualSid"); |
| 3611 | RESOLVE_ADVAPI_MEMBER(security, is_valid_sid, is_valid_sid_fn, "IsValidSid"); |
| 3612 | RESOLVE_ADVAPI_MEMBER(security, is_well_known_sid, is_well_known_sid_fn, "IsWellKnownSid"); |
| 3613 | RESOLVE_ADVAPI_MEMBER(security, is_valid_acl, is_valid_acl_fn, "IsValidAcl"); |
| 3614 | RESOLVE_ADVAPI_MEMBER(security, initialize_acl, initialize_acl_fn, "InitializeAcl"); |
| 3615 | RESOLVE_ADVAPI_MEMBER(security, add_access_allowed_ace, add_access_allowed_ace_fn, |
| 3616 | "AddAccessAllowedAce"); |
| 3617 | RESOLVE_ADVAPI_MEMBER(security, initialize_security_descriptor, |
| 3618 | initialize_security_descriptor_fn, "InitializeSecurityDescriptor"); |
| 3619 | RESOLVE_ADVAPI_MEMBER(security, set_security_descriptor_dacl, set_security_descriptor_dacl_fn, |
| 3620 | "SetSecurityDescriptorDacl"); |
| 3621 | RESOLVE_ADVAPI_MEMBER(security, set_security_descriptor_owner, set_security_descriptor_owner_fn, |
| 3622 | "SetSecurityDescriptorOwner"); |
| 3623 | RESOLVE_ADVAPI_MEMBER(security, get_acl_information, get_acl_information_fn, |
| 3624 | "GetAclInformation"); |
| 3625 | RESOLVE_ADVAPI_MEMBER(security, get_ace, get_ace_fn, "GetAce"); |
| 3626 | RESOLVE_ADVAPI_MEMBER(security, get_security_info, get_security_info_fn, "GetSecurityInfo"); |
| 3627 | RESOLVE_ADVAPI_MEMBER(security, set_security_info, set_security_info_fn, "SetSecurityInfo"); |
| 3628 | RESOLVE_ADVAPI_MEMBER(security, impersonate_named_pipe_client, impersonate_named_pipe_client_fn, |
| 3629 | "ImpersonateNamedPipeClient"); |
| 3630 | RESOLVE_ADVAPI_MEMBER(security, revert_to_self, revert_to_self_fn, "RevertToSelf"); |
| 3631 | |
| 3632 | HANDLE token = NULL; |
| 3633 | if (!security->open_process_token(GetCurrentProcess(), TOKEN_QUERY, &token)) { |
| 3634 | win_security_destroy(security); |
| 3635 | return false; |
| 3636 | } |
| 3637 | PSID token_sid = NULL; |
| 3638 | void *token_user = win_token_user_query(security, token, &token_sid); |
| 3639 | (void)CloseHandle(token); |
| 3640 | if (!token_user || !token_sid) { |
| 3641 | free(token_user); |
| 3642 | win_security_destroy(security); |
| 3643 | return false; |
| 3644 | } |
| 3645 | DWORD sid_length = security->get_length_sid(token_sid); |
| 3646 | security->user_sid = malloc(sid_length); |
| 3647 | if (sid_length == 0 || !security->user_sid || |
| 3648 | !security->copy_sid(sid_length, security->user_sid, token_sid)) { |
| 3649 | free(token_user); |
| 3650 | win_security_destroy(security); |
| 3651 | return false; |
| 3652 | } |
| 3653 | free(token_user); |
| 3654 | |
| 3655 | size_t acl_size = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + sid_length; |
no test coverage detected