WEB开发网      婵犻潧鍊婚弲顐︽偟椤栨稓闄勯柦妯侯槸閻庤霉濠婂骸浜剧紒杈ㄥ笚閹峰懘鎮╅崹顐ゆ殸婵炴垶鎸撮崑鎾趁归悩鐑橆棄闁搞劌瀛╃粋宥夘敃閿濆柊锕傛煙鐎涙ê鐏f繝濠冨灴閹啴宕熼鍡╀紘婵炲濮惧Λ鍕叏閳哄懎绀夋繛鎴濈-楠炪垽鎮归崶褍妲婚柛銊ュ缁傚秹鏁撻敓锟� ---闂佹寧娲╅幏锟�
开发学院软件开发VC Win32 调试接口设计与实现浅析 阅读

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

 2006-07-17 11:08:57 来源:WEB开发网 闂侀潧妫撮幏锟�闂佸憡鍨电换鎰版儍椤掑倵鍋撳☉娆嶄沪缂傚稄鎷�婵犫拃鍛粶闁靛洤娲ㄩ埀顒佺⊕閵囩偟绱為敓锟�闂侀潧妫撮幏锟�  闂佺ǹ绻楀▍鏇㈠极閻愬灚瀚梺鍨儏閳ь剙绉归弻銊р偓闈涙啞閻h京鈧敻鍋婇崰鏍х暦閿燂拷
核心提示: 以下为引用:#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 调试 接口

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