windows-nt/Source/XPSP1/NT/ds/security/csps/wfsccsp/cspcache.c
2020-09-26 16:20:57 +08:00

167 lines
3.3 KiB
C

// CSPCache.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include "cspcache.h"
#define CacheAlloc(cBytes) (HeapAlloc(GetProcessHeap(), 0, cBytes))
#define CacheFree(pv) (HeapFree(GetProcessHeap(), 0, pv))
int main(int argc, char* argv[])
{
LPSTR pszKey1 = "Key1";
LPSTR pszKey2 = "Key12";
LPSTR pszKey3 = "Key123";
LPSTR pszKey4 = "Key1234";
CACHE_HANDLE hCache = NULL;
LPSTR pszData = NULL;
if (CacheAddItem(&hCache, pszKey1, (PVOID) pszKey1, (PVOID *) &pszData))
exit(1);
if (CacheAddItem(&hCache, pszKey2, (PVOID) pszKey2, (PVOID *) &pszData))
exit(1);
if (CacheAddItem(&hCache, pszKey3, (PVOID) pszKey3, (PVOID *) &pszData))
exit(1);
if (CacheAddItem(&hCache, pszKey4, (PVOID) pszKey4, (PVOID *) &pszData))
exit(1);
pszData = (LPSTR) CacheGetItem(&hCache, "KeyNothing");
pszData = (LPSTR) CacheGetItem(&hCache, pszKey3);
pszData = NULL;
if (CacheAddItem(&hCache, pszKey3, pszKey4, (PVOID *) &pszData))
exit(1);
pszData = (LPSTR) CacheGetItem(&hCache, pszKey3);
pszData = (LPSTR) CacheDeleteItem(&hCache, pszKey2);
CacheDeleteCache(hCache);
return 0;
}
PVOID CacheGetItem(
IN CACHE_HANDLE *phCache,
IN LPSTR pszKey)
{
PCACHE_ITEM pCacheItem = NULL, pPrevItem = NULL;
if (NULL == *phCache)
return NULL;
pCacheItem = *phCache;
pPrevItem = *phCache;
while (NULL != pCacheItem && 0 != strcmp(pszKey, pCacheItem->rgszKey))
{
pPrevItem = pCacheItem;
pCacheItem = pCacheItem->pNext;
}
if (NULL == pCacheItem)
return NULL; // Item not found
// Move item to the front of the cache list
// if it isn't already.
if (pCacheItem != *phCache)
{
pPrevItem->pNext = pCacheItem->pNext;
pCacheItem->pNext = *phCache;
*phCache = pCacheItem;
}
return pCacheItem->pvData;
}
void CacheDeleteCache(
IN OUT CACHE_HANDLE hCache)
{
PCACHE_ITEM p1 = hCache;
PCACHE_ITEM p2 = NULL;
while (NULL != p1)
{
p2 = p1->pNext;
CacheFree(p1);
p1 = p2;
}
}
DWORD CacheAddItem(
IN OUT CACHE_HANDLE *phCache,
IN LPSTR pszKey,
IN PVOID pvData,
OUT PVOID *ppvOldData)
{
PCACHE_ITEM pCacheItem = *phCache;
PCACHE_ITEM pPrevItem = NULL;
*ppvOldData = NULL;
while (NULL != pCacheItem)
{
// Does item already exist?
if (0 == strcmp(pszKey, pCacheItem->rgszKey))
{
*ppvOldData = pCacheItem->pvData;
break;
}
else
{
pPrevItem = pCacheItem;
pCacheItem = pCacheItem->pNext;
}
}
if (NULL == pCacheItem)
{
// Add new items to end of cache list
if (NULL == (pCacheItem = (PCACHE_ITEM) CacheAlloc(sizeof(CACHE_ITEM))))
return ERROR_NOT_ENOUGH_MEMORY;
memset(pCacheItem, 0, sizeof(CACHE_ITEM));
if (NULL == *phCache)
*phCache = pCacheItem;
else
pPrevItem->pNext = pCacheItem;
}
strncpy(pCacheItem->rgszKey, pszKey, MAX_KEY_SIZE);
pCacheItem->pvData = pvData;
return 0;
}
PVOID CacheDeleteItem(
IN CACHE_HANDLE *phCache,
LPSTR pszKey)
{
PCACHE_ITEM pCacheItem = *phCache, pPrevItem = *phCache;
PVOID pvData = NULL;
while (NULL != pCacheItem && 0 != strcmp(pszKey, pCacheItem->rgszKey))
{
pPrevItem = pCacheItem;
pCacheItem = pCacheItem->pNext;
}
if (NULL == pCacheItem)
return NULL; // Specified key not found
pPrevItem->pNext = pCacheItem->pNext;
pvData = pCacheItem->pvData;
CacheFree(pCacheItem);
return pvData;
}