189 lines
2.9 KiB
C
189 lines
2.9 KiB
C
#ifndef _UTIL_H_
|
|
#define _UTIL_H_
|
|
|
|
typedef enum
|
|
_WORKSTATE
|
|
{
|
|
WS_NotScheduled = 0,
|
|
WS_Scheduled,
|
|
WS_Executing,
|
|
WS_Executed
|
|
}
|
|
WORKSTATE;
|
|
|
|
typedef
|
|
VOID
|
|
(*WORKITEM_EXEC_ROUTINE)(
|
|
IN PVOID Args[4],
|
|
UINT workType
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(*WORKITEM_FREE_ROUTINE)(
|
|
IN PVOID Args[4],
|
|
IN UINT workType
|
|
);
|
|
|
|
typedef struct
|
|
_WORKITEM
|
|
{
|
|
//
|
|
// Indicates the state of the work item
|
|
//
|
|
WORKSTATE workState;
|
|
|
|
//
|
|
// Indicates the type of work to be done
|
|
//
|
|
UINT workType;
|
|
|
|
//
|
|
// Points to the lookaside list the item was allocated from
|
|
//
|
|
PNPAGED_LOOKASIDE_LIST pLookaside;
|
|
|
|
//
|
|
// Context to be passed to scheduled item
|
|
//
|
|
PVOID Args[4];
|
|
|
|
//
|
|
// Routine to be called to execute the work item
|
|
//
|
|
WORKITEM_EXEC_ROUTINE pExecRoutine;
|
|
|
|
//
|
|
// Routine to be called to free the context for the work item
|
|
//
|
|
WORKITEM_FREE_ROUTINE pFreeRoutine;
|
|
|
|
//
|
|
// Associated NdisWorkItem
|
|
//
|
|
NDIS_WORK_ITEM ndisWorkItem;
|
|
|
|
}
|
|
WORKITEM;
|
|
|
|
VOID InitializeWorkItemLookasideList(
|
|
IN PNPAGED_LOOKASIDE_LIST pLookaside,
|
|
IN ULONG tagLookaside
|
|
);
|
|
|
|
WORKITEM* AllocWorkItem(
|
|
IN PNPAGED_LOOKASIDE_LIST pLookaside,
|
|
IN WORKITEM_EXEC_ROUTINE pExecRoutine,
|
|
IN WORKITEM_FREE_ROUTINE pFreeRoutine,
|
|
IN PVOID Args[4],
|
|
IN UINT workType
|
|
);
|
|
|
|
VOID ScheduleWorkItem(
|
|
IN WORKITEM *pWorkItem
|
|
);
|
|
|
|
VOID FreeWorkItem(
|
|
IN WORKITEM *pWorkItem
|
|
);
|
|
|
|
VOID WorkItemExec(
|
|
IN NDIS_WORK_ITEM* pNdisWorkItem,
|
|
IN PVOID pvContext
|
|
);
|
|
|
|
|
|
typedef struct
|
|
_HANDLE_CB
|
|
{
|
|
//
|
|
// Indicates that the entry contains a valid context pointer
|
|
//
|
|
BOOLEAN fActive;
|
|
|
|
//
|
|
// Pointer to the context saved in this entry
|
|
//
|
|
PVOID pContext;
|
|
|
|
//
|
|
// Handle value to access this particular entry
|
|
//
|
|
NDIS_HANDLE Handle;
|
|
}
|
|
HANDLE_CB;
|
|
|
|
typedef struct
|
|
_HANDLE_TABLE_CB
|
|
{
|
|
//
|
|
// Points to the table that holds the Handle control blocks.
|
|
//
|
|
HANDLE_CB* HandleTable;
|
|
|
|
//
|
|
// Size of the handle table
|
|
//
|
|
UINT nTableSize;
|
|
|
|
//
|
|
// Shows the number of active handles
|
|
//
|
|
UINT nActiveHandles;
|
|
|
|
//
|
|
// Keeps the unique part of the handle.
|
|
// This is incremented everytime a handle is generated and a context is inserted
|
|
// into the handle table.
|
|
//
|
|
USHORT usKeys;
|
|
}
|
|
HANDLE_TABLE_CB, *PHANDLE_TABLE_CB, *HANDLE_TABLE;
|
|
|
|
#define NO_PREFERED_INDEX (USHORT) -1
|
|
|
|
HANDLE_TABLE InitializeHandleTable(
|
|
IN UINT nHandleTableSize
|
|
);
|
|
|
|
VOID FreeHandleTable(
|
|
IN OUT HANDLE_TABLE Table
|
|
);
|
|
|
|
NDIS_HANDLE InsertToHandleTable(
|
|
IN HANDLE_TABLE Table,
|
|
IN USHORT usPreferedIndex,
|
|
IN PVOID pContext
|
|
);
|
|
|
|
PVOID RetrieveFromHandleTable(
|
|
IN HANDLE_TABLE Table,
|
|
IN NDIS_HANDLE Handle
|
|
);
|
|
|
|
USHORT RetrieveIndexFromHandle(
|
|
IN NDIS_HANDLE Handle
|
|
);
|
|
|
|
PVOID RetrieveFromHandleTableByIndex(
|
|
IN HANDLE_TABLE Table,
|
|
IN USHORT usIndex
|
|
);
|
|
|
|
PVOID RetrieveFromHandleTableBySessionId(
|
|
IN HANDLE_TABLE Table,
|
|
IN USHORT usSessionId
|
|
);
|
|
|
|
VOID RemoveFromHandleTable(
|
|
IN HANDLE_TABLE Table,
|
|
IN NDIS_HANDLE Handle
|
|
);
|
|
|
|
USHORT RetrieveSessionIdFromHandle(
|
|
IN NDIS_HANDLE Handle
|
|
);
|
|
|
|
|
|
#endif
|