WEB开发网
开发学院软件开发VC Win32 调试接口设计与实现浅析 阅读

Win32 调试接口设计与实现浅析

 2006-07-17 11:08:57 来源:WEB开发网   
核心提示: 以下为引用:#define DbgStateChangeSemaphore (NtCurrentTeb()->DbgSsReserved[0])#define DbgUiApiPort (NtCurrentTeb()->DbgSsReserved[1])NTSTATUS Dbg
以下为引用:
#define DbgStateChangeSemaphore (NtCurrentTeb()->DbgSsReserved[0])
#define DbgUiApiPort (NtCurrentTeb()->DbgSsReserved[1])
NTSTATUS DbgUiConnectToDbg( VOID )
{
 NTSTATUS st = NtConnectPort(&DbgUiApiPort, L"\\DbgUiApiPort", ..., &DbgStateChangeSemaphore);
 if(NT_SUCCESS(st))
 {
  NtRegisterThreadTerminatePort(DbgUiApiPort);
 }
 else
 {
  DbgUiApiPort = NULL;
 }
 return st;
}

如果连接调试子系统成功,则调用NtRegisterThreadTerminatePort函数(ntos\ps\psdelete.c:1202)将调试端口加入到当前线程控制块的终止端口列表(ETHREAD->TerminationPortList)中。在线程结束的之前,会激活此列表中的端口,给调试器一个清理的机会。

DbgUiDebugActiveProcess函数完成具体的激活被调试进程的调试服务器的功能。伪代码如下:

以下为引用:
#define DbgUiApiPort (NtCurrentTeb()->DbgSsReserved[1])
void DbgUiDebugActiveProcess(HANDLE hProcess)
{
 return NtDebugActiveProcess(DbgUiApiPort) &&
     DbgUiIssueRemoteBreakin(hProcess) &&
     DbgUiStopDebugging(hProcess);
}

至于这几个函数的具体实现,等后面章节详细分析Win32调试子系统时再详细讲解,呵呵

在被调试进程启动了调试支持后,调试器调用WaitForDebugEvent函数等待调试事件的发生。此函数实际上是对DbgUiWaitStateChange函数(ntos\dll\dlluistb.c:93)的一个简单包装,通过等待DbgUiConnectToDbg函数获得的调试事件信号灯来完成实际功能。如果成功获得调试事件,还会通过NtRequestWaitReplyPort函数(ntos\lpc\lpcsend.c:717)向调试服务器通报DbgUiWaitStateChangeApi消息。

在处理完调试事件后,调试器调用的ContinueDebugEvent函数是DbgUiContinue函数的一个简单包装,也是使用NtRequestWaitReplyPort函数向调试服务器通报DbgUiContinueApi消息。

在完成调试功能后,WinXP/2003还提供了DebugActiveProcessStop函数停止调试。伪代码如下:

以下为引用:
BOOL DebugActiveProcessStop(DWORD dwProcessId)
{
 HANDLE hProcess = ProcessIdToHandle(dwProcessId);
 if(hProcess)
 {
  CloseAllProcessHandles(dwProcessId);
  DbgUiStopDebugging(hProcess);
  if(NtClose(hProcess))
   return TRUE;
 }
 return FALSE;
}

DbgUiStopDebugging函数(ntdll.dll)调用ZwRemoveProcessDebug函数(ntoskrnl.exe)关闭指定进程的调试端口,实现上是传入端口句柄和进程句柄,调用0xC7号系统服务完成最终功能。这个暂时就不深入讨论了,就此打住 :P

在了解这些后,对用户态调试器的实现应该就有了一个框架性的了解:其结构就是一个基于事件的模型,然后通过向调试子系统请求调试事件并完成具体操作。

上一页  1 2 3 4 

Tags:Win 调试 接口

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