【问题标题】:How do you determine the length of the string in an OUTPUT_DEBUG_STRING_INFO?如何确定 OUTPUT_DEBUG_STRING_INFO 中字符串的长度?
【发布时间】: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 使用 DbgUiConvertStateChangeStructureDBGUI_WAIT_STATE_CHANGE 转换为 DEBUG_EVENTDbgExceptionStateChangeExceptionCode DBG_PRINTEXCEPTION_CDBG_PRINTEXCEPTION_WIDE_C 转换为 OUTPUT_DEBUG_STRING_INFO 和字符串长度 truncated 。这里只使用本机 api
  • 刚刚在 Windows 10 上测试。WaitForDebugEvent 在使用 OutputDebugStringA 时工作正常。当字符串长度超过 64k 时,nDebugStringLength 参数是没有意义的,但是如果你循环 ReadProcessMemory 直到到达一个 NULL 终止符,那么它将按预期工作。

标签: winapi


【解决方案1】:

调试事件最初以DBGUI_WAIT_STATE_CHANGE的形式出现

如果使用WaitForDebugEvent[Ex] api - 它在内部使用DbgUiConvertStateChangeStructure[Ex]DBGUI_WAIT_STATE_CHANGE 转换为DEBUG_EVENT

DbgExceptionStateChang(在 NewState 中)事件将 DBG_PRINTEXCEPTION_WIDE_CDBG_PRINTEXCEPTION_C(在 ExceptionCode 中)转换为 OUTPUT_DEBUG_STRING_INFOnDebugStringLength 取自 Exception.ExceptionRecord.ExceptionInformation[0]ExceptionInformation[3](如果 DBG_PRINTEXCEPTION_C 和 api 版本没有)。但是因为 nDebugStringLength 只有 16 位长度,当原始值为 32/64 位长度时 - 它被截断 - 只有低 16 位 ExceptionInformation[0] (或 [3]) 被使用。 请注意,ExceptionInformation[0](如果是 DBG_PRINTEXCEPTION_WIDE_C 则为 [3])包含 characters 中的字符串长度,包括强>终止0。 相比之下 nDebugStringLength 以字节为单位(如果我们使用 WaitForDebugEventExDBG_PRINTEXCEPTION_WIDE_C 异常 - nDebugStringLength = (WORD)(ExceptionInformation[0] * sizeof(WCHAR))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2011-09-08
    • 2012-09-14
    • 2011-05-06
    • 2012-07-06
    • 1970-01-01
    • 2011-05-04
    • 2011-10-06
    相关资源
    最近更新 更多