Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

231 lines
5.5 KiB

// DbgPrint - does debug prints to Out_Debug_String. This allows messages to be
// printed when using SOFT-ICE/W to debug VxDs.
//
// File courtesy Hans Hurvig.
//
void DbgPrint(char *afmt, ...);
#include <basedef.h>
#include <vmm.h>
#include <stdarg.h>
#define DBGPRINT_BUFFER_SIZE 1024
UCHAR DbgBuf [DBGPRINT_BUFFER_SIZE+1];
PUCHAR pDbgBuf = DbgBuf;
PUCHAR pDbgBufEnd = DbgBuf+DBGPRINT_BUFFER_SIZE;
UCHAR DbgHexChars[] = "0123456789ABCDEF";
#ifdef DBCS_SUPPORT
UCHAR DbgLeadByte=0; // Nonzero lead byte if in the middle of outputting a DBCS char
#endif
_inline void DbgFlush(void)
{
if (pDbgBuf != DbgBuf) {
*pDbgBuf = 0;
VMM_Out_Debug_String ( pDbgBuf = DbgBuf );
}
}
_inline void DbgPutcLiteral(UCHAR c)
{
if (pDbgBuf >= pDbgBufEnd) {
DbgFlush();
}
*(pDbgBuf++) = c;
}
_inline void DbcPutHexByteLiteral(UCHAR c)
{
DbgPutcLiteral(DbgHexChars[c >> 4]);
DbgPutcLiteral(DbgHexChars[c & 0x0F]);
}
void _fastcall DbgPutc(UCHAR c)
{
#ifdef DBCS_SUPPORT
if (DbgLeadByte != 0) {
UCHAR c1 = DbgLeadByte;
DbgLeadByte = 0;
DbgPutcLiteral('<');
DbcPutHexByteLiteral(c1);
DbcPutHexByteLiteral(c);
DbgPutcLiteral('>');
} else if (c == '\0') {
DbgPutcLiteral('<');
DbcPutHexByteLiteral('N');
DbcPutHexByteLiteral('U');
DbcPutHexByteLiteral('L');
DbgPutcLiteral('>');
} else if (IsDBCSLeadByte(c)) {
DbgLeadByte = c;
} else
#endif
if (c == '\n') {
DbgPutcLiteral('\r');
DbgPutcLiteral('\n');
} else if (c >= 0x7f || c < ' ') {
DbgPutcLiteral('<');
DbcPutHexByteLiteral(c);
DbgPutcLiteral('>');
} else {
DbgPutcLiteral(c);
}
}
void
putl(unsigned long ul, unsigned short base, short mindig, UCHAR pad)
{
static UCHAR buf[12];
register UCHAR *cp = buf;
buf[0] = 0;
do {
--mindig;
*++cp = DbgHexChars[ul % base];
} while ((ul /= base) != 0);
for ( ; mindig > 0 ; --mindig)
DbgPutc(pad);
do {
DbgPutc(*cp);
} while (*--cp);
}
void DbgPrint(char *afmt, ...)
{
register int c;
PUCHAR psz;
unsigned short base;
/** va_list list; **/
PUCHAR list;
PUCHAR oldfmt;
register UCHAR *fmt = afmt;
va_start(list, afmt);
for (; (c = *fmt) != 0 ; ++fmt) {
oldfmt = fmt;
if (c != '%') {
DbgPutc((UCHAR)c);
#ifdef DBCS_SUPPORT
if (IsDBCSLeadByte(c)) {
c = *(++fmt);
if (c == '\0')
goto endloop;
DbgPutc((UCHAR)c);
}
#endif
} else {
char fLong = 0;
char fFar = 0;
unsigned short minchr = 0, maxchr = 0xffff;
char fLJ = 0;
char pad = ' ';
base = 10;
if (fmt[1] == '-') {
fLJ++;
fmt++;
}
if (fmt[1] == '0')
pad = '0';
while ((c = *++fmt) >= '0' && c <= '9')
minchr = minchr*10 + c - '0';
if (c == '.') {
maxchr = 0;
while ((c = *++fmt) >= '0' && c <= '9')
maxchr = maxchr*10 + c - '0';
}
if (c == 'l') {
fLong = 1;
c = *++fmt;
}
if (c == 'F') {
fFar = 1;
c = *++fmt;
}
switch (c) {
case 'c':
DbgPutc((char) va_arg(list, int));
break;
case 'p':
case 'P':
if (fLong) {
DbgFlush();
if (fFar)
VMM_Out_Debug_Data_Label( va_arg(list, void *) );
else
VMM_Out_Debug_Code_Label( va_arg(list, void *) );
break;
}
// not a "long" pointer; treat like 'X'
case 'x':
case 'X':
base = 16;
case 'd':
putl(va_arg(list, unsigned long), base, minchr, pad);
break;
case 's':
psz = va_arg(list, char *);
{
unsigned sln;
unsigned i;
if (!fLong)
sln = strlen(psz);
else {
sln = *(unsigned char *)psz; // Treat "l" attrib on string as PSTRING
psz++;
}
if (maxchr) {
if (sln > maxchr)
sln = maxchr;
}
if (minchr && !fLJ) {
while (minchr-- > sln)
DbgPutc(' ');
}
for (i=0;i<sln;i++)
DbgPutc(*psz++);
while (i++ < minchr)
DbgPutc(' ');
}
break;
case '%':
DbgPutc('%');
break;
default:
DbgPutc('%');
fmt = oldfmt;
break;
}
}
}
endloop:
va_end(list);
DbgFlush();
}