www.pudn.com > FsTPM0.rar > List.cpp


#include "FsTPM.h" 
 
BOOL ProtectList_Is_In(PTLIST pList, WCHAR* WideSource, PFILE_PROTECT_LIST_ITEM *ppItem) 
{ 
 
	ULONG i; 
	ExAcquireFastMutex(	&pList->mutex ); 
	 
	for (i=0; i< pList->Count; i++) 
	{ 
		if ( wcscmp(WideSource, pList->head[i]->ProtectedFileName)==0 ) 
		{ 
			*ppItem = pList->head[i]; 
			ExReleaseFastMutex(  &(pList->mutex) ); 
			 
			return  TRUE; 
		} 
	} 
 
	ExReleaseFastMutex(  &(pList->mutex) ); 
 
	*ppItem=NULL; 
 
	return FALSE; 
} 
 
 
NTSTATUS CreateList( IN PTLIST pList,IN ULONG MaxNum )  
{ 
	pList->head = NULL;  
	NTSTATUS RC = STATUS_SUCCESS; 
	__try{ 
		 
		pList->head = (PFILE_PROTECT_LIST_ITEM*)  ExAllocatePoolWithTag(  
																		NonPagedPool,  
																		sizeof(PFILE_PROTECT_LIST_ITEM)*MaxNum,  
																		TAGS 
																		); 
 
		RtlZeroMemory(pList->head,sizeof(PFILE_PROTECT_LIST_ITEM)*MaxNum ); 
		 
		if (pList->head==NULL) 
			return STATUS_INSUFFICIENT_RESOURCES; 
 
		ExInitializeFastMutex( &(pList->mutex) ); 
 
		pList->MaxNum = MaxNum; 
	} 
	__except ( EXCEPTION_EXECUTE_HANDLER ) 
	{ 
		RC = GetExceptionCode(); 
 
		FsTPM_DbgPrint(( " Exception encountered with value = 0x%x ",RC  )); 
 
		if ( pList->head!=NULL ) 
			ExFreePool( pList->head ); 
		 
		pList->head = NULL; 
 
		pList->MaxNum = 0; 
	} 
	 
	return RC; 
} 
 
VOID ReleaseList( PTLIST pList ) 
{ 
	if ( pList->head!=NULL ) 
		ExFreePool( pList->head ); 
	 
	pList->head = NULL; 
 
	pList->MaxNum = 0; 
 
} 
 
NTSTATUS ListInsert( PTLIST pList, PFILE_PROTECT_LIST_ITEM pItem ) 
{ 
	//if( ProtectList_Is_In(pList, pItem->ProtectedFileName, &pItem) )  
	//	return STATUS_UNSUCCESSFUL; 
 
	ExAcquireFastMutex(	&pList->mutex ); 
 
	if ( pList->MaxNum > pList->Count+1 ) 
	{ 
		pList->head[ pList->Count ] = pItem; 
		pList->Count++; 
	} 
 
	ExReleaseFastMutex(  &(pList->mutex) ); 
 
	return STATUS_SUCCESS; 
} 
 
NTSTATUS ListPickOutItem( IN PTLIST pList, IN WCHAR *wstr,OUT PFILE_PROTECT_LIST_ITEM *ppItem) 
{ 
	ULONG i,j; 
 
	*ppItem=NULL; 
 
	ExAcquireFastMutex(	&pList->mutex ); 
	 
	if (pList->Count==0) 
	{ 
		ExReleaseFastMutex(  &(pList->mutex) );		 
		return STATUS_SUCCESS; 
	} 
	 
	for (i=0; i< pList->Count; i++) 
	{ 
		if ( wcscmp(wstr, pList->head[i]->ProtectedFileName)==0 ) 
		{ 
			*ppItem = pList->head[i]; 
			for (j=i; jCount; j++) 
			{ 
				pList->head[j] = pList->head[j+1]; 
			} 
 
			pList->Count--; 
			pList->head[pList->Count] = NULL; 
 
			ExReleaseFastMutex(  &(pList->mutex) );		 
			 
			return  STATUS_SUCCESS; 
		} 
	} 
 
	ExReleaseFastMutex(  &(pList->mutex) ); 
	 
	return STATUS_UNSUCCESSFUL; 
} 
 
NTSTATUS ListDelete( IN PTLIST pList, IN WCHAR *wstr) 
{ 
	NTSTATUS ret; 
 
	PFILE_PROTECT_LIST_ITEM pItem; 
 
	ret = ListPickOutItem( pList,wstr, &pItem); 
	 
	if (pItem != NULL) 
		ExFreePool(pItem); 
	 
	return ret; 
}