OpenContext.c
上传用户:zhuzhu0204
上传日期:2020-07-13
资源大小:13165k
文件大小:1k
- //OpenContext.c
- #include "precomp.h"
- #pragma hdrstop
- #include "iocommon.h"
- // 申请和初始化一个POPEN_CONTEXT结构
- POPEN_CONTEXT DevAllocateOpenContext(PADAPT pAdapt)
- {
- POPEN_CONTEXT pOpenContext = NULL;
- // 为OPEN_CONTEXT结构申请内存空间
- NdisAllocateMemoryWithTag(&pOpenContext, sizeof(OPEN_CONTEXT), TAG);
- if(pOpenContext == NULL)
- {
- return NULL;
- }
- // 初始化这个内存空间
- NdisZeroMemory(pOpenContext, sizeof(OPEN_CONTEXT));
- NdisAllocateSpinLock(&pOpenContext->Lock);
- NdisInitializeEvent(&pOpenContext->RequestEvent);
- pOpenContext->RefCount = 1;
- pOpenContext->pAdapt = pAdapt;
- return pOpenContext;
- }
- // 增加对打开环境的引用
- VOID DevRefOpenContext(POPEN_CONTEXT pOpenContext)
- {
- // 首先增加对适配器的引用,然后再增加OPEN_CONTEXT的引用计数
- PtRefAdapter(pOpenContext->pAdapt);
- NdisInterlockedIncrement(&pOpenContext->RefCount);
- }
- // 减少对打开环境的引用,如果减为0,则释放它占用的内存
- VOID DevDerefOpenContext(POPEN_CONTEXT pOpenContext)
- {
- PADAPT pAdapt = NULL;
- if(pOpenContext == NULL)
- return;
- // 首先保存对应的适配器指针,以便后面对它调用PtDerefAdapter函数
- pAdapt = pOpenContext->pAdapt;
- // 减小引用计数,如果没有代码再引用它了,则清除资源
- if(NdisInterlockedDecrement(&pOpenContext->RefCount) == 0)
- {
- NdisFreeSpinLock(&pOpenContext->Lock);
- NdisFreeMemory(pOpenContext, 0, 0);
- }
- // 减少对适配器的引用
- PtDerefAdapter(pAdapt);
- }