windows-nt/Source/XPSP1/NT/ds/security/inc/lrucache.h
2020-09-26 16:20:57 +08:00

229 lines
4.8 KiB
C

//+---------------------------------------------------------------------------
//
// 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