我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。

OutputDebugString的工作原理

简而言之,OutputDebugString尝试将消息发送到附加到给定进程的调试器,如果没有调试器侦听,则尝试将全局节映射到进程内存中并将调试消息保存在其中。我使用本机API实现OutputDebugStringA(ANSI版本)的示例如下:

voidNTAPI RtlOutputDebugStringA(_In_opt_ LPCSTR OutputString) {if(OutputString) {
EXCEPTION_RECORD exceptionRecord{
0};

exceptionRecord.ExceptionCode
=DBG_PRINTEXCEPTION_C;
exceptionRecord.NumberParameters
= 2;
exceptionRecord.ExceptionInformation[
0] = strlen(OutputString) + 1;
exceptionRecord.ExceptionInformation[
1] = reinterpret_cast<ULONG_PTR>(OutputString);

__try {
RtlRaiseException(
&exceptionRecord);
} __except (EXCEPTION_EXECUTE_HANDLER) {
NotifyGlobalDebugOutputMonitor(OutputString);
}
}
}

标签: none

添加新评论