|
|
|
|
|
|
|
Windows内核调试
帖子发起人: 侯佩 发起时间: 2009-02-18 19:45 下午 回复: 3
|
帖子排序:
|
|
|
|
2009-02-18, 19:45 下午
|
|
才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
|
|
|
|
书上说传递的2个参数,第1个是PID,这可以理解,第2个是一个EVENT的句柄, 我想请教这个句柄可以跨进程使用吗? 难道这个Handle是传说中的内核句柄(此内核句柄非一般意义上的内核句柄,它在 任意进程上下文中有效)?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-02-19, 13:08 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
|
|
|
|
这是因为这两个进程有父子关系,在这种情况下,调试器进程实际上是作为崩溃进程的子进程启动的,而且在启动时指定了继承父进程的句柄。也就是在调用CreateProcess时把bInheritHandles参数(第五个参数)设置为TRUE,参见《软件调试》P325页的伪代码清单第232行。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-02, 18:47 下午
|
|
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-03-02, 19:51 下午
|
MJ0011
注册: 2008-04-24
发 贴: 112
|
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
|
|
|
|
2楼说的并不完全正确,父进程中只有标志为OBJ_INHERIT的句柄才能被子进程继承
CreateProcessW中的bInheritHandles为TRUE,会在NtCreateProcess->PspCreateProcess->ObInitProcess->ExDupHandleTable中体现
其中ObDupHandleProcedure中存在判断:
//
// If the object table should not inherited then return false
//
if (!(ObjectTableEntry->ObAttributes & OBJ_INHERIT)) {
return( FALSE );
}
同时参考ObInitProcess的描述:
NTSTATUS
ObInitProcess (
PEPROCESS ParentProcess OPTIONAL,
PEPROCESS NewProcess
)
/*++
Routine Description:
This function initializes a process object table. If the ParentProcess
is specified, then all object handles with the OBJ_INHERIT attribute are
copied from the parent object table to the new process' object table.
The HandleCount field of each object copied is incremented by one. Both
object table mutexes remained locked for the duration of the copy
operation.
而这个EventHandle之所以可以被继承,主要原因是因为CreateEvent设置了允许继承的标志:
参考MSDN:
http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx
Multiple processes can have handles of the same event object, enabling use of the object for interprocess synchronization. The following object-sharing mechanisms are available:
A child process created by the CreateProcess function can inherit a handle to an event object if the lpEventAttributes parameter of CreateEvent enabled inheritance.
参考2楼的325页代码:
sa.nLength = sizeof(sa);
sa.LpSecrurityDescriptor = NULL ;
sa.bInheritHandle = TRUE ;
EventHandle = CreateEvent(&sa , TRUE , FALSE , NULL);
....
参考:CreateEventW->BaseFormatObjectAttributes:
...
if ( SecurityAttributes ) {
Attributes = (SecurityAttributes->bInheritHandle ? OBJ_INHERIT : 0);
SecurityDescriptor = SecurityAttributes->lpSecurityDescriptor;
}
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
|
|
|
|
|
|