mirror of
https://github.com/ladislav-zezula/FileTest
synced 2026-06-08 15:24:12 +00:00
211 lines
8.2 KiB
C++
211 lines
8.2 KiB
C++
/*****************************************************************************/
|
|
/* Page09Security.cpp Copyright (c) Ladislav Zezula 2005 */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Description : */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Date Ver Who Comment */
|
|
/* -------- ---- --- ------- */
|
|
/* 15.08.05 1.00 Lad The first version of Page09Security.cpp */
|
|
/*****************************************************************************/
|
|
|
|
#include "FileTest.h"
|
|
#include "resource.h"
|
|
|
|
#ifdef __TEST_MODE__
|
|
|
|
/*
|
|
static PSID GetUserSid(LPCTSTR szUserName, LPDWORD pcbSid)
|
|
{
|
|
SID_NAME_USE SidNameUse;
|
|
PSID pSid = NULL;
|
|
DWORD cbSid = 0;
|
|
DWORD cbDomain = 128;
|
|
TCHAR szDomain[128];
|
|
|
|
LookupAccountName(NULL, szUserName, pSid, &cbSid, szDomain, &cbDomain, &SidNameUse);
|
|
if(cbSid != 0)
|
|
{
|
|
if((pSid = LocalAlloc(LPTR, cbSid)) != NULL)
|
|
{
|
|
if(LookupAccountName(NULL, szUserName, pSid, &cbSid, szDomain, &cbDomain, &SidNameUse))
|
|
{
|
|
pcbSid[0] = cbSid;
|
|
return pSid;
|
|
}
|
|
LocalFree(pSid);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
*/
|
|
|
|
PACL CreateEmptyDacl()
|
|
{
|
|
PACL pAcl;
|
|
|
|
if((pAcl = (PACL)LocalAlloc(LPTR, sizeof(ACL))) != NULL)
|
|
{
|
|
if(RtlCreateAcl(pAcl, sizeof(ACL), ACL_REVISION_DS) != STATUS_SUCCESS)
|
|
{
|
|
LocalFree(pAcl);
|
|
pAcl = NULL;
|
|
}
|
|
}
|
|
return pAcl;
|
|
}
|
|
|
|
PACL CreateCustomAcl()
|
|
{
|
|
PACL pAcl;
|
|
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
|
|
// Allocate space for ACL
|
|
if((pAcl = (PACL)LocalAlloc(LPTR, MAX_ACL_LENGTH)) != NULL)
|
|
{
|
|
if((Status = RtlCreateAcl(pAcl, MAX_ACL_LENGTH, ACL_REVISION_DS)) == STATUS_SUCCESS)
|
|
{
|
|
PACE_HEADER pAceHeader;
|
|
WORD cbAclSize = sizeof(ACL);
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_ALLOWED_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
/*
|
|
if((pAceHeader = ACE_HELPER(ACCESS_DENIED_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_AUDIT_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_ALARM_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_ALLOWED_COMPOUND_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_ALLOWED_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_DENIED_OBJECT_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_AUDIT_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_ALARM_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_ALLOWED_CALLBACK_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_DENIED_CALLBACK_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE, FILE_EXECUTE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_AUDIT_CALLBACK_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_ALARM_CALLBACK_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_MANDATORY_LABEL_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_I64_VALUES", CLAIM_SECURITY_ATTRIBUTE_TYPE_INT64)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_U64_VALUES", CLAIM_SECURITY_ATTRIBUTE_TYPE_UINT64)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
*/
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_STRINGS", CLAIM_SECURITY_ATTRIBUTE_TYPE_STRING, 5)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
/*
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_SIDS", CLAIM_SECURITY_ATTRIBUTE_TYPE_SID)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_BOOLEANS", CLAIM_SECURITY_ATTRIBUTE_TYPE_BOOLEAN, 4)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(ACE_CSA_HELPER(L"RESOURCE_ITEM_OCTET_STRINGS", CLAIM_SECURITY_ATTRIBUTE_TYPE_OCTET_STRING)).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_SCOPED_POLICY_ID_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_PROCESS_TRUST_LABEL_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
|
|
if((pAceHeader = ACE_HELPER(SYSTEM_ACCESS_FILTER_ACE_TYPE).AddToAcl(pAcl)) != NULL)
|
|
cbAclSize = cbAclSize + pAceHeader->AceSize;
|
|
*/
|
|
pAcl->AclSize = cbAclSize;
|
|
}
|
|
}
|
|
return pAcl;
|
|
}
|
|
|
|
static DWORD SetCustomSecurityDescriptor(HANDLE hObject)
|
|
{
|
|
SECURITY_DESCRIPTOR sd;
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
PACL pAcl = NULL;
|
|
|
|
UNREFERENCED_PARAMETER(hObject);
|
|
|
|
// Initialize the blank security descriptor
|
|
Status = RtlCreateSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
|
|
if(NT_SUCCESS(Status))
|
|
{
|
|
// Create custom ACL
|
|
if((pAcl = CreateCustomAcl()) != NULL)
|
|
{
|
|
// Set the ACL to the security descriptor
|
|
Status = RtlSetDaclSecurityDescriptor(&sd, TRUE, pAcl, FALSE);
|
|
if(NT_SUCCESS(Status))
|
|
{
|
|
// Set the security descriptor to the object
|
|
Status = NtSetSecurityObject(hObject, DACL_SECURITY_INFORMATION, &sd);
|
|
}
|
|
LocalFree(pAcl);
|
|
}
|
|
else
|
|
{
|
|
Status = STATUS_NO_MEMORY;
|
|
}
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
void SetCustomSecurityDescriptor(LPCTSTR szPath)
|
|
{
|
|
HANDLE hFolder;
|
|
|
|
// Make sure that the folder exists
|
|
ForcePathExist(szPath, TRUE);
|
|
|
|
// Open the folder and set security descriptor
|
|
hFolder = CreateFile(szPath, READ_CONTROL | WRITE_DAC | WRITE_OWNER, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
|
if(hFolder != INVALID_HANDLE_VALUE)
|
|
{
|
|
SetCustomSecurityDescriptor(hFolder);
|
|
CloseHandle(hFolder);
|
|
}
|
|
}
|
|
|
|
void DebugCode_SecurityDescriptor(LPCTSTR /* szPath */)
|
|
{
|
|
//SetCustomSecurityDescriptor(_T("c:\\VMWARE\\TestValidAcl"));
|
|
}
|
|
#endif
|
|
|