互斥体

互斥体

互斥体(mutant)和事件(event)和信号量(semaphore)一样,都可以用来进行线程的同步控制,这几个对象都是内核对象,所以意味着,通过这些对象可以进行跨进程的线程同步控制

极端情况 :
	*如果B进程的Y线程还没有来得及调用修改SignalState的函数(如果SetEvent),那么等待对象将被遗弃,这也就意味着等待对象的链表上的线程将永远等待下去*

1.互斥体遇到这种情况,系统会将SignalState进行重置
2.互斥体可以重入
WaitForSingleObject(A)
	...
	WaitForSingleObject(A,B,C)
	...

互斥体结构

_KMUTANT


nt!_KMUTANT
   +0x000 Header           : _DISPATCHER_HEADER
   +0x010 MutantListEntry  : _LIST_ENTRY
   //拥有互斥体的线程(KTHREAD+0x10 MutantListHead)是个链表头 圈着所有互斥体
   +0x018 OwnerThread      : Ptr32 _KTHREAD
   //拥有互斥体的线程
   +0x01c Abandoned        : UChar
   //是否已经被放弃不用
   +0x01d ApcDisable       : UChar
   //是否禁用内核apc

3环程序创建的 ; NtCreateMutant ApcDisable = 0
0环程序创建的 ; NtCreateMutex  ApcDisable = 1   
   

_DISPATCHER_HEADER


ntdll!_DISPATCHER_HEADER
   +0x000 Type             : UChar
   +0x001 Absolute         : UChar
   +0x002 Size             : UChar
   +0x003 Inserted         : UChar
   +0x004 SignalState      : Int4B
   +0x008 WaitListHead     : _LIST_ENTRY

创建互斥体

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTE SlpMutexAttributes,//安全属性的指针
BOOL bInitialOwner,//初始化互斥对象的所有者
LPCTSTR lpName //指向互斥体对象名的指针
)

//CreateMutex -> NtCreateMutant -> KeInitializeMutant

MUTANT.header.Type = 2
MUTANT.header.SignalState = bInitialOwner ? 0 : 1
MUTANT.OwnerThread = 当前线程 or NULL
MUTANT.Abandoned = 0        
MUTANT.ApcDisable = 0        

bInitialOwner == TRUE 将当前互斥体挂入到当前线程的互斥体链表(_KTHREAD+0x10 MutantListHead)

释放互斥体


BOOL WINAPI ReleaseMutext(HANDLE hMUTEX);

ReleaseMutext -> NtReleaseMutext -> KeReleaseMutant

MmUnloadSysteImage -> KeReleaseMutant(x,y,Abandon,Z)

if (Abandon == false) //正常调用
{
	MUTANT.Header.SignalState++;
}
else
{
	MUTANT.Header.SignalState  = 1;
	MUTANT.OwnerThread = NULL;
}

if (UTANT.Header.SignalState  == 1)
{
	MUTANT.OwnerThread = NULL;
	从当前线程互斥体链表中将当前互斥体移除
}


//正常调用的时候 :
MUTANT.Header.SignalState++
//如果SignalState = 1 说明其它进程可以用了,将该互斥体从线程的链表中移除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值