You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
6.8 KiB
277 lines
6.8 KiB
// Copyright (c) 1997-2002 Microsoft Corporation
|
|
//
|
|
// Module:
|
|
//
|
|
// Network Security Utilities
|
|
//
|
|
// Abstract:
|
|
//
|
|
// Acl API's
|
|
//
|
|
// Authors:
|
|
//
|
|
// pmay 2/5/02
|
|
// raymonds 03/20/02
|
|
//
|
|
// Environment:
|
|
//
|
|
// User mode
|
|
//
|
|
// Revision History:
|
|
//
|
|
|
|
#include <precomp.h>
|
|
|
|
// Private declarations
|
|
//
|
|
|
|
// Maximum string security descriptor length
|
|
//
|
|
|
|
#define MAX_STR_SD_LEN 128
|
|
|
|
// TBD: Remove these when incorporated into main NSU utilities
|
|
|
|
#define CLEANUP Cleanup
|
|
|
|
#define BAIL_ON_ERROR(err) if((err) != ERROR_SUCCESS) {goto CLEANUP;}
|
|
#define BAIL_ON_NULL(ptr, err) if ((ptr) == NULL) {(err) = ERROR_NOT_ENOUGH_MEMORY; goto CLEANUP;}
|
|
#define BAIL_OUT {goto CLEANUP;}
|
|
|
|
|
|
// Description:
|
|
//
|
|
// Allocates and initializes a SECURITY_ATTRIBUTES structure that gives
|
|
// access according to the flags passed in. (contained SD is self-relative).
|
|
//
|
|
// Arguments:
|
|
//
|
|
// ppSecurityAttributes - pointer to SECURITY_ATTRIBUTES created.
|
|
// Use NsuAclAttributesDestroy to destroy.
|
|
// dwFlags - see NSU_ACL_F_* values
|
|
//
|
|
// Return Value:
|
|
//
|
|
// An allocated security attributes structure or NULL if out of memory.
|
|
//
|
|
//
|
|
// TBD: use NsuString and Nsu mem functions
|
|
|
|
DWORD
|
|
NsuAclAttributesCreate(
|
|
OUT PSECURITY_ATTRIBUTES* ppSecurityAttributes,
|
|
IN DWORD dwFlags)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
SECURITY_ATTRIBUTES *pSecurityAttributes = NULL;
|
|
|
|
pSecurityAttributes = LocalAlloc(LPTR, sizeof(SECURITY_ATTRIBUTES));
|
|
BAIL_ON_NULL(pSecurityAttributes, dwError);
|
|
|
|
dwError = NsuAclDescriptorCreate(
|
|
(PSECURITY_DESCRIPTOR*) &pSecurityAttributes->lpSecurityDescriptor,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_ERROR(dwError);
|
|
pSecurityAttributes->nLength = sizeof(SECURITY_ATTRIBUTES);
|
|
pSecurityAttributes->bInheritHandle = FALSE;
|
|
|
|
*ppSecurityAttributes = pSecurityAttributes;
|
|
|
|
return dwError;
|
|
|
|
CLEANUP:
|
|
if (pSecurityAttributes) {
|
|
NsuAclAttributesDestroy(&pSecurityAttributes);
|
|
}
|
|
|
|
*ppSecurityAttributes = NULL;
|
|
return dwError;
|
|
}
|
|
|
|
// Description:
|
|
//
|
|
// Deallocates return value of NsuAclCreateAttributes.
|
|
//
|
|
DWORD
|
|
NsuAclAttributesDestroy(
|
|
IN OUT PSECURITY_ATTRIBUTES* ppSecurityAttributes)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
|
|
if (!ppSecurityAttributes) {
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// Destroy Security descriptor, ignoring any errors, since there's not much we
|
|
// can do and want to clean up the rest of the attributes as much as possible.
|
|
//
|
|
|
|
(VOID) NsuAclDescriptorDestroy((*ppSecurityAttributes)->lpSecurityDescriptor);
|
|
|
|
(VOID) LocalFree(*ppSecurityAttributes);
|
|
|
|
*ppSecurityAttributes = NULL;
|
|
return dwError;
|
|
|
|
CLEANUP:
|
|
return dwError;
|
|
}
|
|
|
|
// Description:
|
|
//
|
|
// Allocates and initializes a self-relative SECURITY_DESCRIPTOR structure that gives
|
|
// access according to the flags passed in.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// ppSecurityDescriptor - security descriptor created. Use NsuAclDescriptorDestroy
|
|
// to destroy.
|
|
// dwFlags - see NSU_ACL_F_* values
|
|
//
|
|
// Return Value:
|
|
//
|
|
// An allocated security attributes structure or NULL if out of memory.
|
|
//
|
|
DWORD
|
|
NsuAclDescriptorCreate (
|
|
OUT PSECURITY_DESCRIPTOR* ppSecurityDescriptor,
|
|
IN DWORD dwFlags)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
BOOL fSucceeded = TRUE;
|
|
WCHAR szStringSecurityDescriptor[MAX_STR_SD_LEN] = {0};
|
|
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
|
|
|
|
wcscpy(szStringSecurityDescriptor, L"D:AIAR");
|
|
if (dwFlags & NSU_ACL_F_AdminFull) {
|
|
wcscat(szStringSecurityDescriptor, L"(A;OICI;GA;;;BA)");
|
|
}
|
|
|
|
if (dwFlags & NSU_ACL_F_LocalSystemFull) {
|
|
wcscat(szStringSecurityDescriptor, L"(A;OICI;GA;;;SY)");
|
|
}
|
|
|
|
fSucceeded = ConvertStringSecurityDescriptorToSecurityDescriptorW(
|
|
szStringSecurityDescriptor,
|
|
SDDL_REVISION_1,
|
|
&pSecurityDescriptor,
|
|
NULL
|
|
);
|
|
if (!fSucceeded) {
|
|
dwError = GetLastError();
|
|
BAIL_OUT;
|
|
}
|
|
|
|
*ppSecurityDescriptor = pSecurityDescriptor;
|
|
|
|
return dwError;
|
|
CLEANUP:
|
|
NsuAclDescriptorDestroy(&pSecurityDescriptor);
|
|
*ppSecurityDescriptor = NULL;
|
|
return dwError;
|
|
}
|
|
|
|
// Description:
|
|
//
|
|
// Deallocates return value of NsuAclCreateDescriptor.
|
|
//
|
|
DWORD
|
|
NsuAclDescriptorDestroy(
|
|
IN OUT PSECURITY_DESCRIPTOR* ppDescriptor)
|
|
{
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
|
|
if (!ppDescriptor) {
|
|
BAIL_OUT;
|
|
}
|
|
|
|
(VOID) LocalFree(*ppDescriptor);
|
|
|
|
*ppDescriptor = NULL;
|
|
|
|
return dwError;
|
|
CLEANUP:
|
|
return dwError;
|
|
}
|
|
|
|
// Description:
|
|
//
|
|
// Used to determine whether a given security descriptor grants
|
|
// full access to everyone.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// pSD - the security descriptor
|
|
// pbRestricts - TRUE if non-Everyone-full-access, FALSE otherwise
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Standard win32 error
|
|
//
|
|
DWORD
|
|
NsuAclDescriptorRestricts(
|
|
IN CONST PSECURITY_DESCRIPTOR pSD,
|
|
OUT BOOL* pbRestricts)
|
|
{
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
// Description:
|
|
//
|
|
// Gets security descriptor of a regkey.
|
|
//
|
|
//
|
|
// Arguments:
|
|
//
|
|
// ppSecurityDescriptor - security descriptor returned. Use NsuAclDescriptorDestroy
|
|
// to destroy.
|
|
// hKey - open handle of registry key
|
|
//
|
|
// Return Value:
|
|
//
|
|
// An allocated security attributes structure or NULL if out of memory.
|
|
//
|
|
|
|
DWORD
|
|
NsuAclGetRegKeyDescriptor(
|
|
IN HKEY hKey,
|
|
OUT PSECURITY_DESCRIPTOR* ppSecurityDescriptor
|
|
)
|
|
{
|
|
PSECURITY_DESCRIPTOR pSecurityDescriptor = 0;
|
|
DWORD dwError = ERROR_SUCCESS;
|
|
DWORD cbSecurityDescriptor = 0;
|
|
|
|
cbSecurityDescriptor = 0;
|
|
dwError = RegGetKeySecurity(
|
|
hKey,
|
|
DACL_SECURITY_INFORMATION,
|
|
NULL,
|
|
&cbSecurityDescriptor
|
|
);
|
|
if (dwError != ERROR_INSUFFICIENT_BUFFER) {
|
|
BAIL_ON_ERROR(dwError);
|
|
}
|
|
|
|
pSecurityDescriptor = LocalAlloc(LPTR, cbSecurityDescriptor);
|
|
BAIL_ON_NULL(pSecurityDescriptor, dwError);
|
|
dwError = RegGetKeySecurity(
|
|
hKey,
|
|
DACL_SECURITY_INFORMATION,
|
|
pSecurityDescriptor,
|
|
&cbSecurityDescriptor
|
|
);
|
|
BAIL_ON_ERROR(dwError);
|
|
|
|
*ppSecurityDescriptor = pSecurityDescriptor;
|
|
CLEANUP:
|
|
if (dwError) {
|
|
if (pSecurityDescriptor) {
|
|
LocalFree(pSecurityDescriptor);
|
|
}
|
|
*ppSecurityDescriptor = NULL;
|
|
}
|
|
|
|
return dwError;
|
|
}
|