DeleteCriticalSection() critical section
lpCriticalSection
对关键节对象的指针。先前必须已将该对象初始化与InitializeCriticalSection函数中。返回值
此函数不返回值[1]备注
删除关键节对象释放由该对象使用的所有系统资源。
关键节之后,对象已被删除,未引用的对象的任何功能,在关键节 (如EnterCriticalSection、TryEnterCriticalSection、 和LeaveCriticalSection) 上运行非InitializeCriticalSection和InitializeCriticalSectionAndSpinCount。如果您尝试这样做,可能会出现内存损坏和其他意外的错误。
如果它仍拥有删除关键节,则已删除的关键节的所有权在等待的线程的状态未定义。___________________________________
这是一个InlineAPIHook的场景,有多个线程
线程1,这是我Hook的函数(执行非常频繁)
MySysCall(...)
{
EnterCriticalSection()
...
LeaveCriticalSection()
}
线程2,这是卸载Hook,还原SysCall的线程
UnHook()
{
EnterCriticalSection()
//保证MySysCall函数执行到EnterCriticalSection处
Sleep(50);
...
//还原syscall的入口5个字节
//删除MySysCall中自己创建的资源
LeaveCriticalSection()
DeleteCriticalSection
}
请问我怎么保证我执行UnHook的时候MySysCall执行到EnterCriticalSection()时就跳出来呢?
-----------------------------------------------------------
UnHook的时候本来就是MySysCall执行不了呀,会等在EnterCriticalSection(),有什么问题?
UnHook的时候你
LeaveCriticalSection()
DeleteCriticalSection,立马就删除了,MySysCall线程在这LeaveCriticalSection与DeleteCriticalSection两句之间是抢不到cpu片的。
__________________________________________
是这样的,但是MySysCall在UnHook线程DeleteCriticalSection之后,进入EnterCriticalSection这里会出错,因为这个参数已经是NULL了,另外,即使这里不错的话,那么这个线程在之后会是什么样的流程呢?谢谢。
__________________________________
像这种多线程,用到临界区变量来做同步,最好都是先保证所有线程退出然后再释放临界区变量
___________________________________
我不释放是可以,但是执行完UnHook函数之后我的DLL会free掉,这时候MySysCall所在的代码区就成了未知地址了,EnterCriticalSection进去执行肯定错。所以我必须保证UnHook之后MySysCall就不应该在执行,跳回到系统自己的代码领域。不知道怎么操作,我快疯了!。
__________________________________
用事件结合的方式:
HANDLEhandle=NULL;
MySysCall(...)
{
if(handle!=NULL)
WaitForSingleObject(handle,...);
EnterCriticalSection()
...
LeaveCriticalSection()
}
UnHook()
{
handle=CreateEvent(...);
EnterCriticalSection()
//保证MySysCall函数执行到EnterCriticalSection处
Sleep(50);
m_bRunning=False;
...
//还原syscall的入口5个字节
//删除MySysCall中自己创建的资源
LeaveCriticalSection()
DeleteCriticalSection
}
__________________________________
是的,我已经这样做了。不过还是有点虚...
我是这样的:
HANDLEhCanDelCS=NULL;
HANDLEhCanFreeDll=NULL;
BOOLbUnHooking=FALSE;
MySysCall(...)
{
EnterCriticalSection()
if(bUnHooking)
{
SetEvent(hCanDelCS);
returncode=SysCall(...);
SetEvent(hCanFreeDLL);
returnreturncode;
}
...
LeaveCriticalSection()
}
线程2,这是卸载Hook,还原SysCall的线程
UnHook()
{
bUnHooking=TRUE;
EnterCriticalSection()
...
//还原syscall的入口5个字节
//删除MySysCall中自己创建的资源
if(hCanDelCS)
watforsingleobject(hCanDelCS,500);
LeaveCriticalSection()
DeleteCriticalSection
if(hCanFreeDll)
watforsingleobject(hCanDelCS,500);
sleep(50);
returntodllmain();//freedll
}
_______________________
mysyscall中会卡在EnterCriticalSection那里,等UnhookLeaveXx之后会继续执行mysyscall,这时候mysyscall代码已经失效了。
______________________________
更多阅读
如何将Mapgis图形转成CAD图形 mapgis转换cad
如何将Mapgis图形转成CAD图形——简介有的朋友习惯用cad,需要将mapgis图件转换成cad图件,下面给大家示范一下转图的步骤,希望对您有用。如何将Mapgis图形转成CAD图形——工具/原料section插件:小巧、实用如何将Mapgis图形转成CAD图形—
操作系统英文单词 系统英文单词
存取方法:access method适配器:adapter批处理系统:Batch system并发:Concurrent临界资源:Critical resource临界段:Critical section设备控制器:device controller死锁:deadlock死锁预防:deadlock prevention死锁避免:deadlock abst
隔阂千手佛间×宇智波田岛 2 _Obito 千手扉间vs宇智波泉奈
现代,cp:千手佛间×宇智波田岛section 2此时,大学校园里。千手佛间满意的看着校园,想,啊啊啊终于可以不用那么辛苦的学习了啊,生活真美好!还有就是不用再看田岛那张面瘫脸了,他们宇智波的遗传就是面瘫吗?他看到很多宇智波都只有一个表情(▼_
中国艺术设计考研网-2012考研英语2真题及答案 南京艺术学院考研网
2012年考研英语(二)真题及答案中国艺术设计考研网Section 1 Use of Eninglish Directions : Millions of Americans and foreigners see GI.Joeas a mindless war toy ,the symbol of American military adventurism,but
★★李龙大选手被问及理想型···“比起允儿更喜欢申 允儿男团理想型
‘羽毛球王子’李龙大抛弃大势的女子团体而选择重剑妖精‘申雅岚’成为话题!在26日的MBC‘Section演艺通信’节目录制中,2012年伦敦奥运会男子双打铜牌得主李龙大和重剑女子团体铜牌得主申雅岚一