DbgPrint

DbgPrintで何か出すときに
#define MyKdPrint(msg) DbgPrint("header"); DbgPrint msg;
みたいなのを使うと、DbgViewで見たときに二行になってしまう。
バッファに一度ためてから出力すればOKで、こんな感じ。

#if DBG
#define DBG_MSG_HEADER "[MyKernelModule] "
#define DBG_MSG_HEADER_LEN (sizeof(DBG_MSG_HEADER)-1)
#define MyKdPrint(msg) my_kd_print msg
void my_kd_print(const char *message, ...)
{
UCHAR buffer[4080];
RtlCopyMemory( buffer, DBG_MSG_HEADER, sizeof(DBG_MSG_HEADER) );
RtlStringCbVPrintfA( buffer + DBG_MSG_HEADER_LEN, sizeof(buffer) - DBG_MSG_HEADER_LEN, message, (va_list)(&message + 1) );
DbgPrint(buffer);
}
#else
#define MyKdPrint(msg)
#endif
これを試していて、4080バイトを超えると_chkstk()への呼び出しが発生することが判明。ビルドするとntoskrnl.exeへの参照が入っているのだが、実行できない。おそらくretail版のOSには入ってないのではないかと思われる。