dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1769回复:7

各位大哥帮帮忙

楼主#
更多 发布于:2003-11-01 20:43
在ptreceivepacket里面得到的miniport的包,能不能改动之中的数据呢?好像听说不同的进程的内存是不能随便改的?有哪位大哥试过?

还有一个问题,不知道各位在程序里有没有用过同步量呢?我在程序里需要同步,但是spinlock不太合适,内核的fast mutex好像还需要irql的限制。不知道大哥们都用的什么同步量呢?谢谢
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-11-01 20:53
在xpddk中的mux例子中用到了同步,可以参考使用。
在ptreceivepacket中得到的是nic miniport传上来的包,是可以修改的,
good good study, day day up。
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-01 23:04
我晕,mux里的同步怎么这么怪啊,是这个么?
#define MUX_ACQUIRE_MUTEX(_pMutex)                              \\
{                                                               \\
    while (NdisInterlockedIncrement(&((_pMutex)->Counter)) != 1)\\
    {                                                           \\
        NdisInterlockedDecrement(&((_pMutex)->Counter));        \\
        NdisMSleep(10000);                                      \\
    }                                                           \\
    (_pMutex)->ModuleAndLine = (MODULE_NUMBER << 16) | __LINE__;\\
}

#define MUX_RELEASE_MUTEX(_pMutex)                              \\
{                                                               \\
    (_pMutex)->ModuleAndLine = 0;                               \\
    NdisInterlockedDecrement(&(_pMutex)->Counter);              \\
}

我目前用的也是自定的mutex
typedef struct _NDIS_MUTEX
{
NDIS_EVENT ndisEvent;

}NDIS_MUTEX, *PNDIS_MUTEX;

#define InitializeNDISMutex( mutex ) NdisInitializeEvent( &mutex.ndisEvent ); NdisSetEvent( &mutex.ndisEvent )
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 )
#define ReleaseNDISMutex( mutex ) NdisSetEvent( &mutex.ndisEvent )

但是好像同步的时候有点问题,就是一个过程获取了mutex后另外一个过程还是可以获取这个mutex。很奇怪,各位给点意见吧
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-11-02 00:03
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 )

并没有阻止其它的thread呀。假设你调用InitializeNDISMutex( mutex ),event是这时候signaled,没有thread会wait的。
这个方法不好。即使你改成
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 ); NdisResetEvent( &mutex.ndisEvent )
也不能保证在NdisWaitEvent和NdisResetEvent之间没有别的thread进入的。
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-11-02 12:24
我晕,mux里的同步怎么这么怪啊,是这个么?
#define MUX_ACQUIRE_MUTEX(_pMutex)                              \\
{                                                               \\
    while (NdisInterlockedIncrement(&((_pMutex)->Counter)) != 1)\\
    {                                                           \\
        NdisInterlockedDecrement(&((_pMutex)->Counter));        \\
        NdisMSleep(10000);                                      \\
    }                                                           \\
    (_pMutex)->ModuleAndLine = (MODULE_NUMBER << 16) | __LINE__;\\
}

#define MUX_RELEASE_MUTEX(_pMutex)                              \\
{                                                               \\
    (_pMutex)->ModuleAndLine = 0;                               \\
    NdisInterlockedDecrement(&(_pMutex)->Counter);              \\
}

我目前用的也是自定的mutex
typedef struct _NDIS_MUTEX
{
NDIS_EVENT ndisEvent;

}NDIS_MUTEX, *PNDIS_MUTEX;

#define InitializeNDISMutex( mutex ) NdisInitializeEvent( &mutex.ndisEvent ); NdisSetEvent( &mutex.ndisEvent )
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 )
#define ReleaseNDISMutex( mutex ) NdisSetEvent( &mutex.ndisEvent )

但是好像同步的时候有点问题,就是一个过程获取了mutex后另外一个过程还是可以获取这个mutex。很奇怪,各位给点意见吧

mux中用的就是自定的同步mutex,它用一个计数器来保证同步访问的。我个人认为如果使用Event来做同步,需要调用waitsingleobject这类函数,建议你看看waltoney的wdm编程一书,里面有对同步问题的描述。
good good study, day day up。
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-03 11:22
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 )

并没有阻止其它的thread呀。假设你调用InitializeNDISMutex( mutex ),event是这时候signaled,没有thread会wait的。
这个方法不好。即使你改成
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 ); NdisResetEvent( &mutex.ndisEvent )
也不能保证在NdisWaitEvent和NdisResetEvent之间没有别的thread进入的。


NdisWaitEvent不会自动把事件置成unsingal状态么?一般的等待过程都会的啊
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-03 11:29

mux中用的就是自定的同步mutex,它用一个计数器来保证同步访问的。我个人认为如果使用Event来做同步,需要调用waitsingleobject这类函数,建议你看看waltoney的wdm编程一书,里面有对同步问题的描述。


mux里面那个同步,无法获取计数器后会sleep,可是这个值设成多少合适呢?我是在ptreceivepacket里面要同步的,设成多少都不合适吧?可是不设的话又会一直死循环……

所以我觉得还是用event好一些,难道NdisWaitEvent不会把event设成unsingal状态?晕

dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-04 11:09
老大们回答一下啊,郁闷死了 :(
游客

返回顶部