OpenContext.c
上传用户:zhuzhu0204
上传日期:2020-07-13
资源大小:13165k
文件大小:1k
开发平台:

Visual C++

  1. //OpenContext.c
  2. #include "precomp.h"
  3. #pragma hdrstop
  4. #include "iocommon.h"
  5. // 申请和初始化一个POPEN_CONTEXT结构
  6. POPEN_CONTEXT DevAllocateOpenContext(PADAPT pAdapt)
  7. {
  8. POPEN_CONTEXT pOpenContext = NULL;
  9. // 为OPEN_CONTEXT结构申请内存空间
  10. NdisAllocateMemoryWithTag(&pOpenContext, sizeof(OPEN_CONTEXT), TAG);
  11. if(pOpenContext == NULL)
  12. {
  13. return NULL;
  14. }
  15. // 初始化这个内存空间
  16. NdisZeroMemory(pOpenContext, sizeof(OPEN_CONTEXT));
  17. NdisAllocateSpinLock(&pOpenContext->Lock);
  18. NdisInitializeEvent(&pOpenContext->RequestEvent);
  19. pOpenContext->RefCount = 1;
  20. pOpenContext->pAdapt = pAdapt;
  21. return pOpenContext;
  22. }
  23. // 增加对打开环境的引用
  24. VOID DevRefOpenContext(POPEN_CONTEXT pOpenContext) 
  25. {
  26. // 首先增加对适配器的引用,然后再增加OPEN_CONTEXT的引用计数
  27.    PtRefAdapter(pOpenContext->pAdapt);
  28.    NdisInterlockedIncrement(&pOpenContext->RefCount);
  29. }
  30. // 减少对打开环境的引用,如果减为0,则释放它占用的内存
  31. VOID DevDerefOpenContext(POPEN_CONTEXT pOpenContext) 
  32. {
  33.    PADAPT pAdapt = NULL;
  34.    if(pOpenContext == NULL)
  35.    return;
  36.    // 首先保存对应的适配器指针,以便后面对它调用PtDerefAdapter函数
  37.    pAdapt = pOpenContext->pAdapt;
  38.    // 减小引用计数,如果没有代码再引用它了,则清除资源
  39.    if(NdisInterlockedDecrement(&pOpenContext->RefCount) == 0)
  40.    {
  41.       NdisFreeSpinLock(&pOpenContext->Lock);
  42.       NdisFreeMemory(pOpenContext, 0, 0);
  43.    }
  44.    // 减少对适配器的引用
  45.    PtDerefAdapter(pAdapt);
  46. }