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);
}