2025-11-28 00:35:46 +09:00

169 lines
4.1 KiB
C

//////////////////////////////////////////////////////////////////////////////
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// ResourceAttributesSample.h
//
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <sddl.h>
#include <AccCtrl.h>
#include <AclApi.h>
#include <NTSecAPI.h>
#include <authz.h>
#include <strsafe.h>
#include <assert.h>
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define SDDL_LEN_TAG(Tag) (sizeof(Tag) / sizeof( WCHAR ) - 1 )
#define ALIGN(Size) (((ULONG)(Size) + 3) & -4)
typedef struct _RESOURCE_ATTRIBUTE
{
LPWSTR Name;
LPWSTR Flags;
LPWSTR Type;
LPWSTR Values;
} RESOURCE_ATTRIBUTE, *PRESOURCE_ATTRIBUTE;
__inline BOOL
FileParameter(_In_ LPCWSTR Flag)
{
return ((0 == _wcsicmp(Flag, L"-file")) || (0 ==_wcsicmp(Flag, L"/file")));
}
__inline BOOL
CapParameter(_In_ LPCWSTR Flag)
{
return ((0 == _wcsicmp(Flag, L"-cap")) || (0 == _wcsicmp(Flag, L"/cap")));
}
__inline BOOL
RaParameter(_In_ LPCWSTR Flag)
{
return ((0 == _wcsicmp(Flag, L"-ra")) || (0 == _wcsicmp(Flag, L"/ra")));
}
__inline WORD
GetValueType(_In_ LPWSTR ClaimType)
{
if(0 == _wcsnicmp(ClaimType, SDDL_INT, SDDL_LEN_TAG(SDDL_INT)))
{
return CLAIM_SECURITY_ATTRIBUTE_TYPE_INT64;
}
else if(0 == _wcsnicmp(ClaimType, SDDL_UINT, SDDL_LEN_TAG(SDDL_UINT)))
{
return CLAIM_SECURITY_ATTRIBUTE_TYPE_UINT64;
}
else if(0 == _wcsnicmp(ClaimType,SDDL_WSTRING,SDDL_LEN_TAG(SDDL_WSTRING)))
{
return CLAIM_SECURITY_ATTRIBUTE_TYPE_STRING;
}
else if(0 == _wcsnicmp(ClaimType,SDDL_BOOLEAN,SDDL_LEN_TAG(SDDL_BOOLEAN)))
{
return CLAIM_SECURITY_ATTRIBUTE_TYPE_BOOLEAN;
}
else
{
return CLAIM_SECURITY_ATTRIBUTE_TYPE_INVALID;
}
}
__inline DWORD
GetValueSize(_In_ WORD ClaimType)
{
SIZE_T Size;
switch(ClaimType)
{
case CLAIM_SECURITY_ATTRIBUTE_TYPE_INT64:
Size = sizeof(LONG64);
break;
case CLAIM_SECURITY_ATTRIBUTE_TYPE_UINT64:
case CLAIM_SECURITY_ATTRIBUTE_TYPE_BOOLEAN:
Size = sizeof(DWORD64);
break;
case CLAIM_SECURITY_ATTRIBUTE_TYPE_STRING:
Size = sizeof(PWSTR);
break;
default:
Size = 0;
break;
}
return static_cast<DWORD>(Size);
}
_Success_(return == TRUE)
BOOL
CreateSecurityDescriptor(
_In_ PSID CapIDSid,
_In_reads_(ResourceAttributeCt) PCLAIM_SECURITY_ATTRIBUTE_V1* ResourceAttributes,
_In_ DWORD ResourceAttributeCt,
_Outptr_ PSECURITY_DESCRIPTOR* SecurityDescriptorResult
);
BOOL
PerformAccessCheck(
_In_ PSECURITY_DESCRIPTOR SecurityDescriptor
);
_Success_(return == TRUE)
BOOL
IsValidCapID(
_In_ LPCWSTR CapID,
_Outptr_ PSID* CapIDSidResult
);
_Success_(return == TRUE)
BOOL
GetFileResourceAttributes(
_In_ LPCWSTR FileName,
_Outptr_result_buffer_(*Count) PCLAIM_SECURITY_ATTRIBUTE_V1* FileResourceAttributes[],
_Out_ DWORD* Count
);
BOOL
ParseResourceAttributeString(
_In_ LPWSTR AttributeString,
_Inout_ RESOURCE_ATTRIBUTE& Attribute
);
_Success_(return == TRUE)
BOOL
InterpretResourceAttribute(
_In_ RESOURCE_ATTRIBUTE AttributeTokens,
_Outptr_ PCLAIM_SECURITY_ATTRIBUTE_V1* ResourceClaimReslut
);
_Success_(return == TRUE)
BOOL
ParseResourceAttributesArguments(
_In_ LPCWSTR ResourceAttributesArgs,
_Outptr_result_buffer_(*Count) PCLAIM_SECURITY_ATTRIBUTE_V1* ResourceAttributesResult[],
_Out_ DWORD* Count
);
VOID
PrintResourceAttribute(
_In_ RESOURCE_ATTRIBUTE Attribute
);
VOID
PrintErrorMessage(
_In_ LPWSTR ErrorMessage,
_In_ DWORD ErrorCode
);
VOID
PrintUsage();