【发布时间】:2021-04-20 11:29:57
【问题描述】:
OUTPUT_DEBUG_STRING_INFO 结构的文档没有解释如何确定它指向的字符串值的长度(或大小)。具体来说,nDebugStringLength 的文档令人困惑:
字符串长度的低 16 位(以字节为单位)。由于 nDebugStringLength 是 WORD 类型,因此它并不总是包含字符串的完整长度(以字节为单位)。
例如,如果原始输出字符串长于 65536 字节,则该字段将包含一个小于实际字符串长度(以字节为单位)的值。
据我了解,真实大小可以是方程解的任何值:
size = nDebugStringLength + (n * 65536)
对于[0..65536) 中的任何n。
问题:
如何确定字符串的正确大小?除非我忽略了某些东西,否则文档在这方面似乎是不够的。
【问题讨论】:
-
好吧,在超过 64k 字节的情况下,我想您必须继续分块读取,直到找到 NULL 终止符。但是,无论如何,您将如何处理长度超过 64k 字节的字符串?它甚至支持那么大的字符串吗?在旧版本的 Windows 中,the buffer is only 4k 字节所以可能甚至不相关。
-
@luk 你在哪里找到字符串被NUL终止的信息?
-
尝试一些实验。我怀疑你会找到任何可靠的文档。
-
如果使用
WaitForDebugEvent[Ex]- 没办法。在内部,此 api 使用DbgUiConvertStateChangeStructure将DBGUI_WAIT_STATE_CHANGE转换为DEBUG_EVENT。DbgExceptionStateChange与 ExceptionCodeDBG_PRINTEXCEPTION_C和DBG_PRINTEXCEPTION_WIDE_C转换为OUTPUT_DEBUG_STRING_INFO和字符串长度 truncated 。这里只使用本机 api -
刚刚在 Windows 10 上测试。
WaitForDebugEvent在使用OutputDebugStringA时工作正常。当字符串长度超过 64k 时,nDebugStringLength参数是没有意义的,但是如果你循环ReadProcessMemory直到到达一个 NULL 终止符,那么它将按预期工作。
标签: winapi