| 497 | } |
| 498 | |
| 499 | MallocPtr<void> getCurrentUser() |
| 500 | { |
| 501 | HANDLE hnd = ::GetCurrentProcess(); |
| 502 | HANDLE rawToken = 0; |
| 503 | |
| 504 | BOOL ret = ::OpenProcessToken(hnd, TOKEN_QUERY, &rawToken); |
| 505 | if (!ret) { |
| 506 | const auto e = GetLastError(); |
| 507 | throw(e, "OpenProcessToken()"); |
| 508 | } |
| 509 | |
| 510 | HandlePtr token(rawToken); |
| 511 | |
| 512 | DWORD retsize = 0; |
| 513 | ret = ::GetTokenInformation(token.get(), TokenUser, 0, 0, &retsize); |
| 514 | |
| 515 | if (!ret) { |
| 516 | const auto e = GetLastError(); |
| 517 | if (e != ERROR_INSUFFICIENT_BUFFER) { |
| 518 | throw failed(e, "GetTokenInformation() for length"); |
| 519 | } |
| 520 | } |
| 521 | |
| 522 | MallocPtr<void> tokenBuffer(std::malloc(retsize)); |
| 523 | ret = ::GetTokenInformation(token.get(), TokenUser, tokenBuffer.get(), retsize, |
| 524 | &retsize); |
| 525 | |
| 526 | if (!ret) { |
| 527 | const auto e = GetLastError(); |
| 528 | throw failed(e, "GetTokenInformation()"); |
| 529 | } |
| 530 | |
| 531 | PSID tokenSid = ((PTOKEN_USER)(tokenBuffer.get()))->User.Sid; |
| 532 | DWORD sidLen = ::GetLengthSid(tokenSid); |
| 533 | MallocPtr<void> currentUserSID((SID*)(malloc(sidLen))); |
| 534 | |
| 535 | ret = ::CopySid(sidLen, currentUserSID.get(), tokenSid); |
| 536 | |
| 537 | if (!ret) { |
| 538 | const auto e = GetLastError(); |
| 539 | throw failed(e, "CopySid()"); |
| 540 | } |
| 541 | |
| 542 | return currentUserSID; |
| 543 | } |
| 544 | |
| 545 | ACCESS_MASK getEffectiveRights(ACL* dacl, PSID sid) |
| 546 | { |
no test coverage detected