阅读:1769回复:7
各位大哥帮帮忙
在ptreceivepacket里面得到的miniport的包,能不能改动之中的数据呢?好像听说不同的进程的内存是不能随便改的?有哪位大哥试过?
还有一个问题,不知道各位在程序里有没有用过同步量呢?我在程序里需要同步,但是spinlock不太合适,内核的fast mutex好像还需要irql的限制。不知道大哥们都用的什么同步量呢?谢谢 |
|
沙发#
发布于:2003-11-01 20:53
在xpddk中的mux例子中用到了同步,可以参考使用。
在ptreceivepacket中得到的是nic miniport传上来的包,是可以修改的, |
|
|
板凳#
发布于: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。很奇怪,各位给点意见吧 |
|
地板#
发布于: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进入的。 |
|
地下室#
发布于:2003-11-02 12:24
我晕,mux里的同步怎么这么怪啊,是这个么? mux中用的就是自定的同步mutex,它用一个计数器来保证同步访问的。我个人认为如果使用Event来做同步,需要调用waitsingleobject这类函数,建议你看看waltoney的wdm编程一书,里面有对同步问题的描述。 |
|
|
5楼#
发布于:2003-11-03 11:22
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 ) NdisWaitEvent不会自动把事件置成unsingal状态么?一般的等待过程都会的啊 |
|
6楼#
发布于:2003-11-03 11:29
mux里面那个同步,无法获取计数器后会sleep,可是这个值设成多少合适呢?我是在ptreceivepacket里面要同步的,设成多少都不合适吧?可是不设的话又会一直死循环…… 所以我觉得还是用event好一些,难道NdisWaitEvent不会把event设成unsingal状态?晕 |
|
7楼#
发布于:2003-11-04 11:09
老大们回答一下啊,郁闷死了 :(
|
|