c - 是否有来自低级库(如 kernel32.dll 或 ntdll.dll)的 wsprintf() 类型函数?

标签 c windows winapi dll

我正在编写一个低级记录器函数,它将文本字符串附加到文本(日志)文件的末尾。要求是此函数不应调用来自 DLL 的任何 WinAPI,这些 DLL 可能尚不可用于该进程——例如当它从 DllMain 调用时处理程序。换句话说,它不能使用除了保证加载到任何用户模式进程中的库之外的任何库,即 kernel32.dllntdll.dll .

我可以通过 CreateFileWriteFileCloseHandleHeapAllocHeapFree等均来自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/

相关文章:

c - 具有恒定时间后继操作的优先级队列

c++ - Windows SDK 7.1 64 位构建 CloseHandle 显然不在 kernel32.lib 中

c++ - 如何为多线程应用程序制作全局对象

windows - Windows 上的 Git : "merging" 2 directories with the same name but different case

windows - 如何打印到控制台窗口?

c - 使用 while 循环打印每行 10 个字符的 Ascii 表

c - 在 MTD 上 lseek 超出 EOF

c++ - 问 : memmove() and memcpy() on QT (c++)

c++ - CreateRemoteThread - ERROR_ACCES_DENIED

winapi - 在 Vista/Aero 上处理 WM_NCPAINT "breaks"DWM 玻璃渲染