我正在写一个低级别的logging器函数,将文本string追加到文本(日志)文件的末尾。 要求是这个函数不应该调用任何可能不可用于进程的DLL的WinAPI – 比如当它是从DllMain处理程序调用时 。 换句话说,它不能使用除了保证被加载到任何用户模式进程的库之外的任何库,即kernel32.dll
或ntdll.dll
。
我能够很好地得到所有来自kernel32.dll
CreateFile
, WriteFile
, CloseHandle
, HeapAlloc
, HeapFree
等等。
问题是格式化输出string。 例如,我需要添加一些额外的(自动生成的)细节,比如当前时间,进程ID,会话ID等等。我通常会使用wsprintf
types的函数,或者wsprintf
是这样的:
StringCchPrintf(buffer, buffer_size, L"%04u-%02u-%02u %02u:%02u:%02u pid=0x%x, sessID=%d, %s\r\n", /* parameters */ );
但这些API违反了我上面提到的规则。
有谁知道是否有低级别的printf
types格式化API可用?
所有版本的ntdll.dll支持如何最小(从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