From 06e21b9cb1edf07333d2680d796e35b9f25688a7 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 1 Apr 2011 12:46:09 +0000 Subject: * Makefile.in (DLL_OFILES): Add avapi32.o. * advapi32.cc: New file. * autoload.cc: Add block of remaining advapi32 functions used by Cygwin. Keep commented out. Explain why. --- winsup/cygwin/advapi32.cc | 305 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 winsup/cygwin/advapi32.cc (limited to 'winsup/cygwin/advapi32.cc') diff --git a/winsup/cygwin/advapi32.cc b/winsup/cygwin/advapi32.cc new file mode 100644 index 000000000..a53f1ff01 --- /dev/null +++ b/winsup/cygwin/advapi32.cc @@ -0,0 +1,305 @@ +/* advapi32.cc: Win32 replacement functions. + + Copyright 2011 Red Hat, Inc. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#include "winsup.h" +#include +#include "shared_info.h" +#include "ntdll.h" +#include + +#define DEFAULT_NTSTATUS_TO_BOOL_RETURN \ + if (!NT_SUCCESS (status)) \ + SetLastError (RtlNtStatusToDosError (status)); \ + return NT_SUCCESS (status); + +BOOL WINAPI +AllocateLocallyUniqueId (PLUID luid) +{ + NTSTATUS status = NtAllocateLocallyUniqueId (luid); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +AccessCheck (PSECURITY_DESCRIPTOR sd, HANDLE tok, DWORD access, + PGENERIC_MAPPING mapping, PPRIVILEGE_SET pset, LPDWORD psetlen, + LPDWORD granted, LPBOOL allowed) +{ + NTSTATUS status, astatus; + + status = NtAccessCheck (sd, tok, access, mapping, pset, psetlen, granted, + &astatus); + if (NT_SUCCESS (status)) + *allowed = NT_SUCCESS (astatus); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +PrivilegeCheck (HANDLE tok, PPRIVILEGE_SET pset, LPBOOL res) +{ + NTSTATUS status = NtPrivilegeCheck (tok, pset, (PBOOLEAN) res); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +InitializeSid (PSID sid, PSID_IDENTIFIER_AUTHORITY auth, BYTE count) +{ + NTSTATUS status = RtlInitializeSid (sid, auth, count); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +EqualSid (PSID sid1, PSID sid2) +{ + return !!RtlEqualSid (sid1, sid2); +} + +BOOL WINAPI +EqualPrefixSid (PSID sid1, PSID sid2) +{ + return !!RtlEqualPrefixSid (sid1, sid2); +} + +BOOL WINAPI +CopySid (DWORD len, PSID dest, PSID src) +{ + NTSTATUS status = RtlCopySid (len, dest, src); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +DWORD WINAPI +GetLengthSid (PSID sid) +{ + return RtlLengthSid (sid); +} + +PDWORD WINAPI +GetSidSubAuthority (PSID sid, DWORD subauth) +{ + return RtlSubAuthoritySid (sid, subauth); +} + +PUCHAR WINAPI +GetSidSubAuthorityCount (PSID sid) +{ + return RtlSubAuthorityCountSid (sid); +} + +PSID_IDENTIFIER_AUTHORITY WINAPI +GetSidIdentifierAuthority (PSID sid) +{ + return RtlIdentifierAuthoritySid (sid); +} + +BOOL WINAPI +InitializeAcl (PACL acl, DWORD len, DWORD revision) +{ + NTSTATUS status = RtlCreateAcl (acl, len, revision); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +AddAccessAllowedAce (PACL acl, DWORD revision, DWORD mask, PSID sid) +{ + NTSTATUS status = RtlAddAccessAllowedAce (acl, revision, mask, sid); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +AddAccessDeniedAce (PACL acl, DWORD revision, DWORD mask, PSID sid) +{ + NTSTATUS status = RtlAddAccessDeniedAce (acl, revision, mask, sid); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +AddAce (PACL acl, DWORD revision, DWORD index, LPVOID ace_list, DWORD len) +{ + NTSTATUS status = RtlAddAce (acl, revision, index, ace_list, len); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +FindFirstFreeAce (PACL acl, LPVOID *ace) +{ + NTSTATUS status = RtlFirstFreeAce (acl, ace); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +GetAce (PACL acl, DWORD index, LPVOID *ace) +{ + NTSTATUS status = RtlGetAce (acl, index, ace); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +InitializeSecurityDescriptor (PSECURITY_DESCRIPTOR sd, DWORD revision) +{ + NTSTATUS status = RtlCreateSecurityDescriptor (sd, revision); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +MakeSelfRelativeSD (PSECURITY_DESCRIPTOR abs_sd, PSECURITY_DESCRIPTOR rel_sd, + LPDWORD len) +{ + NTSTATUS status = RtlAbsoluteToSelfRelativeSD (abs_sd, rel_sd, len); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +GetSecurityDescriptorDacl (PSECURITY_DESCRIPTOR sd, LPBOOL present, PACL *dacl, + LPBOOL def) +{ + NTSTATUS status = RtlGetDaclSecurityDescriptor (sd, (PBOOLEAN) present, dacl, + (PBOOLEAN) def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +SetSecurityDescriptorDacl (PSECURITY_DESCRIPTOR sd, BOOL present, PACL dacl, + BOOL def) +{ + NTSTATUS status = RtlSetDaclSecurityDescriptor (sd, (BOOLEAN) !!present, dacl, + (BOOLEAN) !!def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +GetSecurityDescriptorGroup (PSECURITY_DESCRIPTOR sd, PSID *sid, LPBOOL def) +{ + NTSTATUS status = RtlGetGroupSecurityDescriptor (sd, sid, (PBOOLEAN) def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +SetSecurityDescriptorGroup (PSECURITY_DESCRIPTOR sd, PSID sid, BOOL def) +{ + NTSTATUS status = RtlSetGroupSecurityDescriptor (sd, sid, (BOOLEAN) !!def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +GetSecurityDescriptorOwner (PSECURITY_DESCRIPTOR sd, PSID *sid, LPBOOL def) +{ + NTSTATUS status = RtlGetOwnerSecurityDescriptor (sd, sid, (PBOOLEAN) def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +SetSecurityDescriptorOwner (PSECURITY_DESCRIPTOR sd, PSID sid, BOOL def) +{ + NTSTATUS status = RtlSetOwnerSecurityDescriptor (sd, sid, (BOOLEAN) !!def); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +OpenProcessToken (HANDLE process, DWORD access, PHANDLE tok) +{ + NTSTATUS status = NtOpenProcessToken (process, access, tok); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +OpenThreadToken (HANDLE thread, DWORD access, BOOL as_self, PHANDLE tok) +{ + NTSTATUS status = NtOpenThreadToken (thread, access, as_self, tok); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +GetTokenInformation(HANDLE tok, TOKEN_INFORMATION_CLASS infoclass, LPVOID buf, + DWORD len, PDWORD retlen) +{ + NTSTATUS status = NtQueryInformationToken (tok, infoclass, buf, len, retlen); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +SetTokenInformation (HANDLE tok, TOKEN_INFORMATION_CLASS infoclass, PVOID buf, + ULONG len) +{ + NTSTATUS status = NtSetInformationToken (tok, infoclass, buf, len); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +RevertToSelf () +{ + HANDLE tok = NULL; + NTSTATUS status = NtSetInformationThread (NtCurrentThread (), + ThreadImpersonationToken, + &tok, sizeof tok); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +DuplicateTokenEx (HANDLE tok, DWORD access, LPSECURITY_ATTRIBUTES sec_attr, + SECURITY_IMPERSONATION_LEVEL level, TOKEN_TYPE type, + PHANDLE new_tok) +{ + SECURITY_QUALITY_OF_SERVICE sqos = + { sizeof sqos, level, SECURITY_STATIC_TRACKING, FALSE }; + OBJECT_ATTRIBUTES attr = + { sizeof attr, NULL, NULL, + sec_attr && sec_attr->bInheritHandle? OBJ_INHERIT : 0, + sec_attr ? sec_attr->lpSecurityDescriptor : NULL, &sqos }; + NTSTATUS status = NtDuplicateToken (tok, access, &attr, FALSE, type, new_tok); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL WINAPI +ImpersonateLoggedOnUser (HANDLE tok) +{ + NTSTATUS status; + HANDLE ptok = NULL; + TOKEN_TYPE type; + ULONG size; + + status = NtQueryInformationToken (tok, TokenType, &type, sizeof type, &size); + if (!NT_SUCCESS (status)) + { + SetLastError (RtlNtStatusToDosError (status)); + return FALSE; + } + if (type == TokenPrimary) + { + /* If its a primary token it must be converted to an impersonated + token. */ + SECURITY_QUALITY_OF_SERVICE sqos = + { sizeof sqos, SecurityImpersonation, SECURITY_DYNAMIC_TRACKING, FALSE}; + OBJECT_ATTRIBUTES attr = + { sizeof attr, NULL, NULL, 0, NULL, &sqos }; + + /* The required rights for the impersonation token according to MSDN. */ + status = NtDuplicateToken (tok, TOKEN_QUERY | TOKEN_IMPERSONATE, + &attr, FALSE, TokenImpersonation, &ptok); + if (!NT_SUCCESS (status)) + { + SetLastError (RtlNtStatusToDosError (status)); + return FALSE; + } + tok = ptok; + } + status = NtSetInformationThread (NtCurrentThread (), ThreadImpersonationToken, + &tok, sizeof tok); + if (ptok) + NtClose (ptok); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} + +BOOL +ImpersonateNamedPipeClient (HANDLE pipe) +{ + IO_STATUS_BLOCK io; + NTSTATUS status = NtFsControlFile (pipe, NULL, NULL, NULL, &io, + FSCTL_PIPE_IMPERSONATE, NULL, 0, NULL, 0); + DEFAULT_NTSTATUS_TO_BOOL_RETURN +} -- cgit v1.2.3