WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(三)——所涉及的Windows驱动基... 阅读

深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识(2)

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 互斥体也有两种状态,激发态和未激发态,深度剖析WinPcap之(三)——所涉及的Windows驱动基础知识(2)(5),如果线程获得互斥体时,此时的状态是未激发态,LONG InterlockedExchange(IN OUT PLONG Target,IN LONG Value);参数Targ

互斥体也有两种状态,激发态和未激发态。如果线程获得互斥体时,此时的状态是未激发态,当释放互斥体时,互斥体的状态为激发态。

初始化互斥体的函数是CreateMutex,其函数声明如下;

HANDLE CreateMutex(

  LPSECURITY_ATTRIBUTES lpMutexAttributes,  //安全属性

  BOOL bInitialOwner,                       //初始化的占有状态

  LPCTSTR lpName                            //对象名称

);

其中第二个参数blIutialOwner表明初始化时是否被占有。如果没有被占有,则为激发态,否则为未激发态。另外,获得互斥体的函数是WaitForSingleObject函数,而释放互斥体的函数是ReleaseMutex函数。

下面的代码为WinPcap中使用使用互斥体的实例:

HANDLE g_AdaptersInfoMutex = NULL;
g_AdaptersInfoMutex = CreateMutex(NULL, FALSE, NULL);
 
WaitForSingleObject(g_AdaptersInfoMutex, INFINITE);

ReleaseMutex(g_AdaptersInfoMutex);

1.1.5.6     变量的原子操作

内核提供了对一个变量进行原子操作,如递增、递减或设置指定的值,的函数。

对一个变量进行原子递增操作,可使用InterlockedIncrement函数。

LONG InterlockedIncrement(IN PLONG  Addend);

参数Addend指向一个 LONG型的变量。

函数返回递增了的值。

对一个变量进行原子递减操作,可使用InterlockedDecrement函数。

LONG InterlockedDecrement (IN PLONG  Addend);

参数Addend指向一个 LONG型的变量。

函数返回递减了的值。

对一个变量进行原子设置指定值的操作,可使用InterlockedExchange函数。

LONG InterlockedExchange(IN OUT PLONG  Target,IN LONG  Value);

参数Target指向一个 需要进行设置的LONG型变量,参数Value 为需要设置的值。

函数返回参数Target所指的初始值。

下面的代码为WinPcap中使用原子操作的实例:

ULONG g_NumOpenedInstances = 0;
 
NTSTATUS NPF_Open(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{

localNumOpenedInstances =
InterlockedIncrement(&g_NumOpenedInstances);
    …
}
 
NTSTATUS NPF_Cleanup(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{

localNumOpenInstances =
InterlockedDecrement(&g_NumOpenedInstances);
    …
}

出处:http://eslxf.blog.51cto.com/918801/196913

上一页  1 2 3 4 5 

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接