mirror of
https://github.com/reactos/reactos.git
synced 2025-05-13 14:20:31 +00:00
- unlock ntmatra
- Implementation of GetExplicitEntriesFromAcl - fixes bug 1339 - by Thomas Weidenmueller svn path=/trunk/; revision=21273
This commit is contained in:
parent
7b42ee2289
commit
d82d596186
3 changed files with 270 additions and 4 deletions
|
@ -33,6 +33,131 @@
|
||||||
|
|
||||||
HINSTANCE hDllInstance;
|
HINSTANCE hDllInstance;
|
||||||
|
|
||||||
|
static ACCESS_MODE
|
||||||
|
AccpGetAceAccessMode(IN PACE_HEADER AceHeader)
|
||||||
|
{
|
||||||
|
ACCESS_MODE Mode = NOT_USED_ACCESS;
|
||||||
|
|
||||||
|
switch (AceHeader->AceType)
|
||||||
|
{
|
||||||
|
case ACCESS_ALLOWED_ACE_TYPE:
|
||||||
|
case ACCESS_ALLOWED_CALLBACK_ACE_TYPE:
|
||||||
|
case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
case ACCESS_ALLOWED_OBJECT_ACE_TYPE:
|
||||||
|
Mode = GRANT_ACCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACCESS_DENIED_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_CALLBACK_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_OBJECT_ACE_TYPE:
|
||||||
|
Mode = DENY_ACCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SYSTEM_AUDIT_ACE_TYPE:
|
||||||
|
case SYSTEM_AUDIT_CALLBACK_ACE_TYPE:
|
||||||
|
case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
case SYSTEM_AUDIT_OBJECT_ACE_TYPE:
|
||||||
|
if (AceHeader->AceFlags & FAILED_ACCESS_ACE_FLAG)
|
||||||
|
Mode = SET_AUDIT_FAILURE;
|
||||||
|
else if (AceHeader->AceFlags & SUCCESSFUL_ACCESS_ACE_FLAG)
|
||||||
|
Mode = SET_AUDIT_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT
|
||||||
|
AccpGetAceStructureSize(IN PACE_HEADER AceHeader)
|
||||||
|
{
|
||||||
|
UINT Size = 0;
|
||||||
|
|
||||||
|
switch (AceHeader->AceType)
|
||||||
|
{
|
||||||
|
case ACCESS_ALLOWED_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_ACE_TYPE:
|
||||||
|
Size = FIELD_OFFSET(ACCESS_ALLOWED_ACE,
|
||||||
|
SidStart);
|
||||||
|
break;
|
||||||
|
case ACCESS_ALLOWED_CALLBACK_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_CALLBACK_ACE_TYPE:
|
||||||
|
Size = FIELD_OFFSET(ACCESS_ALLOWED_CALLBACK_ACE,
|
||||||
|
SidStart);
|
||||||
|
break;
|
||||||
|
case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
{
|
||||||
|
PACCESS_ALLOWED_CALLBACK_OBJECT_ACE Ace = (PACCESS_ALLOWED_CALLBACK_OBJECT_ACE)AceHeader;
|
||||||
|
Size = FIELD_OFFSET(ACCESS_ALLOWED_CALLBACK_OBJECT_ACE,
|
||||||
|
ObjectType);
|
||||||
|
if (Ace->Flags & ACE_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->ObjectType);
|
||||||
|
if (Ace->Flags & ACE_INHERITED_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->InheritedObjectType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACCESS_ALLOWED_OBJECT_ACE_TYPE:
|
||||||
|
case ACCESS_DENIED_OBJECT_ACE_TYPE:
|
||||||
|
{
|
||||||
|
PACCESS_ALLOWED_OBJECT_ACE Ace = (PACCESS_ALLOWED_OBJECT_ACE)AceHeader;
|
||||||
|
Size = FIELD_OFFSET(ACCESS_ALLOWED_OBJECT_ACE,
|
||||||
|
ObjectType);
|
||||||
|
if (Ace->Flags & ACE_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->ObjectType);
|
||||||
|
if (Ace->Flags & ACE_INHERITED_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->InheritedObjectType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SYSTEM_AUDIT_ACE_TYPE:
|
||||||
|
Size = FIELD_OFFSET(SYSTEM_AUDIT_ACE,
|
||||||
|
SidStart);
|
||||||
|
break;
|
||||||
|
case SYSTEM_AUDIT_CALLBACK_ACE_TYPE:
|
||||||
|
Size = FIELD_OFFSET(SYSTEM_AUDIT_CALLBACK_ACE,
|
||||||
|
SidStart);
|
||||||
|
break;
|
||||||
|
case SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE:
|
||||||
|
{
|
||||||
|
PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE Ace = (PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE)AceHeader;
|
||||||
|
Size = FIELD_OFFSET(SYSTEM_AUDIT_CALLBACK_OBJECT_ACE,
|
||||||
|
ObjectType);
|
||||||
|
if (Ace->Flags & ACE_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->ObjectType);
|
||||||
|
if (Ace->Flags & ACE_INHERITED_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->InheritedObjectType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SYSTEM_AUDIT_OBJECT_ACE_TYPE:
|
||||||
|
{
|
||||||
|
PSYSTEM_AUDIT_OBJECT_ACE Ace = (PSYSTEM_AUDIT_OBJECT_ACE)AceHeader;
|
||||||
|
Size = FIELD_OFFSET(SYSTEM_AUDIT_OBJECT_ACE,
|
||||||
|
ObjectType);
|
||||||
|
if (Ace->Flags & ACE_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->ObjectType);
|
||||||
|
if (Ace->Flags & ACE_INHERITED_OBJECT_TYPE_PRESENT)
|
||||||
|
Size += sizeof(Ace->InheritedObjectType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PSID
|
||||||
|
AccpGetAceSid(IN PACE_HEADER AceHeader)
|
||||||
|
{
|
||||||
|
return (PSID)((ULONG_PTR)AceHeader + AccpGetAceStructureSize(AceHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
static ACCESS_MASK
|
||||||
|
AccpGetAceAccessMask(IN PACE_HEADER AceHeader)
|
||||||
|
{
|
||||||
|
return *((PACCESS_MASK)(AceHeader + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* AccRewriteGetHandleRights EXPORTED
|
* AccRewriteGetHandleRights EXPORTED
|
||||||
*
|
*
|
||||||
|
@ -504,7 +629,7 @@ ParseRegErr:
|
||||||
DesiredAccess &= ~SC_MANAGER_CONNECT;
|
DesiredAccess &= ~SC_MANAGER_CONNECT;
|
||||||
*Handle = (HANDLE)OpenService((SC_HANDLE)(*Handle2),
|
*Handle = (HANDLE)OpenService((SC_HANDLE)(*Handle2),
|
||||||
lpServiceName,
|
lpServiceName,
|
||||||
DesiredAccess);
|
(DWORD)DesiredAccess);
|
||||||
if (*Handle == NULL)
|
if (*Handle == NULL)
|
||||||
{
|
{
|
||||||
if (*Handle2 != NULL)
|
if (*Handle2 != NULL)
|
||||||
|
@ -748,15 +873,103 @@ AccFreeIndexArray(PINHERITED_FROMW pInheritArray,
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* AccRewriteGetExplicitEntriesFromAcl EXPORTED
|
* AccRewriteGetExplicitEntriesFromAcl EXPORTED
|
||||||
*
|
*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI
|
DWORD WINAPI
|
||||||
AccRewriteGetExplicitEntriesFromAcl(PACL pacl,
|
AccRewriteGetExplicitEntriesFromAcl(PACL pacl,
|
||||||
PULONG pcCountOfExplicitEntries,
|
PULONG pcCountOfExplicitEntries,
|
||||||
PEXPLICIT_ACCESS_W* pListOfExplicitEntries)
|
PEXPLICIT_ACCESS_W* pListOfExplicitEntries)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PACE_HEADER AceHeader;
|
||||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
PSID Sid, SidTarget;
|
||||||
|
SIZE_T Size;
|
||||||
|
PEXPLICIT_ACCESS_W peaw;
|
||||||
|
DWORD LastErr, SidLen;
|
||||||
|
DWORD AceIndex = 0;
|
||||||
|
DWORD ErrorCode = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
/* save the last error code */
|
||||||
|
LastErr = GetLastError();
|
||||||
|
|
||||||
|
if (pacl != NULL)
|
||||||
|
{
|
||||||
|
if (pacl->AceCount != 0)
|
||||||
|
{
|
||||||
|
Size = (SIZE_T)pacl->AceCount * sizeof(EXPLICIT_ACCESS_W);
|
||||||
|
|
||||||
|
/* calculate the space needed */
|
||||||
|
while (GetAce(pacl,
|
||||||
|
AceIndex,
|
||||||
|
(LPVOID*)&AceHeader))
|
||||||
|
{
|
||||||
|
Sid = AccpGetAceSid(AceHeader);
|
||||||
|
Size += GetLengthSid(Sid);
|
||||||
|
/* FIXME - take size of opaque data in account? */
|
||||||
|
AceIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(pacl->AceCount == AceIndex);
|
||||||
|
|
||||||
|
/* allocate the array */
|
||||||
|
peaw = (PEXPLICIT_ACCESS_W)LocalAlloc(LMEM_FIXED,
|
||||||
|
Size);
|
||||||
|
if (peaw != NULL)
|
||||||
|
{
|
||||||
|
AceIndex = 0;
|
||||||
|
SidTarget = (PSID)(peaw + pacl->AceCount);
|
||||||
|
|
||||||
|
/* initialize the array */\
|
||||||
|
while (GetAce(pacl,
|
||||||
|
AceIndex,
|
||||||
|
(LPVOID*)&AceHeader))
|
||||||
|
{
|
||||||
|
Sid = AccpGetAceSid(AceHeader);
|
||||||
|
SidLen = GetLengthSid(Sid);
|
||||||
|
|
||||||
|
peaw[AceIndex].grfAccessPermissions = AccpGetAceAccessMask(AceHeader);
|
||||||
|
peaw[AceIndex].grfAccessMode = AccpGetAceAccessMode(AceHeader);
|
||||||
|
peaw[AceIndex].grfInheritance = AceHeader->AceFlags & VALID_INHERIT_FLAGS;
|
||||||
|
|
||||||
|
if (CopySid(SidLen,
|
||||||
|
SidTarget,
|
||||||
|
Sid))
|
||||||
|
{
|
||||||
|
BuildTrusteeWithSid(&peaw[AceIndex].Trustee,
|
||||||
|
SidTarget);
|
||||||
|
SidTarget = (PSID)((ULONG_PTR)SidTarget + SidLen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* copying the SID failed, treat it as an fatal error... */
|
||||||
|
ErrorCode = GetLastError();
|
||||||
|
|
||||||
|
/* free allocated resources */
|
||||||
|
LocalFree(peaw);
|
||||||
|
peaw = NULL;
|
||||||
|
AceIndex = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
AceIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pcCountOfExplicitEntries = AceIndex;
|
||||||
|
*pListOfExplicitEntries = peaw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*pcCountOfExplicitEntries = 0;
|
||||||
|
*pListOfExplicitEntries = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* restore the last error code */
|
||||||
|
SetLastError(LastErr);
|
||||||
|
|
||||||
|
return ErrorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ndk/ntndk.h>
|
#include <ndk/ntndk.h>
|
||||||
#include <accctrl.h>
|
#include <accctrl.h>
|
||||||
|
#include <aclapi.h>
|
||||||
#include <winsvc.h>
|
#include <winsvc.h>
|
||||||
|
|
||||||
#ifndef HAS_FN_PROGRESSW
|
#ifndef HAS_FN_PROGRESSW
|
||||||
|
|
|
@ -1608,6 +1608,58 @@ typedef struct _SYSTEM_ALARM_OBJECT_ACE {
|
||||||
GUID InheritedObjectType;
|
GUID InheritedObjectType;
|
||||||
DWORD SidStart;
|
DWORD SidStart;
|
||||||
} SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE;
|
} SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE;
|
||||||
|
typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD SidStart;
|
||||||
|
} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
|
||||||
|
typedef struct _ACCESS_DENIED_CALLBACK_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD SidStart;
|
||||||
|
} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
|
||||||
|
typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD SidStart;
|
||||||
|
} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
|
||||||
|
typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD SidStart;
|
||||||
|
} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
|
||||||
|
typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD Flags;
|
||||||
|
GUID ObjectType;
|
||||||
|
GUID InheritedObjectType;
|
||||||
|
DWORD SidStart;
|
||||||
|
} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
|
||||||
|
typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD Flags;
|
||||||
|
GUID ObjectType;
|
||||||
|
GUID InheritedObjectType;
|
||||||
|
DWORD SidStart;
|
||||||
|
} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
|
||||||
|
typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD Flags;
|
||||||
|
GUID ObjectType;
|
||||||
|
GUID InheritedObjectType;
|
||||||
|
DWORD SidStart;
|
||||||
|
} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
|
||||||
|
typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
|
||||||
|
ACE_HEADER Header;
|
||||||
|
ACCESS_MASK Mask;
|
||||||
|
DWORD Flags;
|
||||||
|
GUID ObjectType;
|
||||||
|
GUID InheritedObjectType;
|
||||||
|
DWORD SidStart;
|
||||||
|
} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
|
||||||
#endif
|
#endif
|
||||||
typedef struct _ACL {
|
typedef struct _ACL {
|
||||||
BYTE AclRevision;
|
BYTE AclRevision;
|
||||||
|
|
Loading…
Reference in a new issue