//+--------------------------------------------------------------------------- // // Microsoft Windows NT Security // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: lrucache.h // // Contents: LRU Cache API // // History: 16-Dec-97 kirtd Created // //---------------------------------------------------------------------------- #if !defined(__LRUCACHE_H__) #define __LRUCACHE_H__ #if defined(__cplusplus) extern "C" { #endif // // These API allow creation and manipulation of an LRU based cache area. The // identifier used for the cache area is a stream of bytes of which some set // of bytes are used for the hash index. In order to get optimal caching // the identifiers used should be unique and the bytes sufficiently random. // typedef HANDLE HLRUCACHE; typedef HANDLE HLRUENTRY; // // Configuration flags // #define LRU_CACHE_NO_SERIALIZE 0x00000001 #define LRU_CACHE_NO_COPY_IDENTIFIER 0x00000002 // // Entry removal and cache freeing flags // #define LRU_SUPPRESS_REMOVAL_NOTIFICATION 0x00000004 // // Entry touching flags // #define LRU_SUPPRESS_CLOCK_UPDATE 0x00000008 typedef VOID (WINAPI *LRU_DATA_FREE_FN) (LPVOID pvData); typedef DWORD (WINAPI *LRU_HASH_IDENTIFIER_FN) (PCRYPT_DATA_BLOB pIdentifier); typedef VOID (WINAPI *LRU_ON_REMOVAL_NOTIFY_FN) (LPVOID pvData, LPVOID pvRemovalContext); // // Configuration NOTE: If MaxEntries is zero then no LRU is applied to the // cache entries, i.e. the cache is not bounded. // typedef struct _LRU_CACHE_CONFIG { DWORD dwFlags; LRU_DATA_FREE_FN pfnFree; LRU_HASH_IDENTIFIER_FN pfnHash; LRU_ON_REMOVAL_NOTIFY_FN pfnOnRemoval; DWORD cBuckets; DWORD MaxEntries; } LRU_CACHE_CONFIG, *PLRU_CACHE_CONFIG; BOOL WINAPI I_CryptCreateLruCache ( IN PLRU_CACHE_CONFIG pConfig, OUT HLRUCACHE* phCache ); VOID WINAPI I_CryptFlushLruCache ( IN HLRUCACHE hCache, IN OPTIONAL DWORD dwFlags, IN OPTIONAL LPVOID pvRemovalContext ); VOID WINAPI I_CryptFreeLruCache ( IN HLRUCACHE hCache, IN OPTIONAL DWORD dwFlags, IN OPTIONAL LPVOID pvRemovalContext ); BOOL WINAPI I_CryptCreateLruEntry ( IN HLRUCACHE hCache, IN PCRYPT_DATA_BLOB pIdentifier, IN LPVOID pvData, OUT HLRUENTRY* phEntry ); PCRYPT_DATA_BLOB WINAPI I_CryptGetLruEntryIdentifier ( IN HLRUENTRY hEntry ); LPVOID WINAPI I_CryptGetLruEntryData ( IN HLRUENTRY hEntry ); VOID WINAPI I_CryptAddRefLruEntry ( IN HLRUENTRY hEntry ); VOID WINAPI I_CryptReleaseLruEntry ( IN HLRUENTRY hEntry ); VOID WINAPI I_CryptInsertLruEntry ( IN HLRUENTRY hEntry, IN OPTIONAL LPVOID pvLruRemovalContext ); VOID WINAPI I_CryptRemoveLruEntry ( IN HLRUENTRY hEntry, IN OPTIONAL DWORD dwFlags, IN OPTIONAL LPVOID pvRemovalContext ); VOID WINAPI I_CryptTouchLruEntry ( IN HLRUENTRY hEntry, IN OPTIONAL DWORD dwFlags ); // NOTE: The following find does NOT touch the cache entry HLRUENTRY WINAPI I_CryptFindLruEntry ( IN HLRUCACHE hCache, IN PCRYPT_DATA_BLOB pIdentifier ); // NOTE: The following find touches the cache entry LPVOID WINAPI I_CryptFindLruEntryData ( IN HLRUCACHE hCache, IN PCRYPT_DATA_BLOB pIdentifier, OUT HLRUENTRY* phEntry ); // // If you cache contains multiple entries with the same identifier, then // this function can be used to enumerate them after finding the first with // I_CryptFindLruEntry // // NOTE: hPrevEntry is released // // NOTE: This does NOT touch the cache entries // // NOTE: The only way to safely use this function is if the serialization // is done outside of the cache handle and you use the // LRU_CACHE_NO_SERIALIZE flag. If not, then you will get undefined // results if hPrevEntry is removed or inserted (after removal) in // between calls // HLRUENTRY WINAPI I_CryptEnumMatchingLruEntries ( IN HLRUENTRY hPrevEntry ); // // Temporary disabling of LRU behavior. When it is re-enabled then entries // are purged until the watermark is again met // VOID WINAPI I_CryptEnableLruOfEntries ( IN HLRUCACHE hCache, IN OPTIONAL LPVOID pvLruRemovalContext ); VOID WINAPI I_CryptDisableLruOfEntries ( IN HLRUCACHE hCache ); // // Walk all entries function // typedef BOOL (WINAPI *PFN_WALK_ENTRIES) ( IN LPVOID pvParameter, IN HLRUENTRY hEntry ); VOID WINAPI I_CryptWalkAllLruCacheEntries ( IN HLRUCACHE hCache, IN PFN_WALK_ENTRIES pfnWalk, IN LPVOID pvParameter ); #if defined(__cplusplus) } #endif #endif