229 lines
4.8 KiB
C
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
|
|
|