|
|
//+-------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1995.
//
// File: access.hxx
//
// Contents: common internal includes for access control API
//
// History: 8-94 Created DaveMont
//
//--------------------------------------------------------------------
#ifndef __ACCESS_HXX__
#define __ACCESS_HXX__
extern "C" { #include <winldap.h>
}
#define NO_ACL_UPGRADE
#define PSD_BASE_LENGTH 1024
//
// BUGBUG - Get these names from the DS or at least internationalize them
//
#define ACTRL_DS_USER "User"
#define ACTRL_DS_GROUP "Group"
#define ACTRL_DS_DOMAIN "Domain"
#define ACTRL_DS_COMPUTER "Computer"
//
// This structure is used to keep track of all the changes for an
// item.
//
typedef struct _ACTRL_SD_LIST { PWSTR pwszProperty; PSECURITY_DESCRIPTOR pSD; } ACTRL_SD_LIST, *PACTRL_SD_LIST;
//
// This structure is used to read the specified information from the list
// of properties on the object
//
typedef struct _ACTRL_RIGHTS_INFO { PWSTR pwszProperty; SECURITY_INFORMATION SeInfo;
} ACTRL_RIGHTS_INFO, *PACTRL_RIGHTS_INFO;
//
// IsContainer enumerated type, used by aclbuild.hxx (exposed here for cairole\stg)
//
typedef enum _IS_CONTAINER { ACCESS_TO_UNKNOWN = 0, ACCESS_TO_OBJECT, ACCESS_TO_CONTAINER } IS_CONTAINER, *PIS_CONTAINER;
typedef struct _ACCESS_DS_ACCESS_INFO { ULONG cItems; ULONG iBase; } ACCESS_DS_ACCESS_INFO, *PACCESS_DS_ACCESS_INFO;
//
// This structure holds information on directories/registry
// keys where were not propagated due to the invoker not having
// list child rights
//
typedef struct _ACCESS_PROP_LOG_ENTRY { ULONG Protected; ULONG Error; PWSTR pwszPath; } ACCESS_PROP_LOG_ENTRY, *PACCESS_PROP_LOG_ENTRY;
//
// Forward reference
//
class CAccessList;
//
// These are the prototypes of the exported functions we need from
// netapi32.dll and samlib.dll and winspool.drv
//
typedef NTSTATUS (*PSAM_CLOSE_HANDLE)( SAM_HANDLE SamHandle );
typedef NTSTATUS (*PSAM_OPEN_DOMAIN)( SAM_HANDLE ServerHandle, ACCESS_MASK DesiredAccess, PSID DomainId, PSAM_HANDLE DomainHandle );
typedef NTSTATUS (*PSAM_CONNECT)( PUNICODE_STRING ServerName, PSAM_HANDLE ServerHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes );
typedef NTSTATUS (*PSAM_GET_MEMBERS_IN_GROUP)( SAM_HANDLE GroupHandle, PULONG * MemberIds, PULONG * Attributes, PULONG MemberCount );
typedef NTSTATUS (*PSAM_OPEN_GROUP)( SAM_HANDLE DomainHandle, ACCESS_MASK DesiredAccess, ULONG GroupId, PSAM_HANDLE GroupHandle );
typedef NTSTATUS (*PSAM_GET_MEMBERS_IN_ALIAS)( SAM_HANDLE AliasHandle, PSID ** MemberIds, PULONG MemberCount );
typedef NTSTATUS (*PSAM_OPEN_ALIAS)( SAM_HANDLE DomainHandle, ACCESS_MASK DesiredAccess, ULONG AliasId, PSAM_HANDLE AliasHandle );
typedef NET_API_STATUS (NET_API_FUNCTION *PNET_API_BUFFER_FREE)(LPVOID Buffer);
typedef NET_API_STATUS (NET_API_FUNCTION *PNET_SHARE_GET_INFO)( LPTSTR servername, LPTSTR netname, DWORD level, LPBYTE *bufptr );
typedef NET_API_STATUS (NET_API_FUNCTION *PNET_SHARE_SET_INFO)( LPTSTR servername, LPTSTR netname, DWORD level, LPBYTE buf, LPDWORD parm_err );
typedef NET_API_STATUS (NET_API_FUNCTION *PNET_DFS_GET_INFO)( LPWSTR DfsEntryPath, LPWSTR ServerName, LPWSTR ShareName, DWORD Level, LPBYTE* Buffer);
typedef NET_API_STATUS (NET_API_FUNCTION *PINET_GET_DC_LIST)( LPTSTR ServerName OPTIONAL, LPTSTR TrustedDomainName, PULONG DCCount, PUNICODE_STRING * DCNames );
typedef BOOL (WINAPI *POPEN_PRINTER)( LPWSTR pPrinterName, LPHANDLE phPrinter, LPPRINTER_DEFAULTSW pDefault );
typedef BOOL (WINAPI *PCLOSE_PRINTER)( HANDLE hPrinter );
typedef BOOL (WINAPI *PSET_PRINTER)( HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, DWORD Command );
typedef BOOL (WINAPI *PGET_PRINTER)( HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, DWORD cbBuf, LPDWORD pcbNeeded );
//
// Define a table of exported functions from netapi32.dll and samlib.dll that
// are needed by accctrl. We explicitly load these dynamic libraries when
// we need them.
//
#define LOADED_ALL_FUNCS 0x01
typedef struct _DLLFuncsTable { DWORD dwFlags; PSAM_CLOSE_HANDLE PSamCloseHandle; PSAM_OPEN_DOMAIN PSamOpenDomain; PSAM_CONNECT PSamConnect; PSAM_GET_MEMBERS_IN_GROUP PSamGetMembersInGroup; PSAM_OPEN_GROUP PSamOpenGroup; PSAM_GET_MEMBERS_IN_ALIAS PSamGetMembersInAlias; PSAM_OPEN_ALIAS PSamOpenAlias; PNET_API_BUFFER_FREE PNetApiBufferFree; PNET_SHARE_GET_INFO PNetShareGetInfo; PNET_SHARE_SET_INFO PNetShareSetInfo; PNET_DFS_GET_INFO PNetDfsGetInfo; PINET_GET_DC_LIST PI_NetGetDCList; POPEN_PRINTER POpenPrinter; PCLOSE_PRINTER PClosePrinter; PSET_PRINTER PSetPrinter; PGET_PRINTER PGetPrinter; } DLLFuncsTable;
extern DLLFuncsTable DLLFuncs;
//
// Security open type (used to help determine permissions to use on open)
//
typedef enum _SECURITY_OPEN_TYPE { READ_ACCESS_RIGHTS = 0, WRITE_ACCESS_RIGHTS, MODIFY_ACCESS_RIGHTS, NO_ACCESS_RIGHTS, RESET_ACCESS_RIGHTS } SECURITY_OPEN_TYPE, *PSECURITY_OPEN_TYPE;
//+---------------------------------------------------------------------------
//
// Function: Add2Ptr
//
// Synopsis: Add an unscaled increment to a ptr regardless of type.
//
// Arguments: [pv] -- Initial ptr.
// [cb] -- Increment
//
// Returns: Incremented ptr.
//
//----------------------------------------------------------------------------
inline VOID *Add2Ptr(PVOID pv, ULONG cb) { return((PBYTE) pv + cb); }
//+-------------------------------------------------------------------------
//
// memory.cxx
//
// Memory allocation/free prototypes
//
//+-------------------------------------------------------------------------
extern "C" { #define AccAlloc(size) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, size)
#define AccFree LocalFree
#if 0
#define AccAlloc(size) DebugAlloc(size);
#ifdef AccFree
#undef AccFree
#endif
#define AccFree(pv) DebugFree(pv);
#endif
}
//+-------------------------------------------------------------------------
// aclutil.cxx
//+-------------------------------------------------------------------------
DWORD LoadDLLFuncTable();
ACCESS_MASK AccessMaskForAccessEntry(IN PACTRL_ACCESS_ENTRY pAE, IN SE_OBJECT_TYPE ObjType);
DWORD ConvertStringToSid(IN PWSTR pwszString, OUT PSID *ppSid);
DWORD GetCurrentToken( OUT HANDLE *pHandle );
//
// REWRITE
//
#if 1
#include "file.h"
#include "service.h"
#include "printer.h"
#include "registry.h"
#include "lmsh.h"
#include "kernel.h"
#include "window.h"
#include "ds.h"
#include "wmiguid.h"
#endif
//+-------------------------------------------------------------------------
// common.cxx
//+-------------------------------------------------------------------------
DWORD IsContainer(IN HANDLE handle, IN SE_OBJECT_TYPE SeObjectType, OUT PIS_CONTAINER IsContainer);
ACCESS_MASK GetDesiredAccess(IN SECURITY_OPEN_TYPE OpenType, IN SECURITY_INFORMATION SecurityInfo);
DWORD ParseName(IN LPWSTR ObjectName, OUT LPWSTR *MachineName, OUT LPWSTR *RemainingName);
DWORD GetSecurityDescriptorParts( IN PISECURITY_DESCRIPTOR pSecurityDescriptor, IN SECURITY_INFORMATION SecurityInfo, OUT PSID *psidOwner, OUT PSID *psidGroup, OUT PACL *pDacl, OUT PACL *pSacl, OUT PSECURITY_DESCRIPTOR *pOutSecurityDescriptor);
DWORD OpenObject( IN LPWSTR ObjectName, IN SE_OBJECT_TYPE SeObjectType, IN ACCESS_MASK AccessMask, OUT PHANDLE handle);
DWORD CloseObject(IN HANDLE handle, IN SE_OBJECT_TYPE SeObjectType);
DWORD AccSetSDOnObject(IN PWSTR pwszObject, IN SE_OBJECT_TYPE ObjType, IN SECURITY_INFORMATION SeInfo, IN ULONG cItems, IN PACTRL_SD_LIST pSDList);
//+-------------------------------------------------------------------------
//
// file.cxx
//
// File function prototypes
//
//+-------------------------------------------------------------------------
DWORD IsFileContainer(IN HANDLE Handle, OUT PBOOL pfIsContainer);
DWORD IsFilePathLocalOrLM(IN LPWSTR pwszFile);
DWORD OpenFileObject(IN LPWSTR pObjectName, IN ACCESS_MASK AccessMask, OUT PHANDLE Handle, IN BOOL fOpenRoot);
#define CloseFileObject(handle) NtClose(handle);
DWORD ReadFilePropertyRights(IN LPWSTR pwszFile, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD ReadFileRights(IN HANDLE hObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetFileParentRights(IN LPWSTR pwszFile, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD SetFilePropertyRights(IN HANDLE hFile, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
DWORD SetAndPropagateFilePropertyRights(IN PWSTR pwszFile, IN PWSTR pwszProperty, IN CAccessList& RootAccList, IN PULONG pfStopFlag, IN PULONG pcProcessed, IN HANDLE hOpenObject OPTIONAL);
DWORD SetAndPropagateFilePropertyRightsByHandle(IN HANDLE hObject, IN PWSTR pwszProperty, IN CAccessList& RootAccList, IN PULONG pfStopFlag, IN PULONG pcProcessed);
DWORD PropagateFileRightsDeep(IN PSECURITY_DESCRIPTOR pParentSD, IN PSECURITY_DESCRIPTOR pOldParentSD, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszFile, IN PWSTR pwszProperty, IN PULONG pcProcessed, IN PULONG pfStopFlag, IN ULONG fProtectedFlag, IN HANDLE hToken, IN OUT CSList& LogList);
DWORD GetLMDfsPaths(IN PWSTR pwszPath, OUT PULONG pcItems, OUT PWSTR **pppwszLocalList OPTIONAL );
DWORD MakeSDSelfRelative(IN PSECURITY_DESCRIPTOR pOldSD, OUT PSECURITY_DESCRIPTOR *ppNewSD, OUT PACL *ppDAcl = NULL, OUT PACL *ppSAcl = NULL, IN BOOL fFreeOldSD = TRUE, IN BOOL fRtlAlloc = FALSE);
DWORD UpdateFileSDByPath(IN PSECURITY_DESCRIPTOR pCurrentSD, IN PWSTR pwszPath, IN HANDLE hFile, IN HANDLE hProcessToken, IN SECURITY_INFORMATION SeInfo, IN BOOL fIsContainer, OUT PSECURITY_DESCRIPTOR *ppNewSD);
//+-------------------------------------------------------------------------
//
// kernel.cxx
//
// Kernel function prototypes
//
//+-------------------------------------------------------------------------
DWORD OpenKernelObject(IN LPWSTR pwszObject, IN ACCESS_MASK AccessMask, OUT PHANDLE pHandle, OUT PMARTA_KERNEL_TYPE KernelType);
#define CloseKernelObject(handle) NtClose(handle);
DWORD ReadKernelPropertyRights(IN LPWSTR pwszObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetKernelParentRights(IN LPWSTR pwszObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD SetKernelSecurityInfo(IN HANDLE hKernel, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
DWORD GetKernelSecurityInfo(IN HANDLE hObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetKernelSecurityInfo(IN HANDLE hObject, IN SECURITY_INFORMATION SeInfo, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD OpenWmiGuidObject(IN LPWSTR pwszObject, IN ACCESS_MASK AccessMask, OUT PHANDLE pHandle, OUT PMARTA_KERNEL_TYPE KernelType);
#define CloseWmiGuidObject(handle) NtClose(handle);
DWORD ReadWmiGuidPropertyRights(IN LPWSTR pwszObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD SetWmiGuidSecurityInfo(IN HANDLE hKernel, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
DWORD GetWmiGuidSecurityInfo(IN HANDLE hObject, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetWmiGuidSecurityInfo(IN HANDLE hObject, IN SECURITY_INFORMATION SeInfo, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD);
//+-------------------------------------------------------------------------
//
// service.cxx
//
// Service function prototypes
//
//+-------------------------------------------------------------------------
DWORD OpenServiceObject(IN LPWSTR pwszService, IN ACCESS_MASK AccessMask, OUT SC_HANDLE * pHandle);
#define CloseServiceObject(handle) CloseServiceHandle(handle);
DWORD ReadServicePropertyRights(IN LPWSTR pwszService, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD ReadServiceRights(IN SC_HANDLE hSvc, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetServiceParentRights(IN LPWSTR pwszService, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD); DWORD SetServiceSecurityInfo(IN SC_HANDLE hService, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
//+-------------------------------------------------------------------------
//
// printer.cxx
//
// Printer function prototypes
//
//+-------------------------------------------------------------------------
DWORD OpenPrinterObject(IN LPWSTR pwszPrinter, IN ACCESS_MASK AccessMask, OUT PHANDLE pHandle);
DWORD ClosePrinterObject(IN HANDLE hPrinter);
DWORD ReadPrinterPropertyRights(IN LPWSTR pwszPrinter, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD ReadPrinterRights(IN HANDLE hPrinter, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetPrinterParentRights(IN LPWSTR pwszPrinter, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD); DWORD SetPrinterSecurityInfo(IN HANDLE hPrinter, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
//+-------------------------------------------------------------------------
//
// registry.cxx
//
// Registry function prototypes
//
//+-------------------------------------------------------------------------
DWORD OpenRegistryObject(IN LPWSTR pwszRegistry, IN ACCESS_MASK AccessMask, OUT PHANDLE pHandle);
DWORD ReadRegistryPropertyRights(IN LPWSTR pwszRegistry, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD ReadRegistryRights(IN HANDLE hRegistry, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetRegistryParentRights(IN LPWSTR pwszRegistry, IN SECURITY_INFORMATION SeInfo, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD SetRegistrySecurityInfo(IN HANDLE hRegistry, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
DWORD ReadRegistrySecurityInfo(IN HANDLE hRegistry, IN SECURITY_INFORMATION SeInfo, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD SetAndPropagateRegistryPropertyRights(IN PWSTR pwszRegistry, IN PWSTR pwszProperty, IN CAccessList& RootAccList, IN PULONG pfStopFlag, IN PULONG pcProcessed);
DWORD SetAndPropagateRegistryPropertyRightsByHandle(IN HKEY hReg, IN CAccessList& RootAccList, IN PULONG pfStopFlag, IN PULONG pcProcessed);
DWORD SetAndPropRegRights(IN HKEY hReg, IN PWSTR pwszPath, IN SECURITY_INFORMATION SeInfo, IN PSECURITY_DESCRIPTOR pParentSD, IN PSECURITY_DESCRIPTOR pSD, IN PULONG pfStopFlag, IN PULONG pcProcessed);
DWORD PropagateRegRightsDeep(IN PSECURITY_DESCRIPTOR pParentSD, IN PSECURITY_DESCRIPTOR pOldParentSD, IN SECURITY_INFORMATION SeInfo, IN HKEY hParent, IN PULONG pcProcessed, IN PULONG pfStopFlag, IN ULONG fProtectedFlag, IN HANDLE hProcessToken, IN OUT CSList& LogList);
DWORD UpdateRegistrySD(IN PSECURITY_DESCRIPTOR pCurrentSD, IN PSECURITY_DESCRIPTOR pParentSD, IN BOOL fIsContainer, OUT PSECURITY_DESCRIPTOR *ppNewSD);
DWORD UpdateRegistrySDByPath(IN PSECURITY_DESCRIPTOR pCurrentSD, IN HANDLE hRegistry, IN PWSTR pwszPath, IN SECURITY_INFORMATION SeInfo, IN BOOL fIsContainer, OUT PSECURITY_DESCRIPTOR *ppNewSD);
DWORD ConvertRegHandleToName(IN HKEY hKey, OUT PWSTR *ppwszName);
//+-------------------------------------------------------------------------
//
// window.cxx
//
// Window function prototypes
//
//+-------------------------------------------------------------------------
DWORD ReadWindowPropertyRights(IN HANDLE hWindow, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
//+-------------------------------------------------------------------------
//
// lmshare.cxx
//
// Network share function prototypes
//
//+-------------------------------------------------------------------------
DWORD ReadSharePropertyRights(IN LPWSTR pwszShare, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetShareParentRights(IN LPWSTR pwszShare, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD); DWORD SetShareSecurityInfo(IN LPWSTR pwszShare, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD);
DWORD PingLmShare(IN LPCWSTR pwszShare);
//+-------------------------------------------------------------------------
//
// dsobject.cxx
//
// DS Object function prototypes
//
//+-------------------------------------------------------------------------
DWORD PingDSObj(IN LPCWSTR pwszDSObj);
DWORD BindToDSObject(IN LPWSTR pwszServer, OPTIONAL IN LPWSTR pwszDSObj, OUT PLDAP *ppLDAP);
DWORD UnBindFromDSObject(OUT PLDAP *ppLDAP);
DWORD ReadDSObjPropertyRights(IN LPWSTR pwszDSObj, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD ReadAllDSObjPropertyRights(IN LPWSTR pwszDSObj, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, IN CAccessList& AccessList);
DWORD GetDSObjParentRights(IN LPWSTR pwszDSObj, IN PACTRL_RIGHTS_INFO pRightsList, IN ULONG cRights, OUT PACL *ppDAcl, OUT PACL *ppSAcl, OUT PSECURITY_DESCRIPTOR *ppSD); DWORD SetDSObjSecurityInfo(IN LPWSTR pwszDSObj, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, IN PSECURITY_DESCRIPTOR pSD, IN ULONG cSDSize, IN PULONG pfStopFlag, IN PULONG pcProcessed);
DWORD ReadDSObjSecDesc(IN PLDAP pLDAP, IN PWSTR pwszObject, IN SECURITY_INFORMATION SeInfo, OUT PSECURITY_DESCRIPTOR *ppSD);
DWORD Nt4NameToNt5Name(IN PWSTR pwszName, IN PWSTR pwszDomain, OUT PWSTR *ppwszNt5Name);
DWORD PropagateDSRightsDeep(IN PSECURITY_DESCRIPTOR pParentSD, IN PSECURITY_DESCRIPTOR pChildSD, IN SECURITY_INFORMATION SeInfo, IN PWSTR pszDSObject, IN PLDAP pLDAP, IN PULONG pcProcessed, IN PULONG pfStopFlag);
DWORD StampSD(IN PWSTR pwszObject, IN ULONG cSDSize, IN SECURITY_INFORMATION SeInfo, IN PSECURITY_DESCRIPTOR pSD, IN PLDAP pLDAP);
DWORD AccDsReadSchemaInfo (IN PLDAP pLDAP, OUT PULONG pcClasses, OUT PWSTR **pppwszClasses, OUT PULONG pcAttributes, OUT PWSTR **pppwszAttributes);
DWORD AccDsReadExtendedRights(IN PLDAP pLDAP, OUT PULONG pcItems, OUT PWSTR **pppwszNames, OUT PWSTR **pppwszGuid);
VOID AccDsFreeExtendedRights(IN ULONG cItems, IN PWSTR *ppwszNames, IN PWSTR *ppwszGuids);
DWORD DspSplitPath(IN PWSTR pwszObjectPath, OUT PWSTR *ppwszAllocatedServer, OUT PWSTR *ppwszReferencePath);
DWORD DspBindAndCrackEx( IN PWSTR pwszServer, IN PWSTR pwszDSObj, IN DWORD OptionalDsGetDcFlags, IN DS_NAME_FORMAT formatDesired, OUT PDS_NAME_RESULTW *pResults );
//+-------------------------------------------------------------------------
//
// alsup.cxx
//
// Miscellaneous support functions
//
//+-------------------------------------------------------------------------
DWORD ConvertToAutoInheritSD(IN PSECURITY_DESCRIPTOR pParentSD, IN PSECURITY_DESCRIPTOR pCurrentSD, IN BOOL fIsContainer, IN PGENERIC_MAPPING pGenericMapping, OUT PSECURITY_DESCRIPTOR *ppNewSD);
DWORD MakeSDAbsolute(IN PSECURITY_DESCRIPTOR pOriginalSD, IN SECURITY_INFORMATION SeInfo, OUT PSECURITY_DESCRIPTOR *ppNewSD, IN PSID pOwnerToAdd = NULL, IN PSID pGroupToAdd = NULL);
BOOL EqualSecurityDescriptors(IN PSECURITY_DESCRIPTOR pSD1, IN PSECURITY_DESCRIPTOR pSD2);
DWORD InsertPropagationFailureEntry(IN CSList& LogList, IN ULONG ErrorCode, IN ULONG Protected, IN PWSTR pwszPath);
VOID FreePropagationFailureListEntry(IN PVOID Entry);
DWORD WritePropagationFailureList(IN ULONG EventType, IN CSList& LogList, IN HANDLE hToken); //
// Helper functions and macros
//
#define ACC_ALLOC_AND_COPY_SID(pInSid, pOutSid, err) \
pOutSid = (PSID)AccAlloc(RtlLengthSid(pInSid)); \ if(pOutSid == NULL) \ { \ err = ERROR_NOT_ENOUGH_MEMORY; \ } \ else \ { \ RtlCopySid(RtlLengthSid(pInSid), pOutSid, pInSid); \ }
#define ACC_ALLOC_AND_COPY_GUID(pInGuid, pOutGuid, err) \
pOutGuid = (GUID *)AccAlloc(sizeof(GUID)); \ if(pOutGuid == NULL) \ { \ err = ERROR_NOT_ENOUGH_MEMORY; \ } \ else \ { \ memcpy(pOutGuid, pInGuid, sizeof(GUID)); \ }
#define DACL_PROTECTED(pSD) FLAG_ON(((PISECURITY_DESCRIPTOR)pSD)->Control, SE_DACL_PROTECTED)
#define SACL_PROTECTED(pSD) FLAG_ON(((PISECURITY_DESCRIPTOR)pSD)->Control, SE_SACL_PROTECTED)
#if 0
#define CHECK_HEAP ASSERT(RtlValidateHeap(RtlProcessHeap(),0,NULL));
#else
#define CHECK_HEAP
#endif
//+---------------------------------------------------------------------------
//
// Function: AccGetBufferOfSizeW
//
// Synopsis: This inline function will copy a string into the provided
// buffer if it is big enough or allocate a buffer if it is not.
// Regardless, the pointer will always point to the new copy of
// the string
//
// Arguments: [IN pwszString] -- The string to copy
// [IN pwszStack] -- The stack based buffer
// [OUT ppwszPtr] -- The pointer that gets
// initialized to our stack or
// allocated buffer
//
// Returns: ERROR_SUCCESS -- Success
// ERROR_NOT_ENOUGH_MEMORY -- A memory allocation failed
//
//----------------------------------------------------------------------------
inline DWORD AccGetBufferOfSizeW(PWSTR pwszString, PWSTR pwszStack, PWSTR *ppwszPtr) { DWORD dwErr = ERROR_SUCCESS; DWORD dwSize = SIZE_PWSTR(pwszString); if(dwSize <= sizeof(pwszStack)) { memcpy(pwszStack, pwszString, dwSize); *ppwszPtr = pwszStack; } else { *ppwszPtr = (PWSTR)AccAlloc(dwSize); if(*ppwszPtr == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { memcpy(*ppwszPtr, pwszString, dwSize); } }
return(dwErr); }
//
// This macro will free any memory allocated by AccGetBufferOfSizeW
//
#define AccFreeBufferOfSizeW(stack, ptr) \
if(ptr != stack) \ { \ AccFree(ptr); \ }
//
// This macro determines if a string is a UNC path or not
//
#define IS_UNC_PATH(wsz, wl) \
((wl) > 2 && (wsz)[0] == L'\\' && (wsz)[1] == L'\\')
#define IS_FILE_PATH(wsz, wl) \
((wl) >= 1 && (wsz)[1] == L':') #endif // __ACCESSHXX__
|