zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1636回复:6

一个关于Timer的弱问题

楼主#
更多 发布于:2003-04-24 12:11
我想做收到特定包之后,等待一段时间然后发出一个包这个工作,收发我都做好了,现在就是要设置timer了,看了一会DDK,没搞出所以然来,旧帖子也比较少有关timer的,所以提问,各位大侠多多指点!!!^_^

是不是调用NdisInitializeTimer,然后自己写一个timerfunction(),在timerfunction里面发包就可以完成我得功能了?如果是的话,NdisInitializeTimer的FunctionContext参数怎么写那?timerfunction的那几个参数:
 VOID
    (*PNDIS_TIMER_FUNCTION)(
      IN PVOID  SystemSpecific1,
      IN PVOID  FunctionContext,
      IN PVOID  SystemSpecific2,
      IN PVOID  SystemSpecific3
      );
又怎么定义那?还有我发包要拿到pAdapt吧,怎么拿呢?

多谢!!!

最新喜欢:

muy2004muy200...
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-24 13:17
在中间层里边应该使用NdisMInitializeTimer(),不能使用NdisInitializeTimer()。

下面是一些代码示例,希望对你有帮助:

NdisInitializeListHead(&pAdapt->SendPacketListHead);
NdisInitializeListHead(&pAdapt->RecvPacketListHead);

NdisMInitializeTimer(&pAdapt->PacketProcessTimer,
           MiniportAdapterHandle,
           (PNDIS_TIMER_FUNCTION)PacketProcessTimerCallback,
           pAdapt // 在回调例程中需要访问这个结构
           );
NdisMSetPeriodicTimer(&pAdapt->PacketProcessTimer,10); // 每隔10毫秒查询发送和接收列表。

//
// 发送和指示包定时处理函数
//
VOID PacketProcessTimerCallback(
  IN PVOID  SystemSpecific1,
  IN PVOID  FunctionContext,
  IN PVOID  SystemSpecific2,
  IN PVOID  SystemSpecific3
  )
{
  PADAPT      pAdapt = (PADAPT)FunctionContext;
  LIST_ENTRY *pSendListHeadEntry;
  LIST_ENTRY *pRecvListHeadEntry;

  //
  // 处理待发送包
  //
  pSendListHeadEntry = NdisInterlockedRemoveHeadList(&pAdapt->SendPacketListHead,&GlobalLock);
  if(pSendListHeadEntry != NULL)
  {
  #ifdef _DEBUG
    DbgPrint(\"==> Passthru Send Packet from PacketProcessTimerCallback(),Send Now...\\n\");
  #endif

    NDIS_STATUS        Status;
    SEND_PACKET_ENTRY *pSendPacketEntry;

    /////

    pSendPacketEntry = CONTAINING_RECORD(pSendListHeadEntry,SEND_PACKET_ENTRY,NextEntry);

    NdisSend(&Status,
         pAdapt->BindingHandle,
         pSendPacketEntry->MyPacket
         );

        NdisFreeMemory(pSendPacketEntry,sizeof(SEND_PACKET_ENTRY),0);

        .........
  }
    ............
}                
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-25 15:59
多谢slwqw老兄,我有这么几个问题:
1。您的第一段代码是不是在MPInitialize函数里面实现的?
2。pAdapt->PacketProcessTimer这个结构应该是您自己在passthru.h里面定义的吧,定义成timer类型?
3。只要NdisMSetPeriodicTimer设定好的话,PacketProcessTimerCallback是自动调用的?我们就不用管了是吧,还有NdisMSetPeriodicTimer是可以在任何地方调用对吧

另外有一个问题想要请教,就是看您的代码是发送接收都做成了list,我的工作刚好也有这一块,我现在还不会进行list的初始化,使用之类的,希望可以向您请教,当然分数我会增加的^_^

比如list元素的增,删的过程中一定要使用自旋锁?这里的list和我们常用的链表有什么结构上的区别么?还有list的初始化如何完成?

希望可以得到您的指点,您能再给点代码或者给讲解一下么?多谢了^_^,您也可以直接发到我的邮箱yangfanzuozi99@mails.tsinghua.edu.cn

[编辑 -  4/25/03 by  zuozi]
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-25 20:58
多谢slwqw老兄,我有这么几个问题:
1。您的第一段代码是不是在MPInitialize函数里面实现的?
2。pAdapt->PacketProcessTimer这个结构应该是您自己在passthru.h里面定义的吧,定义成timer类型?
3。只要NdisMSetPeriodicTimer设定好的话,PacketProcessTimerCallback是自动调用的?我们就不用管了是吧,还有NdisMSetPeriodicTimer是可以在任何地方调用对吧

另外有一个问题想要请教,就是看您的代码是发送接收都做成了list,我的工作刚好也有这一块,我现在还不会进行list的初始化,使用之类的,希望可以向您请教,当然分数我会增加的^_^

比如list元素的增,删的过程中一定要使用自旋锁?这里的list和我们常用的链表有什么结构上的区别么?还有list的初始化如何完成?

希望可以得到您的指点,您能再给点代码或者给讲解一下么?多谢了^_^,您也可以直接发到我的邮箱yangfanzuozi99@mails.tsinghua.edu.cn

[编辑 -  4/25/03 by  zuozi]


1、是的。
2、当然要自己定义,

typedef struct _ADAPT
{
.......
#ifdef QUEUE_SEND_RECV_PACKET

  LIST_ENTRY              SendPacketListHead;
  LIST_ENTRY              RecvPacketListHead;
  NDIS_MINIPORT_TIMER     PacketProcessTimer;

#endif
.........
}

3、当然是自动调用,否则还叫什么“定时器”?我是紧接着NdisMInitializeTimer()调用的,任何地方没有试过,不清楚。

4、上面不是已经贴出了list的初始化代码了吗?

5、list的使用总共就增加和删除两样操作而已,使用函数NdisInterlockedInsertTailList()和NdisInterlockedRemoveHeadList()就可以了。

6、自旋锁是必须的。至于具体原因,我的语文水平有限,无法给你解释。


建议你看《Programming Windows Driver Model》这本书,里边有list的详细使用说明和自旋锁的详细解释。本站有这本书的中文版和英文版,可以免费下载。



[编辑 -  4/25/03 by  slwqw]
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-26 11:31
多谢多谢,不过又有两个问题了,不好意思^_^

1。您说的那本书的英文版我找到了,中文版叫什么名字呀,怎么好像没有见到,自己e文太差,估计看起来比较悬,呵呵

2。从您说list只有两个函数来看,ndis里面的list应该是一个FIFO的结构了?那么有没有那种类似于链表一样可以在中间添加删除的结构?多谢!呵呵
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-26 13:16
多谢多谢,不过又有两个问题了,不好意思^_^

1。您说的那本书的英文版我找到了,中文版叫什么名字呀,怎么好像没有见到,自己e文太差,估计看起来比较悬,呵呵

2。从您说list只有两个函数来看,ndis里面的list应该是一个FIFO的结构了?那么有没有那种类似于链表一样可以在中间添加删除的结构?多谢!呵呵


1、自己仔细慢慢地找,我都找到了,你怎么会找不到??? :D

2、你真的需要这种功能吗????

我现在不需要这种功能,所以没有实现。但是我认为这种功能是可以实现的。

如果你去看一下NDIS.H,就会发现InsertTailList()和InsertHeadList()实际上都是宏,它们只不过是在修改一些指针而已。

所以你也完全可以自己定义一个函数来实现在列表中间添加或者删除Entry的功能。当然,代码是不可能给你了,因为我也没有 :D
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-29 17:28
NdisMSetTimer是在任何只要可以得到pAdapt的地方调用就可以了么??还是一定要跟在Initial后面呢??

timerfunction里面如何传进去我自己的参数呢?难道一定要在adapt结构里面增加项目么?

另外,如果我NdisMCancelTimer返回失败的话,我再次NdisSetTimer会是什么后果呢?以前有一篇帖子讨论这个,好像也没什么结果

各位大侠指点!!! :mad:
游客

返回顶部