|
|
//+-------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1996.
//
// File: MARTAEXP.HXX
//
// Contents: Function definitions for exported helper functions
//
// History: 06-Sep-96 MacM Created
//
//--------------------------------------------------------------------
#ifndef __MARTAEXP_HXX__
#define __MARTAEXP_HXX__
extern "C" { #include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
}
typedef enum _MARTA_KERNEL_TYPE { MARTA_UNKNOWN = 0, MARTA_EVENT, MARTA_EVENT_PAIR, MARTA_MUTANT, MARTA_PROCESS, MARTA_SECTION, MARTA_SEMAPHORE, MARTA_SYMBOLIC_LINK, MARTA_THREAD, MARTA_TIMER, MARTA_JOB, MARTA_WMI_GUID
} MARTA_KERNEL_TYPE, *PMARTA_KERNEL_TYPE;
//
// Determines whether a bit flag is turned on or not
//
#define FLAG_ON(flags,bit) ((flags) & (bit))
//
// This macro will return the size, in bytes, of a buffer needed to hold
// the given string
//
#define SIZE_PWSTR(wsz) (wsz == NULL ? 0 : (wcslen(wsz) + 1) * sizeof(WCHAR))
//
// This macro will copy the specified string to the new destination, after
// allocating a buffer of sufficient size
//
#define ACC_ALLOC_AND_COPY_STRINGW(OldString, NewString, err) \
NewString = (PWSTR)AccAlloc(SIZE_PWSTR(OldString)); \ if(NewString == NULL) \ { \ err = ERROR_NOT_ENOUGH_MEMORY; \ } \ else \ { \ wcscpy((PWSTR)NewString, \ OldString); \ }
//
// Flags to pass in to AccConvertAccessToSD
//
#define ACCCONVERT_SELF_RELATIVE 0x00000001
#define ACCCONVERT_DS_FORMAT 0x00000002
//+-------------------------------------------------------------------------
// helper.cxx
//+-------------------------------------------------------------------------
ULONG TrusteeAllocationSize(IN PTRUSTEE_W pTrustee);
ULONG TrusteeAllocationSizeWToA(IN PTRUSTEE_W pTrustee);
ULONG TrusteeAllocationSizeAToW(IN PTRUSTEE_A pTrustee);
VOID SpecialCopyTrustee(VOID **pStuffPtr, PTRUSTEE pToTrustee, PTRUSTEE pFromTrustee);
DWORD CopyTrusteeAToTrusteeW( IN OUT VOID ** ppStuffPtr, IN PTRUSTEE_A pFromTrusteeA, OUT PTRUSTEE_W pToTrusteeW );
DWORD CopyTrusteeWToTrusteeA( IN OUT VOID ** ppStuffPtr, IN PTRUSTEE_W pFromTrusteeW, OUT PTRUSTEE_A pToTrusteeA );
DWORD ExplicitAccessAToExplicitAccessW( IN ULONG cCountAccesses, IN PEXPLICIT_ACCESS_A paAccess, OUT PEXPLICIT_ACCESS_W * ppwAccess );
DWORD ExplicitAccessWToExplicitAccessA( IN ULONG cCountAccesses, IN PEXPLICIT_ACCESS_W pwAccess, OUT PEXPLICIT_ACCESS_A * ppaAccess );
DWORD DoTrusteesMatch(PWSTR pwszServer, PTRUSTEE pTrustee1, PTRUSTEE pTrustee2, PBOOL pfMatch);
//+-------------------------------------------------------------------------
// aclutil.cxx
//+-------------------------------------------------------------------------
extern "C" { DWORD AccGetSidFromToken(PWSTR pwszServer, HANDLE hToken, TOKEN_INFORMATION_CLASS TIC, PSID *ppSidFromToken);
DWORD AccLookupAccountSid(IN PWSTR pwszServer, IN PTRUSTEE pName, OUT PSID *ppsid, OUT SID_NAME_USE *pSidType);
DWORD AccLookupAccountTrustee(IN PWSTR pwszServer, IN PSID psid, OUT PTRUSTEE *ppTrustee);
DWORD AccLookupAccountName(IN PWSTR pwszServer, IN PSID pSid, OUT LPWSTR *ppwszName, OUT LPWSTR *ppwszDomain, OUT SID_NAME_USE *pSidType);
DWORD AccSetEntriesInAList(IN ULONG cEntries, IN PACTRL_ACCESS_ENTRYW pAccessEntryList, IN ACCESS_MODE AccessMode, IN SECURITY_INFORMATION SeInfo, IN LPCWSTR lpProperty, IN BOOL fDoOldStyleMerge, IN PACTRL_AUDITW pOldList, OUT PACTRL_AUDITW *ppNewList);
DWORD AccConvertAccessToSecurityDescriptor(IN PACTRL_ACCESSW pAccessList, IN PACTRL_AUDITW pAuditList, IN LPCWSTR lpOwner, IN LPCWSTR lpGroup, OUT PSECURITY_DESCRIPTOR *ppSecDescriptor);
DWORD AccConvertSDToAccess(IN SE_OBJECT_TYPE ObjectType, IN PSECURITY_DESCRIPTOR pSecDescriptor, OUT PACTRL_ACCESSW *ppAccessList, OUT PACTRL_AUDITW *ppAuditList, OUT LPWSTR *lppOwner, OUT LPWSTR *lppGroup);
DWORD AccConvertAccessToSD(IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SeInfo, IN PACTRL_ACCESSW pAccessList, IN PACTRL_AUDITW pAuditList, IN LPWSTR lpOwner, IN LPWSTR lpGroup, IN ULONG fOpts, OUT PSECURITY_DESCRIPTOR *ppSD, OUT PULONG pcSDSize);
DWORD AccGetAccessForTrustee(IN PTRUSTEE pTrustee, IN PACL pAcl, IN SECURITY_INFORMATION SeInfo, IN PWSTR pwszProperty, OUT PACCESS_RIGHTS pAllowed, OUT PACCESS_RIGHTS pDenied);
DWORD AccConvertAclToAccess(IN SE_OBJECT_TYPE ObjectType, IN PACL pAcl, OUT PACTRL_ACCESSW *ppAccessList);
DWORD AccGetExplicitEntries(IN PTRUSTEE pTrustee, IN SE_OBJECT_TYPE ObjectType, IN PACL pAcl, IN PWSTR pwszProperty, OUT PULONG pcEntries, OUT PACTRL_ACCESS_ENTRYW *ppAEList);
VOID AccConvertAccessMaskToActrlAccess(IN ACCESS_MASK Access, IN SE_OBJECT_TYPE ObjType, IN MARTA_KERNEL_TYPE KernelObjectType, IN PACTRL_ACCESS_ENTRY pAE); }
typedef struct _CSLIST_NODE { PVOID pvData; struct _CSLIST_NODE *pNext; } CSLIST_NODE, *PCSLIST_NODE;
#define LIST_INLINE
#ifdef LIST_INLINE
#define LINLINE inline
#else
#define LINLINE
#endif
//
// Free function callback typedef. This function will delete the memory saved
// as the data in a list node on list destruction
//
typedef VOID (*FreeFunc)(PVOID);
//
// This function returns TRUE if the two items are the same, or FALSE if they
// are not
//
typedef BOOL (*CompFunc)(PVOID, PVOID);
//+---------------------------------------------------------------------------
//
// Class: CSList
//
// Synopsis: Singly linked list class, single threaded
//
// Methods: Insert
// InsertIfUnique
// Find
// Reset
// NextData
// Remove
// QueryCount
//
//----------------------------------------------------------------------------
class CSList { public: CSList(FreeFunc pfnFree = NULL) : _pfnFree (pfnFree), _pCurrent (NULL), _cItems (0) { _pHead = NULL; _pTail = NULL; };
LINLINE ~CSList();
DWORD QueryCount(void) { return(_cItems);};
VOID Init(FreeFunc pfnFree = NULL) { if(_pHead == NULL) { _pfnFree = pfnFree; _pCurrent = NULL; _cItems = 0; } };
LINLINE DWORD Insert(PVOID pvData);
LINLINE DWORD InsertIfUnique(PVOID pvData, CompFunc pfnComp);
LINLINE PVOID Find(PVOID pvData, CompFunc pfnComp);
LINLINE PVOID NextData();
VOID Reset() {_pCurrent = _pHead;};
LINLINE DWORD Remove(PVOID pData);
LINLINE VOID FreeList(FreeFunc pfnFree); protected: PCSLIST_NODE _pHead; PCSLIST_NODE _pCurrent; PCSLIST_NODE _pTail; DWORD _cItems; FreeFunc _pfnFree;
LINLINE PCSLIST_NODE FindNode(PVOID pvData, CompFunc pfnComp);
};
//+------------------------------------------------------------------
//
// Member: CSList::~CSList
//
// Synopsis: Destructor for the CSList class
//
// Arguments: None
//
// Returns: void
//
//+------------------------------------------------------------------
CSList::~CSList() { while(_pHead != NULL) { PCSLIST_NODE pNext = _pHead->pNext;
if(_pfnFree != NULL) { (*_pfnFree)(_pHead->pvData); }
LocalFree(_pHead);
_pHead = pNext;
} }
//+------------------------------------------------------------------
//
// Member: CSList::Insert
//
// Synopsis: Creates a new node at the begining of the list and
// inserts it into the list
//
//
// Arguments: [IN pvData] -- Data to insert
//
// Returns: ERROR_SUCCESS -- Everything worked
// ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
//
//+------------------------------------------------------------------
DWORD CSList::Insert(PVOID pvData) { DWORD dwErr = ERROR_SUCCESS;
PCSLIST_NODE pNew = (PCSLIST_NODE)LocalAlloc(LMEM_FIXED, sizeof(CSLIST_NODE)); if(pNew == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { pNew->pvData = pvData;
pNew->pNext = NULL;
if ( _pHead == NULL ) {
_pHead = _pTail = pNew;
} else {
_pTail->pNext = pNew; _pTail = pNew; }
_cItems++; }
return(dwErr); }
//+------------------------------------------------------------------
//
// Member: CSList::InsertIfUnique
//
// Synopsis: Creates a new node at the begining of the list and
// inserts it into the list if the data does not already
// exist in the list. If the data does exist, nothing
// is done, but SUCCESS is returned
//
//
// Arguments: [IN pvData] -- Data to insert
//
// Returns: ERROR_SUCCESS -- Everything worked
// ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
//
//+------------------------------------------------------------------
DWORD CSList::InsertIfUnique(PVOID pvData, CompFunc pfnComp) { DWORD dwErr = ERROR_SUCCESS;
if(FindNode(pvData, pfnComp) == NULL) { dwErr = Insert(pvData); }
return(dwErr); }
//+------------------------------------------------------------------
//
// Member: CSList::FindNode
//
// Synopsis: Locates the node for the given data in the list, if it exists
//
// Arguments: [IN pvData] -- Data to find
// [IN pfnComp] -- Pointer to a comparrison function
//
// Returns: ERROR_SUCCESS -- Everything worked
// ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
//
//+------------------------------------------------------------------
PCSLIST_NODE CSList::FindNode(PVOID pvData, CompFunc pfnComp) { PCSLIST_NODE pRet = _pHead;
// for(ULONG i = 0; i < _cItems; i++)
while (pRet != NULL) { if((pfnComp)(pvData, pRet->pvData) == TRUE) { break; }
pRet = pRet->pNext; }
return(pRet); }
//+------------------------------------------------------------------
//
// Member: CSList::Find
//
// Synopsis: Locates the given data in the list, if it exists
//
// Arguments: [IN pvData] -- Data to insert
//
// Returns: ERROR_SUCCESS -- Everything worked
// ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
//
//+------------------------------------------------------------------
PVOID CSList::Find(PVOID pvData, CompFunc pfnComp) { PCSLIST_NODE pNode = FindNode(pvData, pfnComp);
return(pNode == NULL ? NULL : pNode->pvData); }
//+------------------------------------------------------------------
//
// Member: CSList::NextData
//
// Synopsis: Returns the next data in the list
//
//
// Arguments: None
//
// Returns: NULL -- No more items
// Pointer to next data in list on success
//
//+------------------------------------------------------------------
PVOID CSList::NextData() { PVOID pvRet = NULL; if(_pCurrent != NULL) { pvRet = _pCurrent->pvData; _pCurrent = _pCurrent->pNext; }
return(pvRet); }
//+------------------------------------------------------------------
//
// Member: CSList::Remove
//
// Synopsis: Removes the node that references the indicated data
//
// Arguments: pData -- The data in the node to remove
//
// Returns: ERROR_SUCCESS -- Success
// ERROR_INVALID_PARAMETER Node not found
//
//+------------------------------------------------------------------
DWORD CSList::Remove(PVOID pData) { DWORD dwErr = ERROR_INVALID_PARAMETER; PCSLIST_NODE pNode = _pHead, pPrev = NULL;
for(ULONG i = 0; i < _cItems; i++) { if(pNode->pvData == pData) { //
// We've got a match...
//
if(pPrev == NULL) { _pHead = _pHead->pNext; } else { pPrev->pNext = pNode->pNext; }
if (NULL == pNode->pNext) { _pTail = pPrev; }
LocalFree(pNode); _cItems--; break;
}
pPrev = pNode; pNode = pNode->pNext;
}
return(dwErr); }
//+------------------------------------------------------------------
//
// Member: CSList::FreeList
//
// Synopsis: Frees the list
//
// Arguments: pfnFree -- Optional deletion routine to use for freeing
// any allocated memory
//
// Returns: void
//
//+------------------------------------------------------------------
VOID CSList::FreeList(FreeFunc pfnFree) { while(_pHead != NULL) { PCSLIST_NODE pNext = _pHead->pNext;
if(pfnFree != NULL) { (*pfnFree)(_pHead->pvData); }
LocalFree(_pHead);
_pHead = pNext;
} }
//
// Exported functions pointer definitions
//
typedef DWORD (*pfNTMartaLookupTrustee) (PWSTR pwszServer, PSID pSid, PTRUSTEE *ppTrustee);
typedef DWORD (*pfNTMartaLookupName) (PWSTR pwszServer, PSID pSid, LPWSTR *ppwszName, LPWSTR *ppwszDomain, SID_NAME_USE *pSidType);
typedef DWORD (*pfNTMartaLookupSid) (PWSTR pwszServer, PTRUSTEE pName, PSID *ppsid, SID_NAME_USE *pSidType);
typedef DWORD (*pfNTMartaSetAList) (ULONG cEntries, PACTRL_ACCESS_ENTRYW pAccessEntryList, ACCESS_MODE AccessMode, SECURITY_INFORMATION SeInfo, LPCWSTR lpProperty, BOOL fDoOldStyleMerge, PACTRL_AUDITW pOldList, PACTRL_AUDITW *ppNewList);
typedef DWORD (*pfNTMartaAToSD) (PACTRL_ACCESSW pAccessList, PACTRL_AUDITW pAuditList, LPCWSTR lpOwner, LPCWSTR lpGroup, PSECURITY_DESCRIPTOR *ppSecDescriptor);
typedef DWORD (*pfNTMartaSDToA) (SE_OBJECT_TYPE ObjectType, PSECURITY_DESCRIPTOR pSecDescriptor, PACTRL_ACCESSW *ppAccessList, PACTRL_AUDITW *ppAuditList, LPWSTR *lppOwner, LPWSTR *lppGroup);
typedef DWORD (*pfNTMartaAclToA)(SE_OBJECT_TYPE ObjectType, PACL pAcl, PACTRL_ACCESSW *ppAccessList);
typedef DWORD (*pfNTMartaGetAccess) (PTRUSTEE pTrustee, PACL pAcl, SECURITY_INFORMATION SeInfo, PWSTR pwszProperty, PACCESS_RIGHTS pAllowed, PACCESS_RIGHTS pDenied);
typedef DWORD (*pfNTMartaGetExplicit)(PTRUSTEE pTrustee, SE_OBJECT_TYPE ObjectType, PACL pAcl, PWSTR pwszProperty, PULONG pcEntries, PACTRL_ACCESS_ENTRYW *ppAEList); typedef VOID (*FN_PROGRESS) ( IN LPWSTR pObjectName, // name of object just processed
IN DWORD Status, // status of operation on object
IN OUT PPROG_INVOKE_SETTING pInvokeSetting, // Never, always,
IN PVOID Args, // Caller specific data
IN BOOL SecuritySet // Whether security was set
);
typedef DWORD (*pfNTMartaTreeResetNamedSecurityInfo) ( IN LPWSTR pObjectName, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, IN PSID pOwner, IN PSID pGroup, IN PACL pDacl, IN PACL pSacl, IN BOOL KeepExplicit, IN FN_PROGRESS fnProgress, IN PROG_INVOKE_SETTING ProgressInvokeSetting, IN PVOID Args );
// typedef PVOID PFN_OBJECT_MGR_FUNCTS;
typedef DWORD (*pfNTMartaGetInheritanceSource) ( IN LPWSTR pObjectName, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, IN BOOL Container, IN GUID ** pObjectClassGuids OPTIONAL, IN DWORD GuidCount, IN PACL pAcl, IN PGENERIC_MAPPING pGenericMapping, IN PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL, OUT PINHERITED_FROMW pInheritArray );
typedef DWORD (*PFN_FREE) (IN PVOID Mem);
typedef DWORD (*pfNTMartaFreeIndexArray) ( IN OUT PINHERITED_FROMW pInheritArray, IN USHORT AceCnt, IN PFN_FREE pfnFree OPTIONAL ); typedef DWORD (*pfNTMartaGetNamedRights) ( IN LPWSTR pObjectName, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, OUT PSID * ppSidOwner, OUT PSID * ppSidGroup, OUT PACL * ppDacl, OUT PACL * ppSacl, OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor);
typedef DWORD (*pfNTMartaSetNamedRights) ( IN LPWSTR pObjectName, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, IN PSECURITY_DESCRIPTOR pSecurityDescriptor, IN BOOL bSkipInheritanceComputation );
typedef DWORD (*pfNTMartaGetHandleRights) ( IN HANDLE Handle, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, OUT PSID * ppSidOwner, OUT PSID * ppSidGroup, OUT PACL * ppDacl, OUT PACL * ppSacl, OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor);
typedef DWORD (*pfNTMartaSetHandleRights) ( IN HANDLE Handle, IN SE_OBJECT_TYPE ObjectType, IN SECURITY_INFORMATION SecurityInfo, IN PSECURITY_DESCRIPTOR pSecurityDescriptor );
typedef DWORD (*pfNTMartaSetEntriesInAcl) ( IN ULONG cCountOfExplicitEntries, IN PEXPLICIT_ACCESS_W pListOfExplicitEntries, IN PACL OldAcl, OUT PACL * pNewAcl );
typedef DWORD (*pfNTMartaGetExplicitEntriesFromAcl) ( IN PACL pacl, OUT PULONG pcCountOfExplicitEntries, OUT PEXPLICIT_ACCESS_W * pListOfExplicitEntries );
#endif // ifdef __MARTAEXP_HXX__
|