Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: 侯佩   发起时间: 2009-02-18 19:45 下午   回复: 3

Print Search
帖子排序:    
   2009-02-18, 19:45 下午
hopy 离线,最后访问时间: 2010/1/7 8:53:33 侯佩

发帖数前500位
男
注册: 2007-01-13
发 贴: 3
Zip it! [:#] 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
Reply Quote
书上说传递的2个参数,第1个是PID,这可以理解,第2个是一个EVENT的句柄,
我想请教这个句柄可以跨进程使用吗?
难道这个Handle是传说中的内核句柄(此内核句柄非一般意义上的内核句柄,它在
任意进程上下文中有效)?


IP 地址: 已记录   报告
   2009-02-19, 13:08 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
Reply Quote
这是因为这两个进程有父子关系,在这种情况下,调试器进程实际上是作为崩溃进程的子进程启动的,而且在启动时指定了继承父进程的句柄。也就是在调用CreateProcess时把bInheritHandles参数(第五个参数)设置为TRUE,参见《软件调试》P325页的伪代码清单第232行。
IP 地址: 已记录   报告
   2009-03-02, 18:47 下午
hopy 离线,最后访问时间: 2010/1/7 8:53:33 侯佩

发帖数前500位
男
注册: 2007-01-13
发 贴: 3
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
Reply Quote
失误了...多谢
IP 地址: 已记录   报告
   2009-03-02, 19:51 下午
MJ0011 离线,最后访问时间: 2009/12/24 22:33:41 MJ0011

发帖数前10位
注册: 2008-04-24
发 贴: 112
Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。
Reply Quote
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内核调试 » Re: 才读不久,对<<软件调试>>的即时调试的参数传递部分有一个疑问。

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.