我正在编写一个低级记录器函数,它将文本字符串附加到文本(日志)文件的末尾。要求是此函数不应调用任何可能尚未用于该进程的DLL的WinAPI - 例如从DllMain处理程序调用它时。换句话说,除了保证加载到任何用户模式进程中的库之外,它不能使用任何库,即kernel32.dll
或ntdll.dll
。
我能够很好地完成CreateFile
,WriteFile
,CloseHandle
,HeapAlloc
,HeapFree
等来自{ {1}}。
问题是格式化输出字符串。例如,我需要添加一些额外的(自动生成的)详细信息,例如当前时间,进程ID,会话ID等。我通常会使用kernel32.dll
类型函数,或wsprintf
为确切地说,如此:
StringCchPrintf
但这些API违反了我上面提到的规则。
有没有人知道是否有可用的低级别StringCchPrintf(buffer, buffer_size, L"%04u-%02u-%02u %02u:%02u:%02u pid=0x%x, sessID=%d, %s\r\n", /* parameters */ );
类型格式化API?
答案 0 :(得分:3)
所有版本的 ntdll.dll 都支持最小化next(来自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