我正在编写一个低级记录器函数,它将文本字符串附加到文本(日志)文件的末尾。要求是此函数不应调用来自 DLL 的任何 WinAPI,这些 DLL 可能尚不可用于该进程——例如当它从 DllMain 调用时处理程序。换句话说,它不能使用除了保证加载到任何用户模式进程中的库之外的任何库,即 kernel32.dll
或 ntdll.dll
.
我可以通过 CreateFile
、WriteFile
、CloseHandle
、HeapAlloc
、HeapFree
等均来自kernel32.dll
。
问题在于格式化输出字符串。例如,我需要添加一些额外的(自动生成的)详细信息,例如当前时间、进程 ID、 session ID 等。我通常会为此使用 wsprintf
类型的函数,或者 StringCchPrintf
准确地说,是这样的:
StringCchPrintf(buffer, buffer_size, L"%04u-%02u-%02u %02u:%02u:%02u pid=0x%x, sessID=%d, %s\r\n", /* parameters */ );
但是那些 API 违反了我上面提到的规则。
有谁知道是否有可用的低级 printf
类型格式化 API?
最佳答案
所有版本的 ntdll.dll 都支持 minimum next(from xp) 字符串格式化功能:
_snprintf
_snwprintf
_vsnprintf
_vsnwprintf
sprintf
swprintf
vsprintf
当然完全匹配来自 crt 的相同功能的签名。我们可以免费使用这个api。新版本的 ntdll 添加了一些新的格式字符串 api。接下来说 win7(和所有最新版本)ntdll.dll 导出:
_snprintf
_snprintf_s
_snwprintf
_snwprintf_s
_swprintf
_vscwprintf
_vsnprintf
_vsnprintf_s
_vsnwprintf
_vsnwprintf_s
_vswprintf
swprintf
swprintf_s
vsprintf
vsprintf_s
vswprintf_s
关于c - 是否有来自低级库(如 kernel32.dll 或 ntdll.dll)的 wsprintf() 类型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46857294/