|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: debug.c
//
//--------------------------------------------------------------------------
#include "pch.h"
// Diagnostic globals - used during development
ULONG d1; ULONG d2; ULONG d3; ULONG d4; ULONG d5; ULONG d6; ULONG d7; ULONG d8; ULONG d9;
// Debug globals
ULONG Trace; ULONG Break; ULONG AllowAsserts = 0;
//
// set bits using PPT_DD_* bit defs to mask off debug spew for a specific device
//
ULONG DbgMaskFdo = 0; ULONG DbgMaskRawPort = 0; ULONG DbgMaskDaisyChain0 = 0; ULONG DbgMaskDaisyChain1 = 0; ULONG DbgMaskEndOfChain = 0; ULONG DbgMaskLegacyZip = 0; ULONG DbgMaskNoDevice = 0;
PCHAR PnpIrpName[] = { "0x00 - IRP_MN_START_DEVICE", "0x01 - IRP_MN_QUERY_REMOVE_DEVICE", "0x02 - IRP_MN_REMOVE_DEVICE", "0x03 - IRP_MN_CANCEL_REMOVE_DEVICE", "0x04 - IRP_MN_STOP_DEVICE", "0x05 - IRP_MN_QUERY_STOP_DEVICE", "0x06 - IRP_MN_CANCEL_STOP_DEVICE", "0x07 - IRP_MN_QUERY_DEVICE_RELATIONS", "0x08 - IRP_MN_QUERY_INTERFACE", "0x09 - IRP_MN_QUERY_CAPABILITIES", "0x0A - IRP_MN_QUERY_RESOURCES", "0x0B - IRP_MN_QUERY_RESOURCE_REQUIREMENTS", "0x0C - IRP_MN_QUERY_DEVICE_TEXT", "0x0D - IRP_MN_FILTER_RESOURCE_REQUIREMENTS", "0x0E - unused Pnp MinorFunction", "0x0F - IRP_MN_READ_CONFIG", "0x10 - IRP_MN_WRITE_CONFIG", "0x11 - IRP_MN_EJECT", "0x12 - IRP_MN_SET_LOCK", "0x13 - IRP_MN_QUERY_ID", "0x14 - IRP_MN_QUERY_PNP_DEVICE_STATE", "0x15 - IRP_MN_QUERY_BUS_INFORMATION", "0x16 - IRP_MN_DEVICE_USAGE_NOTIFICATION", "0x17 - IRP_MN_SURPRISE_REMOVAL", "0x18 - IRP_MN_QUERY_LEGACY_BUS_INFORMATION" };
PCHAR PhaseName[] = { "PHASE_UNKNOWN", "PHASE_NEGOTIATION", "PHASE_SETUP", // Used in ECP mode only
"PHASE_FORWARD_IDLE", "PHASE_FORWARD_XFER", "PHASE_FWD_TO_REV", "PHASE_REVERSE_IDLE", "PHASE_REVERSE_XFER", "PHASE_REV_TO_FWD", "PHASE_TERMINATE", "PHASE_DATA_AVAILABLE", // Used in nibble and byte modes only
"PHASE_DATA_NOT_AVAIL", // Used in nibble and byte modes only
"PHASE_INTERRUPT_HOST" // Used in nibble and byte modes only
};
#if 1 == DBG_SHOW_BYTES
ULONG DbgShowBytes = 1; // turn off via reg setting: Services\Parport\Parameters\DbgShowBytes : REG_DWORD : 0x0
#endif
#if 1 == PptEnableDebugSpew
VOID P5TraceIrpArrival( PDEVICE_OBJECT DevObj, PIRP Irp ) { PCOMMON_EXTENSION cdx = DevObj->DeviceExtension; DD(cdx,DDE,"Irp arrival %x\n",Irp); }
VOID P5TraceIrpCompletion( PIRP Irp ) { //PCOMMON_EXTENSION cdx = DevObj->DeviceExtension;
DD(NULL,DDE,"Irp completion %x\n",Irp); }
VOID P5SetPhase( PPDO_EXTENSION Pdx, P1284_PHASE Phase ) { LARGE_INTEGER tickCount; KeQueryTickCount( &tickCount ); if( Pdx->CurrentPhase != Phase ) { Pdx->CurrentPhase = Phase; PptAssert(Phase < arraysize(PhaseName)); DD((PCE)Pdx,DDT,"P5SetPhase at %I64x to %2d - %s\n",tickCount,Phase,PhaseName[Phase]); } }
VOID P5BSetPhase( PIEEE_STATE IeeeState, P1284_PHASE Phase ) { LARGE_INTEGER tickCount; KeQueryTickCount( &tickCount ); if( IeeeState->CurrentPhase != Phase ) { IeeeState->CurrentPhase = Phase; PptAssert(Phase < arraysize(PhaseName)); DD(NULL,DDT,"P5BSetPhase at %I64x to %2d - %s\n",tickCount,Phase,PhaseName[Phase]); } }
#include "stdarg.h"
VOID PptPrint( PCOMMON_EXTENSION Ext, ULONG Flags, PCHAR FmtStr, ... ) { CHAR buf[ 256 ]; LONG count; va_list va; const LONG bufSize = sizeof(buf); const LONG maxLocationLength = sizeof("LPTx.y: "); ULONG trace; ULONG mask; PPDO_EXTENSION pdx; PCHAR location;
PptAssertMsg( "0 == Flags", Flags ); PptAssertMsg( "NULL FmtStr", FmtStr );
if( Ext ) {
location = Ext->Location;
if( (NULL == location) || ('\0' == *location) ) { location = "NoLoc"; }
switch( Ext->DevType ) { case DevTypeFdo: mask = DbgMaskFdo; break; case DevTypePdo: pdx = (PPDO_EXTENSION)Ext; switch( pdx->PdoType ) { case PdoTypeRawPort: mask = DbgMaskRawPort; break; case PdoTypeEndOfChain: mask = DbgMaskEndOfChain; break; case PdoTypeDaisyChain: switch( pdx->Ieee1284_3DeviceId ) { case 0: mask = DbgMaskDaisyChain0; break; case 1: mask = DbgMaskDaisyChain1; break; default: mask = 0; PptAssert(FALSE); } break; case PdoTypeLegacyZip: mask = DbgMaskLegacyZip; break; default: // PptAssertMsg( "Invalid PdoType", FALSE );
mask = 0; } break; default: // PptAssert(FALSE);
mask = 0; }
} else {
// not device specific
location = "LPTx"; mask = DbgMaskNoDevice;
}
trace = Flags & Trace & ~mask;
if( trace != 0 ) {
va_start( va, FmtStr ); __try { count = _snprintf( buf, maxLocationLength, "%-6s: ", location ); if( count < 0 ) { __leave; } count += _vsnprintf( buf+count, bufSize-count-1, FmtStr, va ); if( count >= bufSize ) { __leave; } DbgPrint( "%s", buf );
} __finally { va_end( va ); }
} // endif ( trace != 0 )
return; }
UCHAR P5ReadPortUchar( PUCHAR Port ) { UCHAR value; value = READ_PORT_UCHAR( Port ); if( d1 ) { DbgPrint("zzz - READ_ PORT_UCHAR %x %02x\n",Port,value); } return value; }
VOID P5ReadPortBufferUchar( PUCHAR Port, PUCHAR Buffer, ULONG Count ) { READ_PORT_BUFFER_UCHAR( Port, Buffer, Count ); return; }
VOID P5WritePortUchar( PUCHAR Port, UCHAR Value ) { if( d1 ) { DbgPrint("zzz - WRITE_PORT_UCHAR %x %02x\n",Port,Value); }
WRITE_PORT_UCHAR( Port, Value ); return; }
VOID P5WritePortBufferUchar( PUCHAR Port, PUCHAR Buffer, ULONG Count ) { WRITE_PORT_BUFFER_UCHAR( Port, Buffer, Count ); return; }
VOID PptFdoDumpPnpIrpInfo( PDEVICE_OBJECT Fdo, PIRP Irp ) { PFDO_EXTENSION fdx = Fdo->DeviceExtension; PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp ); ULONG minorFunction = irpSp->MinorFunction;
PptAssert( DevTypeFdo == fdx->DevType );
if( minorFunction < arraysize(PnpIrpName) ) { DD((PCE)fdx,DDT,"PptFdoDumpPnpIrpInfo - %s\n",PnpIrpName[ minorFunction ]); } else { DD((PCE)fdx,DDT,"PptFdoDumpPnpIrpInfo - bogus MinorFunction = %x\n",minorFunction); } }
VOID PptPdoDumpPnpIrpInfo( PDEVICE_OBJECT Pdo, PIRP Irp ) { PPDO_EXTENSION pdx = Pdo->DeviceExtension; PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp ); ULONG minorFunction = irpSp->MinorFunction;
PptAssert( DevTypePdo == pdx->DevType );
if( minorFunction < arraysize(PnpIrpName) ) { DD((PCE)pdx,DDT,"PptPdoDumpPnpIrpInfo - %s\n",PnpIrpName[ minorFunction ]); } else { DD((PCE)pdx,DDT,"PptPdoDumpPnpIrpInfo - bogus MinorFunction = %x\n",minorFunction); } }
NTSTATUS PptAcquireRemoveLock( IN PIO_REMOVE_LOCK RemoveLock, IN PVOID Tag OPTIONAL ) { return IoAcquireRemoveLock(RemoveLock, Tag); }
VOID PptReleaseRemoveLock( IN PIO_REMOVE_LOCK RemoveLock, IN PVOID Tag OPTIONAL ) { IoReleaseRemoveLock(RemoveLock, Tag); }
VOID PptReleaseRemoveLockAndWait( IN PIO_REMOVE_LOCK RemoveLock, IN PVOID Tag ) { IoReleaseRemoveLockAndWait(RemoveLock, Tag); } #endif // 1 == PptEnableDebugSpew
#if (1 == DVRH_PAR_LOGFILE)
#include "stdarg.h"
/**************************************************************************
Function: DVRH_LogMessage() Description:Logs message to configured output Inputs: Parameter indicated message log level and Format string and parameters Outputs: Boolean value indicating success or failure ***************************************************************************/ BOOLEAN DVRH_LogMessage(PCHAR szFormat, ...) { ULONG Length; char messagebuf[256]; va_list va; IO_STATUS_BLOCK IoStatus; OBJECT_ATTRIBUTES objectAttributes; NTSTATUS status; HANDLE FileHandle; UNICODE_STRING fileName; //format the string
va_start(va,szFormat); _vsnprintf(messagebuf,sizeof(messagebuf),szFormat,va); va_end(va); //get a handle to the log file object
fileName.Buffer = NULL; fileName.Length = 0; fileName.MaximumLength = sizeof(DEFAULT_LOG_FILE_NAME) + sizeof(UNICODE_NULL); fileName.Buffer = ExAllocatePool(PagedPool, fileName.MaximumLength); if (!fileName.Buffer) { DD(NULL,DDE,"LogMessage: FAIL. ExAllocatePool Failed.\n"); return FALSE; } RtlZeroMemory(fileName.Buffer, fileName.MaximumLength); status = RtlAppendUnicodeToString(&fileName, (PWSTR)DEFAULT_LOG_FILE_NAME); InitializeObjectAttributes (&objectAttributes, (PUNICODE_STRING)&fileName, OBJ_CASE_INSENSITIVE, NULL, NULL ); status = ZwCreateFile( &FileHandle, FILE_APPEND_DATA, &objectAttributes, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); if( NT_SUCCESS(status) ) { CHAR buf[300]; LARGE_INTEGER time; KeQuerySystemTime(&time); //put a time stamp on the output message
sprintf(buf,"%10u-%10u %s",time.HighPart,time.LowPart,messagebuf); //format the string to make sure it appends a newline carrage-return to the
//end of the string.
Length=strlen(buf); if( buf[Length-1]=='\n' ) { buf[Length-1]='\r'; strcat(buf,"\n"); Length++; } else { strcat(buf,"\r\n"); Length+=2; } ZwWriteFile( FileHandle, NULL, NULL, NULL, &IoStatus, buf, Length, NULL, NULL ); ZwClose( FileHandle ); }
if( fileName.Buffer ) { ExFreePool (fileName.Buffer); }
return STATUS_SUCCESS; }
/**************************************************************************
Function: DVRH_LogByteData() Description:Formats byte data to be displayed in the configured output Inputs: Log level, Whether this is input or output data, a pointer to the byte data buffer and the size of the buffer Outputs: Boolean indicated success or failure ***************************************************************************/ BOOLEAN DVRH_LogByteData(BOOLEAN READ,PCHAR szBuff,ULONG dwTransferred) { CString cStr; ULONG MAX_SIZE=80; UNICODE_STRING UniStr; ANSI_STRING AnsiStr; WCHAR wStr[8]; PCHAR szTemp=szBuff; UCHAR bTemp; ULONG dwDisplaySize;
UniStr.Length=0; UniStr.MaximumLength=8; UniStr.Buffer=wStr; AnsiStr.Length=0; AnsiStr.MaximumLength=0; AnsiStr.Buffer=NULL;
if(READ) cStr=L"<RCV"; else cStr=L"SND>";
//make sure the size of the requested string is within the set range
dwDisplaySize=(((dwTransferred*3)+10) > MAX_SIZE)?((MAX_SIZE-10)/3):dwTransferred;
//format byte data
while(dwDisplaySize) { bTemp=szTemp[0]; if(bTemp > 0xF) cStr+=L" "; else cStr+=L" 0";
RtlIntegerToUnicodeString(bTemp,16,&UniStr); cStr+=UniStr.Buffer;
szTemp++; dwDisplaySize--; }
cStr.StringToAnsiString(&AnsiStr); LogMessage("%5u %s",dwTransferred,AnsiStr.Buffer); RtlFreeAnsiString(&AnsiStr);
return (TRUE); } #endif // (1 == DVRH_PAR_LOGFILE)
|