www.pudn.com > PPPOE.rar > workitem.cpp


 
//******************************************************************** 
//	ÈÕÆÚ:	2004/08/24 - 24:8:2004   20:05 
//	Ãûǰ:	tiamo 
//	ÃèÊö:	work item 
//********************************************************************* 
 
#include "Stdafx.h" 
 
NPAGED_LOOKASIDE_LIST g_lookasideWorkItem; 
 
#pragma alloc_text(PAGE,CommonWorkItemRoutine) 
 
#pragma alloc_text("WORK",InitializeWorkItemSystem) 
#pragma alloc_text("WORK",ShutdownWorkItemSystem) 
#pragma alloc_text("WORK",AllocateWorkItem) 
#pragma alloc_text("WORK",ScheduleWorkItem) 
 
// init work item system 
VOID InitializeWorkItemSystem() 
{ 
	NdisInitializeNPagedLookasideList(&g_lookasideWorkItem,0,0,0,sizeof(WORK_ITEM),WORK_ITEM_SIG,0); 
} 
 
// shut down 
VOID ShutdownWorkItemSystem() 
{ 
	NdisDeleteNPagedLookasideList(&g_lookasideWorkItem); 
} 
 
// alloca work item 
PWORK_ITEM AllocateWorkItem(WORK_ITEM_ROUTINE pRoutine,WORK_ITEM_DESTRUCTOR pDestructor) 
{ 
	ASSERT(pRoutine); 
 
	PWORK_ITEM pItem = static_cast(NdisAllocateFromNPagedLookasideList(&g_lookasideWorkItem)); 
	if(pItem) 
	{ 
		pItem->m_pDestructor = pDestructor; 
		pItem->m_pRoutine = pRoutine; 
		pItem->m_ulSig = WORK_ITEM_SIG; 
 
		NdisZeroMemory(&pItem->m_param,sizeof(WORK_ITEM_PARAM)); 
		pItem->m_param.m_ulSig = WORK_ITEM_PARAM_SIG; 
 
		NdisInitializeWorkItem(&pItem->m_ndisWorkItem,CommonWorkItemRoutine,pItem); 
	} 
 
	return pItem; 
} 
 
// schedule work item 
VOID ScheduleWorkItem(PWORK_ITEM pItem) 
{ 
	ASSERT(pItem && pItem->m_pRoutine && pItem->m_ulSig == WORK_ITEM_SIG && pItem->m_param.m_ulSig == WORK_ITEM_PARAM_SIG); 
 
	NdisScheduleWorkItem(&pItem->m_ndisWorkItem); 
} 
 
// common routine 
VOID CommonWorkItemRoutine(PNDIS_WORK_ITEM pNdisWorkItem,PVOID pContext) 
{ 
	PAGED_CODE(); 
 
	ASSERT(pContext); 
 
	ASSERT(PASSIVE_LEVEL == KeGetCurrentIrql()); 
 
	PWORK_ITEM pWorkItem = static_cast(pContext); 
 
	ASSERT(pWorkItem->m_pRoutine && pWorkItem->m_ulSig == WORK_ITEM_SIG && pWorkItem->m_param.m_ulSig == WORK_ITEM_PARAM_SIG); 
 
	pWorkItem->m_pRoutine(pWorkItem,&pWorkItem->m_param); 
	 
	if(pWorkItem->m_pDestructor) 
		pWorkItem->m_pDestructor(pWorkItem,&pWorkItem->m_param); 
 
	NdisFreeToNPagedLookasideList(&g_lookasideWorkItem,pWorkItem); 
}