/*++ Copyright (c) 2001 Microsoft Corporation Module Name: util.h Abstract: Definitions of Utility routines Author: Cliff Van Dyke (cliffv) 11-Apr-2001 --*/ #ifdef __cplusplus extern "C" { #endif ///////////////////////////////////////////////////////////////////////////// // // Macros // ///////////////////////////////////////////////////////////////////////////// // // Macros for locking the global resource // #define AzpLockResourceExclusive( _Resource ) \ SafeAcquireResourceExclusive( _Resource, TRUE ) #define AzpIsLockedExclusive( _Resource ) \ (SafeNumberOfActive( _Resource ) < 0 ) #define AzpLockResourceShared( _Resource ) \ SafeAcquireResourceShared( _Resource, TRUE ) #define AzpLockResourceSharedToExclusive( _Resource ) \ SafeConvertSharedToExclusive( _Resource ) #define AzpLockResourceExclusiveToShared( _Resource ) \ SafeConvertExclusiveToShared( _Resource ) #define AzpIsLockedShared( _Resource ) \ (SafeNumberOfActive( _Resource ) != 0 ) #define AzpUnlockResource( _Resource ) \ SafeReleaseResource( _Resource ) // // Macros for safe critsect // #define AzpIsCritsectLocked( _CritSect ) \ ( SafeCritsecLockCount( _CritSect ) != -1L) ///////////////////////////////////////////////////////////////////////////// // // Structure definitions // ///////////////////////////////////////////////////////////////////////////// // // Generic counted string. // Can't use UNICODE_STRING since that is limited to 32K characters. // typedef struct _AZP_STRING { // // Pointer to the string // LPWSTR String; // // Size of the string in bytes (including trailing zero) // ULONG StringSize; // // String is a binary SID // BOOL IsSid; } AZP_STRING, *PAZP_STRING; // // Generic expandable array of pointers // typedef struct _AZP_PTR_ARRAY { // // Pointer to allocated array of pointers // PVOID *Array; // // Number of elements actually used in array // ULONG UsedCount; // // Number of elemets allocated in the array // ULONG AllocatedCount; #define AZP_PTR_ARRAY_INCREMENT 4 // Amount to grow the array by } AZP_PTR_ARRAY, *PAZP_PTR_ARRAY; ///////////////////////////////////////////////////////////////////////////// // // Global definitions // ///////////////////////////////////////////////////////////////////////////// extern LIST_ENTRY AzGlAllocatedBlocks; extern SAFE_CRITICAL_SECTION AzGlAllocatorCritSect; extern PSID AzGlCreatorOwnerSid; extern PSID AzGlCreatorGroupSid; extern PSID AzGlWorldSid; extern ULONG AzGlWorldSidSize; ///////////////////////////////////////////////////////////////////////////// // // Procedure definitions // ///////////////////////////////////////////////////////////////////////////// PVOID AzpAllocateHeap( IN SIZE_T Size, IN LPSTR pDescr OPTIONAL ); PVOID AzpAllocateHeapSafe( IN SIZE_T Size ); VOID AzpFreeHeap( IN PVOID Buffer ); PVOID AzpAvlAllocate( IN PRTL_GENERIC_TABLE Table, IN CLONG ByteSize ); VOID AzpAvlFree( IN PRTL_GENERIC_TABLE Table, IN PVOID Buffer ); VOID AzpInitString( OUT PAZP_STRING AzpString, IN LPCWSTR String OPTIONAL ); DWORD AzpDuplicateString( OUT PAZP_STRING AzpOutString, IN PAZP_STRING AzpInString ); DWORD AzpCaptureString( OUT PAZP_STRING AzpString, IN LPCWSTR String, IN ULONG MaximumLength, IN BOOLEAN NullOk ); VOID AzpInitSid( OUT PAZP_STRING AzpString, IN PSID Sid ); DWORD AzpCaptureSid( OUT PAZP_STRING AzpString, IN PSID Sid ); DWORD AzpCaptureLong( IN PVOID PropertyValue, OUT PLONG UlongValue ); BOOL AzpEqualStrings( IN PAZP_STRING AzpString1, IN PAZP_STRING AzpString2 ); LONG AzpCompareSidString( IN PAZP_STRING AzpString1, IN PAZP_STRING AzpString2 ); LONG AzpCompareSid( IN PSID Sid1, IN PSID Sid2 ); LONG AzpCompareStrings( IN PAZP_STRING AzpString1, IN PAZP_STRING AzpString2 ); LONG AzpCompareDeltaEntries( const void *DeltaEntry1, const void *DeltaEntry2 ); VOID AzpSwapStrings( IN OUT PAZP_STRING AzpString1, IN OUT PAZP_STRING AzpString2 ); VOID AzpFreeString( IN PAZP_STRING AzpString ); BOOLEAN AzpBsearchPtr ( IN PAZP_PTR_ARRAY AzpPtrArray, IN PVOID Key, IN LONG (*Compare)(const void *, const void *), OUT PULONG InsertionPoint OPTIONAL ); #define AZP_ADD_ENDOFLIST 0xFFFFFFFF DWORD AzpAddPtr( IN PAZP_PTR_ARRAY AzpPtrArray, IN PVOID Pointer, IN ULONG Index ); VOID AzpRemovePtrByIndex( IN PAZP_PTR_ARRAY AzpPtrArray, IN ULONG Index ); VOID AzpRemovePtrByPtr( IN PAZP_PTR_ARRAY AzpPtrArray, IN PVOID Pointer ); PVOID AzpGetStringProperty( IN PAZP_STRING AzpString ); PVOID AzpGetUlongProperty( IN ULONG UlongValue ); BOOLEAN AzpTimeHasElapsed( IN PLARGE_INTEGER StartTime, IN DWORD Timeout ); BOOL AzDllInitialize(VOID); BOOL AzDllUnInitialize(VOID); DWORD AzpHresultToWinStatus( HRESULT hr ); DWORD AzpSafeArrayPointerFromVariant( IN VARIANT* Variant, IN BOOLEAN NullOk, OUT SAFEARRAY **retSafeArray ); DWORD AzpGetCurrentToken( OUT PHANDLE hToken ); DWORD AzpChangeSinglePrivilege( IN DWORD PrivilegeValue, IN HANDLE hToken, IN PTOKEN_PRIVILEGES NewPrivilegeState, OUT PTOKEN_PRIVILEGES OldPrivilegeState OPTIONAL ); DWORD AzpConvertAbsoluteSDToSelfRelative( IN PSECURITY_DESCRIPTOR pAbsoluteSd, OUT PSECURITY_DESCRIPTOR *ppSelfRelativeSd ); // // This routine sets our default common ldap binding options // DWORD AzpADSetDefaultLdapOptions ( IN OUT PLDAP pHandle, IN PCWSTR pDomainName OPTIONAL ); // // This routine convert JScript style array object to // safearrays that our functions use. // HRESULT AzpGetSafearrayFromArrayObject ( IN VARIANT varSAorObj, OUT SAFEARRAY** ppsaData ); // // This routine returns the sequence number for an application object // to check the validity of COM handles after the application has been // closed DWORD AzpRetrieveApplicationSequenceNumber( IN AZ_HANDLE AzHandle ); ///////////////////////////////////////////////////////////////////////////// // // Debugging Support // ///////////////////////////////////////////////////////////////////////////// #if DBG #define AZROLESDBG 1 #endif // DBG #ifdef AZROLESDBG #define AzPrint(_x_) AzpPrintRoutine _x_ VOID AzpPrintRoutine( IN DWORD DebugFlag, IN LPSTR FORMATSTRING, // PRINTF()-STYLE FORMAT STRING. ... // OTHER ARGUMENTS ARE POSSIBLE. ); VOID AzpDumpGuid( IN DWORD DebugFlag, IN GUID *Guid ); VOID AzpDumpGoRef( IN LPSTR Text, IN struct _GENERIC_OBJECT *GenericObject ); // // Values of DebugFlag // The values of this flag are organized into bytes: // The least significant byte are flags that one always wants on // The next byte are flags that provider a reasonable level of verbosity // The next byte are flags that correspond to levels from the 2nd byte but are more verbose // The most significant byte are flags that are generally very verbose // #define AZD_CRITICAL 0x00000001 // Debug most critical errors #define AZD_INVPARM 0x00000002 // Invalid Parameter #define AZD_PERSIST 0x00000100 // Persistence code #define AZD_ACCESS 0x00000200 // Debug access check #define AZD_SCRIPT 0x00000400 // Debug bizrule scripts #define AZD_DISPATCH 0x00000800 // Debug IDispatch interface code #define AZD_XML 0x00001000 // xml store #define AZD_AD 0x00002000 // Debug LDAP provider #define AZD_PERSIST_MORE 0x00010000 // Persistence code (verbose mode) #define AZD_ACCESS_MORE 0x00020000 // Debug access check (verbose mode) #define AZD_SCRIPT_MORE 0x00040000 // Debug bizrule scripts (verbose mode) #define AZD_HANDLE 0x01000000 // Debug handle open/close #define AZD_OBJLIST 0x02000000 // Object list linking #define AZD_REF 0x04000000 // Debug object ref count #define AZD_DOMREF 0x08000000 // Debug domain ref count #define AZD_ALL 0xFFFFFFFF // // The order below defines the order in which locks must be acquired. // Violating this order will result in asserts firing in debug builds. // // Do not change the order without first verifying thoroughly that the change is safe. // enum { SAFE_CLOSE_APPLICATION = 1, SAFE_CLIENT_CONTEXT, SAFE_PERSIST_LOCK, SAFE_GLOBAL_LOCK, SAFE_DOMAIN_LIST, SAFE_DOMAIN, SAFE_FREE_SCRIPT_LIST, SAFE_RUNNING_SCRIPT_LIST, SAFE_LOGFILE, SAFE_ALLOCATOR, SAFE_MAX_LOCK }; // // Globals // extern SAFE_CRITICAL_SECTION AzGlLogFileCritSect; extern ULONG AzGlDbFlag; #else // Non debug version #define AzPrint(_x_) #define AzpDumpGuid(_x_, _y_) #define AzpDumpGoRef(_x_, _y_) #endif #ifdef __cplusplus } #endif