2017-10-20 12 views
1

私はテキスト文字列をテキスト(ログ)ファイルの最後に付加する低レベルのロガー関数を書いています。必要なのは、この関数は、DllMainハンドラから呼び出されたときなど、プロセスでまだ使用できない可能性のあるDLLからすべてのWinAPIをで呼び出すべきではないということです。つまり、ユーザーモードプロセスにロードされることが保証されているライブラリ以外のライブラリ、つまりkernel32.dllまたはntdll.dllを使用することはできません。kernel32.dllやntdll.dllのような低レベルライブラリのwsprintf()型関数はありますか?

私はkernel32.dllからのすべてであることなど、HeapFreeHeapAllocCloseHandle、ちょうどCreateFileWriteFileで非常にうまくにより取得することができました。

問題は、出力文字列の書式設定です。たとえば、現時点、プロセスID、セッション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が利用可能な場合は、誰でも知っていますか?

+1

* sprintfとswprintfを* ntdll *からエクスポートしました。あなたは自由にそれを使うことができます。唯一の制限 - それは浮動小数点形式をサポートしていません – RbMm

+0

@RbMm:うーん、興味深いのは、それらがCRT機能だと思った。あなたはどこからそれを取るのですか?また、私がfloat形式を使用するとどうなりますか? – c00000fd

+0

ntdllは '%f'や'%g'を使うならば、この2だけでなく、 '_snprintf'、' _snwprintf'、 '_vsnprintf'、' _vsnwprintf'などほとんどの文字列フォーマット関数をサポートしています。処理してください – RbMm

答えて

2

NTDLL.DLL支援方法最低次(XP)から文字列整形関数のすべてのバージョン:CRTから

_snprintf 
_snwprintf 
_vsnprintf 
_vsnwprintf 
sprintf 
swprintf 
vsprintf 

もちろん完全マッチ同じ機能のシグネチャ。私たちはこのapiを自由に使うことができます。新しいバージョンのntdllは新しいフォーマットの文字列apiを追加します。次のようにしてwin95(とすべての最新バージョン)の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 
+0

OK。知っておいてよかった。ありがとう。しかし1つの質問ですが、CRTの代わりに 'ntdll.dll'の関数にどのようにリンクさせるのですか?それらのほとんどは同じ名前です。 – c00000fd

+0

@ c00000fd - 最初のlib順序で重要です。いくつかの関数が複数のlibで見つかる可能性がある場合 - 最初に順番にlibを使います。 crtライブラリの前に 'ntdll.lib'を使う必要があります。しかし、非常に可能なのは、crt libsとntdll(これはあなたが使用するcrt libに依存します)との間にいくつかの矛盾があります。私はcrtを使用しないので、私はこの問題はありません。 ntdllとcrt libsの間に深刻な競合がある場合は、実行時に最低限このprocsのアドレスを取得することができます – RbMm

+0

注:NTDLLのプリント機能は浮動小数点数/倍精度をサポートしていません。 – Anders

関連する問題