#define SD_CACHE_ENTRIES 0x100
OB_SD_CACHE_LIST ObsSecurityDescriptorCache[SD_CACHE_ENTRIES];
-ULONGLONG Cycles;
-ULONG TimeDelta;
-
-#define ObpSdCacheBeginPerfCount() \
- Cycles = __rdtsc();
-
-#define ObpSdCacheEndPerfCount() \
- TimeDelta += __rdtsc() - Cycles;
-
-
/* PRIVATE FUNCTIONS **********************************************************/
VOID
{
PSECURITY_DESCRIPTOR SecurityDescriptor;
PSECURITY_DESCRIPTOR_HEADER SdHeader;
- ObpSdCacheBeginPerfCount();
/* Get the SD */
SecurityDescriptor = ObjectHeader->SecurityDescriptor;
if (!SecurityDescriptor)
{
/* No SD, nothing to do */
- ObpSdCacheEndPerfCount();
return NULL;
}
/* Release the lock and return */
ObpReleaseObjectLock(ObjectHeader);
- ObpSdCacheEndPerfCount();
return SecurityDescriptor;
}
IN ULONG Count)
{
PSECURITY_DESCRIPTOR_HEADER SdHeader;
- ObpSdCacheBeginPerfCount();
/* Get the header */
SdHeader = ObpGetHeaderForSd(SecurityDescriptor);
/* Do the references */
InterlockedExchangeAdd((PLONG)&SdHeader->RefCount, Count);
- ObpSdCacheEndPerfCount();
}
/*++
LONG OldValue, NewValue;
ULONG Index;
POB_SD_CACHE_LIST CacheEntry;
- ObpSdCacheBeginPerfCount();
/* Get the header */
SdHeader = ObpGetHeaderForSd(SecurityDescriptor);
NewValue = InterlockedCompareExchange((PLONG)&SdHeader->RefCount,
OldValue - Count,
OldValue);
- if (NewValue == OldValue) ObpSdCacheEndPerfCount(); return;
+ if (NewValue == OldValue) return;
/* Try again */
OldValue = NewValue;
ObpSdReleaseLock(CacheEntry);
}
- ObpSdCacheEndPerfCount();
}
/*++
POB_SD_CACHE_LIST CacheEntry;
BOOLEAN Result;
PLIST_ENTRY NextEntry;
- ObpSdCacheBeginPerfCount();
/* Get the length */
Length = RtlLengthSecurityDescriptor(InputSecurityDescriptor);
/* Free anything that we may have had to create */
if (NewHeader) ExFreePool(NewHeader);
- ObpSdCacheEndPerfCount();
return STATUS_SUCCESS;
}
/* Return the SD*/
*OutputSecurityDescriptor = &NewHeader->SecurityDescriptor;
- ObpSdCacheEndPerfCount();
return STATUS_SUCCESS;
}