4764|9

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

NdisFOidRequest发送OID请求 [复制链接]

我想从FIlter发送一个OID到miniport.可是总是出现蓝屏事件。烦请帮我看看:
  1. NDIS_STATUS
  2. filterCreateNewMACRequest(
  3.     IN NDIS_HANDLE                  FilterModuleContext,
  4.     IN NDIS_OID                     Oid
  5.    )
  6.   /* Routine Description:
  7.       Send OID to underlying driver to create a new MAC
  8. Arguments:
  9.      FilterModuleContext - pointer to filter module context
  10.      Oid    -- OID_DOT11_CREATE_MAC
  11.     */
  12.    {
  13. PMS_FILTER                      pFilter =(PMS_FILTER)FilterModuleContext;
  14. NDIS_STATUS                     Status = NDIS_STATUS_SUCCESS;
  15. DOT11_MAC_INFO                InformationBuffer;
  16. ULONG                           MethodId = 0;
  17. ULONG                           BytesProcessed;
  18. DEBUGP(DL_TEST,("==>FilterCreateNEwMACRequest!\n"));

  19. Status = filterDoInternalRequest(pFilter,
  20.                                   NdisRequestMethod,
  21.           Oid,
  22.           (PVOID)&InformationBuffer,
  23.           sizeof(DOT11_MAC_INFO),
  24.           sizeof(DOT11_MAC_INFO),
  25.           MethodId,
  26.           &BytesProcessed);
  27. if(Status == NDIS_STATUS_SUCCESS)
  28.     {
  29.      DEBUGP(DL_TEST,("Create new mac successfully, and the length is %u!\n",InformationBufferLength));
  30.   goto Exit;
  31.     }else
  32. {
  33. DEBUGP(DL_TEST,("Fail to create new MAC!\n"));
  34. goto Exit;
  35. }
  36. Exit:  
  37.     return Status;
  38.    }

复制代码

filterDoInternalRequest的函数体为:
  1. NDIS_STATUS
  2. filterDoInternalRequest(
  3.     IN PMS_FILTER                   FilterModuleContext,
  4.     IN NDIS_REQUEST_TYPE            RequestType,
  5.     IN NDIS_OID                     Oid,
  6.     IN PVOID                        InformationBuffer,
  7.     IN ULONG                        InformationBufferLength,
  8.     IN ULONG                        OutputBufferLength, OPTIONAL
  9.     IN ULONG                        MethodId, OPTIONAL
  10.     OUT PULONG                      pBytesProcessed
  11.     )

  12. {
  13.     FILTER_REQUEST              FilterRequest;
  14.     PNDIS_OID_REQUEST           NdisRequest = &FilterRequest.Request;
  15.     NDIS_STATUS                 Status = NDIS_STATUS_SUCCESS;
  16.     DEBUGP(DL_TEST,("==>filterDoInternalRequest\n"))
  17.     NdisZeroMemory(NdisRequest, sizeof(NDIS_OID_REQUEST));
  18.     NdisInitializeEvent(&FilterRequest.ReqEvent);
  19.    
  20.     NdisRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
  21.     NdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1;
  22.     NdisRequest->Header.Size = sizeof(NDIS_OID_REQUEST);
  23.     NdisRequest->RequestType = RequestType;
  24.     switch (RequestType)
  25.     {
  26.         case NdisRequestQueryInformation:
  27.              NdisRequest->DATA.QUERY_INFORMATION.Oid = Oid;
  28.              NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer =
  29.                                     InformationBuffer;
  30.              NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength =
  31.                                     InformationBufferLength;
  32.             break;
  33.         case NdisRequestSetInformation:
  34.              NdisRequest->DATA.SET_INFORMATION.Oid = Oid;
  35.              NdisRequest->DATA.SET_INFORMATION.InformationBuffer =
  36.                                     InformationBuffer;
  37.              NdisRequest->DATA.SET_INFORMATION.InformationBufferLength =
  38.                                     InformationBufferLength;
  39.             break;
  40.         case NdisRequestMethod:
  41.              NdisRequest->DATA.METHOD_INFORMATION.Oid = Oid;
  42.              NdisRequest->DATA.METHOD_INFORMATION.MethodId = MethodId;
  43.              NdisRequest->DATA.METHOD_INFORMATION.InformationBuffer =
  44.                                     InformationBuffer;
  45.              NdisRequest->DATA.METHOD_INFORMATION.InputBufferLength =
  46.                                     InformationBufferLength;
  47.              NdisRequest->DATA.METHOD_INFORMATION.OutputBufferLength = OutputBufferLength;
  48.              break;
  49.             
  50.                
  51.         default:
  52.             FILTER_ASSERT(FALSE);
  53.             break;
  54.     }
  55.    /  NdisRequest->RequestId = (PVOID)FILTER_REQUEST_ID;
  56.    
  57.     Status = NdisFOidRequest(FilterModuleContext->FilterHandle,
  58.                             NdisRequest);
  59.    
  60.     if (Status == NDIS_STATUS_PENDING)
  61.     {
  62.         
  63.         NdisWaitEvent(&FilterRequest.ReqEvent, 0);
  64.         Status = FilterRequest.Status;
  65.     }

  66.     if (Status == NDIS_STATUS_SUCCESS)
  67.     {
  68.         if (RequestType == NdisRequestSetInformation)
  69.         {
  70.             *pBytesProcessed = NdisRequest->DATA.SET_INFORMATION.BytesRead;
  71.         }
  72.         if (RequestType == NdisRequestQueryInformation)
  73.         {
  74.             *pBytesProcessed = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten;
  75.         }
  76.         if (RequestType == NdisRequestMethod)
  77.         {
  78.             *pBytesProcessed = NdisRequest->DATA.METHOD_INFORMATION.BytesWritten;
  79.         }
  80.         
  81.         //
  82.         // The driver below should set the correct value to BytesWritten
  83.         // or BytesRead. But now, we just truncate the value to InformationBufferLength
  84.         //
  85.         if (RequestType == NdisRequestMethod)
  86.         {
  87.             if (*pBytesProcessed > OutputBufferLength)
  88.             {
  89.                 *pBytesProcessed = OutputBufferLength;
  90.             }
  91.         }
  92.         else
  93.         {
  94.             
  95.             if (*pBytesProcessed > InformationBufferLength)
  96.             {
  97.                 *pBytesProcessed = InformationBufferLength;
  98.             }
  99.         }
  100.     }

  101.     return (Status);
  102. }

复制代码

在函数filterDoInternalRequest中,每次执行到NdisFOidRequest()就出现蓝屏了。不知道哪里不对?

最新回复

if (Status == NDIS_STATUS_PENDING)     {                  NdisWaitEvent(&FilterRequest.ReqEvent, 0);         Status = FilterRequest.Status;     } 复制代码 试用windbg检查一下这一段  详情 回复 发表于 2009-12-10 16:19
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
查看发送的数据是否为空,是否未给使用的地址分配空间,这种情况是最大多数。
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 fpcc 的回复:
查看发送的数据是否为空,是否未给使用的地址分配空间,这种情况是最大多数。

同意,帮顶
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
我现在知道哪里的问题了。
  1. Status = NdisFOidRequest(FilterModuleContext->FilterHandle,
  2.                             NdisRequest);
  3.    
  4.     if (Status == NDIS_STATUS_PENDING)
  5.     {
  6.         
  7.         NdisWaitEvent(&FilterRequest.ReqEvent, 0);//这里的问题
  8.         Status = FilterRequest.Status;
  9.     }
复制代码

返回NDIS_STATUS_PENDING之后,执行下面的语句就出错了,按理说应该是调用NdsiFOidRequestComplete的。这里怎么调用NdisWaitEvent呢
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

5
 
使用windbg跟踪一下,看一下FilterModuleContext->FilterHandle的值是多少.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 iprotocolsec 的回复:
使用windbg跟踪一下,看一下FilterModuleContext->FilterHandle的值是多少.

我发现我用%p 打印这个FilterModuleContext->FilterHandle, 直接蓝屏了。请问该如何啊
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(高级)

7
 
引用 4 楼 yexin218 的回复:
引用 3 楼 iprotocolsec 的回复:
使用windbg跟踪一下,看一下FilterModuleContext->FilterHandle的值是多少.

我发现我用%p 打印这个FilterModuleContext->FilterHandle, 直接蓝屏了。请问该如何啊
不好意思,我弄错了。
那个打印出来的值为:FilterModululeContext->FilterHandle is8E332A68
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
有谁知道是什么原因吗
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

9
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
  1. if (Status == NDIS_STATUS_PENDING)
  2.     {
  3.         
  4.         NdisWaitEvent(&FilterRequest.ReqEvent, 0);
  5.         Status = FilterRequest.Status;
  6.     }
复制代码

试用windbg检查一下这一段
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表