Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

136 lines
3.1 KiB

// Copyright (C) 2000, Microsoft Corporation
//
// File: shashiter.c
//
// Contents: Generic hashtable iterator
// Classes:
//
// History: April. 9 2001, Author: Rohanp
//
//-----------------------------------------------------------------------------
#ifdef KERNEL_MODE
#include <ntos.h>
#include <string.h>
#include <fsrtl.h>
#include <zwapi.h>
#include <windef.h>
#else
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif
#include <windows.h>
#include <shash.h>
PSHASH_HEADER
SHashNextEnumerate(
IN PSHASH_ITERATOR pIterator,
IN PSHASH_TABLE pTable)
{
DWORD dwHashVar = 0;
NTSTATUS Status = STATUS_SUCCESS;
void * pData = NULL;
LIST_ENTRY * ple = NULL;
LIST_ENTRY * pListHead = NULL;
PSHASH_HEADER pEntry = NULL;
PSHASH_HEADER pOldEntry = NULL;
BOOLEAN LockAquired = TRUE;
BOOLEAN Found = FALSE;
LockAquired = pTable->ReadLockFunc(pTable);
if(!LockAquired)
{
// dfsdev: why are we not returning status??
Status = STATUS_LOCK_NOT_GRANTED;
return NULL;
}
pOldEntry = pIterator->pEntry;
ple = pIterator->ple->Flink;
for (dwHashVar = pIterator->index; (dwHashVar < pTable->NumBuckets) && (!Found); dwHashVar++)
{
pListHead = &pTable->HashBuckets[dwHashVar].ListHead;
ple = (dwHashVar == pIterator->index) ? pIterator->ple->Flink : pListHead->Flink;
while (ple != pListHead)
{
pEntry = CONTAINING_RECORD(ple, SHASH_HEADER, ListEntry);
if((pEntry->Flags & SHASH_FLAG_DELETE_PENDING) == 0)
{
InterlockedIncrement(&pEntry->RefCount);
pIterator->index = dwHashVar;
pIterator->ple = ple;
pIterator->pEntry = pEntry;
pIterator->pListHead = pListHead;
Found = TRUE;
break;
}
pEntry = NULL;
ple = ple->Flink;
}
}
pTable->ReleaseReadLockFunc(pTable);
if(pOldEntry)
{
Status = SHashReleaseReference( pTable, pOldEntry);
}
if(pEntry == NULL)
{
pIterator->index = 0;
pIterator->ple = NULL;
pIterator->pListHead = NULL;
pIterator->pEntry = NULL;
}
return pEntry;
}
PSHASH_HEADER
SHashStartEnumerate(
IN PSHASH_ITERATOR pIterator,
IN PSHASH_TABLE pTable
)
{
PSHASH_HEADER pEntry = NULL;
pIterator->index = 0;
pIterator->pListHead = &pTable->HashBuckets[0].ListHead;
pIterator->ple = pIterator->pListHead;
pIterator->pEntry = NULL;
pEntry = SHashNextEnumerate( pIterator, pTable);
return pEntry;
}
VOID
SHashFinishEnumerate(
IN PSHASH_ITERATOR pIterator,
IN PSHASH_TABLE pTable
)
{
NTSTATUS Status = STATUS_SUCCESS;
if(pIterator->pEntry)
{
Status = SHashReleaseReference( pTable, pIterator->pEntry);
}
return;
}