505 lines
18 KiB
C
505 lines
18 KiB
C
//+-------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
//
|
||
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
//
|
||
// File: debug.c
|
||
//
|
||
//--------------------------------------------------------------------------
|
||
|
||
//
|
||
// This file contains functions that are only used for debugging the ParClass driver.
|
||
//
|
||
|
||
#include "pch.h"
|
||
#if (1 == DVRH_PAR_LOGFILE)
|
||
#include "stdarg.h"
|
||
#include "stdio.h"
|
||
#endif
|
||
|
||
static STRUCTUREOFFSETSTABLE gsotDEVICE_EXTENSION [] = {
|
||
{"ExtensionSignature", FIELD_OFFSET(DEVICE_EXTENSION, ExtensionSignature)},
|
||
{"DeviceType", FIELD_OFFSET(DEVICE_EXTENSION, DeviceType)},
|
||
{"DeviceStateFlags", FIELD_OFFSET(DEVICE_EXTENSION, DeviceStateFlags)},
|
||
{"Ieee1284_3DeviceId", FIELD_OFFSET(DEVICE_EXTENSION, Ieee1284_3DeviceId)},
|
||
{"IsPdo", FIELD_OFFSET(DEVICE_EXTENSION, IsPdo)},
|
||
{"EndOfChain", FIELD_OFFSET(DEVICE_EXTENSION, EndOfChain)},
|
||
{"PodoRegForWMI", FIELD_OFFSET(DEVICE_EXTENSION, PodoRegForWMI)},
|
||
{"ParClassFdo", FIELD_OFFSET(DEVICE_EXTENSION, ParClassFdo)},
|
||
{"ParClassPdo", FIELD_OFFSET(DEVICE_EXTENSION, ParClassPdo)},
|
||
{"Next", FIELD_OFFSET(DEVICE_EXTENSION, Next)},
|
||
{"DeviceObject", FIELD_OFFSET(DEVICE_EXTENSION, DeviceObject)},
|
||
{"PortDeviceObject", FIELD_OFFSET(DEVICE_EXTENSION, PortDeviceObject)},
|
||
{"PortDeviceFileObject", FIELD_OFFSET(DEVICE_EXTENSION, PortDeviceFileObject)},
|
||
{"PortSymbolicLinkName", FIELD_OFFSET(DEVICE_EXTENSION, PortSymbolicLinkName)},
|
||
{"PhysicalDeviceObject", FIELD_OFFSET(DEVICE_EXTENSION, PhysicalDeviceObject)},
|
||
{"ParentDeviceObject", FIELD_OFFSET(DEVICE_EXTENSION, ParentDeviceObject)},
|
||
{"CurrentOpIrp", FIELD_OFFSET(DEVICE_EXTENSION, CurrentOpIrp)},
|
||
{"NotificationHandle", FIELD_OFFSET(DEVICE_EXTENSION, NotificationHandle)},
|
||
{"ClassName", FIELD_OFFSET(DEVICE_EXTENSION, ClassName)},
|
||
{"SymbolicLinkName", FIELD_OFFSET(DEVICE_EXTENSION, SymbolicLinkName)},
|
||
{"TimerStart", FIELD_OFFSET(DEVICE_EXTENSION, TimerStart)},
|
||
{"CreatedSymbolicLink", FIELD_OFFSET(DEVICE_EXTENSION, CreatedSymbolicLink)},
|
||
{"UsePIWriteLoop", FIELD_OFFSET(DEVICE_EXTENSION, UsePIWriteLoop)},
|
||
{"Initialized", FIELD_OFFSET(DEVICE_EXTENSION, Initialized)},
|
||
{"Initializing", FIELD_OFFSET(DEVICE_EXTENSION, Initializing)},
|
||
{"OpenCloseRefCount", FIELD_OFFSET(DEVICE_EXTENSION, OpenCloseRefCount)},
|
||
{"ParPortDeviceGone", FIELD_OFFSET(DEVICE_EXTENSION, ParPortDeviceGone)},
|
||
{"RegForPptRemovalRelations", FIELD_OFFSET(DEVICE_EXTENSION, RegForPptRemovalRelations)},
|
||
{"spare1", FIELD_OFFSET(DEVICE_EXTENSION, spare1)},
|
||
{"IdxForwardProtocol", FIELD_OFFSET(DEVICE_EXTENSION, IdxForwardProtocol)},
|
||
{"IdxReverseProtocol", FIELD_OFFSET(DEVICE_EXTENSION, IdxReverseProtocol)},
|
||
{"CurrentEvent", FIELD_OFFSET(DEVICE_EXTENSION, CurrentEvent)},
|
||
{"CurrentPhase", FIELD_OFFSET(DEVICE_EXTENSION, CurrentPhase)},
|
||
{"PortHWMode", FIELD_OFFSET(DEVICE_EXTENSION, PortHWMode)},
|
||
{"OpenCloseMutex", FIELD_OFFSET(DEVICE_EXTENSION, OpenCloseMutex)},
|
||
{"DevObjListMutex", FIELD_OFFSET(DEVICE_EXTENSION, DevObjListMutex)},
|
||
{"WorkQueue", FIELD_OFFSET(DEVICE_EXTENSION, WorkQueue)},
|
||
{"ThreadObjectPointer", FIELD_OFFSET(DEVICE_EXTENSION, ThreadObjectPointer)},
|
||
{"RequestSemaphore", FIELD_OFFSET(DEVICE_EXTENSION, RequestSemaphore)},
|
||
{"OriginalController", FIELD_OFFSET(DEVICE_EXTENSION, OriginalController)},
|
||
{"Controller", FIELD_OFFSET(DEVICE_EXTENSION, Controller)},
|
||
{"EcrController", FIELD_OFFSET(DEVICE_EXTENSION, EcrController)},
|
||
{"SpanOfController", FIELD_OFFSET(DEVICE_EXTENSION, SpanOfController)},
|
||
{"TryAllocatePort", FIELD_OFFSET(DEVICE_EXTENSION, TryAllocatePort)},
|
||
{"FreePort", FIELD_OFFSET(DEVICE_EXTENSION, FreePort)},
|
||
{"QueryNumWaiters", FIELD_OFFSET(DEVICE_EXTENSION, QueryNumWaiters)},
|
||
{"PortContext", FIELD_OFFSET(DEVICE_EXTENSION, PortContext)},
|
||
{"HardwareCapabilities", FIELD_OFFSET(DEVICE_EXTENSION, HardwareCapabilities)},
|
||
{"TrySetChipMode", FIELD_OFFSET(DEVICE_EXTENSION, TrySetChipMode)},
|
||
{"ClearChipMode", FIELD_OFFSET(DEVICE_EXTENSION, ClearChipMode)},
|
||
{"TrySelectDevice", FIELD_OFFSET(DEVICE_EXTENSION, TrySelectDevice)},
|
||
{"DeselectDevice", FIELD_OFFSET(DEVICE_EXTENSION, DeselectDevice)},
|
||
{"FifoDepth", FIELD_OFFSET(DEVICE_EXTENSION, FifoDepth)},
|
||
{"FifoWidth", FIELD_OFFSET(DEVICE_EXTENSION, FifoWidth)},
|
||
{"bAllocated", FIELD_OFFSET(DEVICE_EXTENSION, bAllocated)},
|
||
{"BusyDelay", FIELD_OFFSET(DEVICE_EXTENSION, BusyDelay)},
|
||
{"BusyDelayDetermined", FIELD_OFFSET(DEVICE_EXTENSION, BusyDelayDetermined)},
|
||
{"DeferredWorkItem", FIELD_OFFSET(DEVICE_EXTENSION, DeferredWorkItem)},
|
||
{"TimeToTerminateThread", FIELD_OFFSET(DEVICE_EXTENSION, TimeToTerminateThread)},
|
||
{"UseNT35Priority", FIELD_OFFSET(DEVICE_EXTENSION, UseNT35Priority)},
|
||
{"InitializationTimeout", FIELD_OFFSET(DEVICE_EXTENSION, InitializationTimeout)},
|
||
{"AbsoluteOneSecond", FIELD_OFFSET(DEVICE_EXTENSION, AbsoluteOneSecond)},
|
||
{"OneSecond", FIELD_OFFSET(DEVICE_EXTENSION, OneSecond)},
|
||
{"Connected", FIELD_OFFSET(DEVICE_EXTENSION, Connected)},
|
||
{"AllocatedByLockPort", FIELD_OFFSET(DEVICE_EXTENSION, AllocatedByLockPort)},
|
||
{"spare4", FIELD_OFFSET(DEVICE_EXTENSION, spare4)},
|
||
{"fnRead", FIELD_OFFSET(DEVICE_EXTENSION, fnRead)},
|
||
{"fnWrite", FIELD_OFFSET(DEVICE_EXTENSION, fnWrite)},
|
||
{"IdleTimeout", FIELD_OFFSET(DEVICE_EXTENSION, IdleTimeout)},
|
||
{"ProtocolData", FIELD_OFFSET(DEVICE_EXTENSION, ProtocolData)},
|
||
{"ForwardInterfaceAddress", FIELD_OFFSET(DEVICE_EXTENSION, ForwardInterfaceAddress)},
|
||
{"ReverseInterfaceAddress", FIELD_OFFSET(DEVICE_EXTENSION, ReverseInterfaceAddress)},
|
||
{"SetForwardAddress", FIELD_OFFSET(DEVICE_EXTENSION, SetForwardAddress)},
|
||
{"SetReverseAddress", FIELD_OFFSET(DEVICE_EXTENSION, SetReverseAddress)},
|
||
{"LockPortMutex", FIELD_OFFSET(DEVICE_EXTENSION, LockPortMutex)},
|
||
{"DeviceState", FIELD_OFFSET(DEVICE_EXTENSION, DeviceState)},
|
||
{"SystemState", FIELD_OFFSET(DEVICE_EXTENSION, SystemState)},
|
||
{"spare2", FIELD_OFFSET(DEVICE_EXTENSION, spare2)},
|
||
{"bShadowBuffer", FIELD_OFFSET(DEVICE_EXTENSION, bShadowBuffer)},
|
||
{"ShadowBuffer", FIELD_OFFSET(DEVICE_EXTENSION, ShadowBuffer)},
|
||
{"spare3", FIELD_OFFSET(DEVICE_EXTENSION, spare3)},
|
||
{"bSynchWrites", FIELD_OFFSET(DEVICE_EXTENSION, bSynchWrites)},
|
||
{"bFirstByteTimeout", FIELD_OFFSET(DEVICE_EXTENSION, bFirstByteTimeout)},
|
||
{"bIsHostRecoverSupported", FIELD_OFFSET(DEVICE_EXTENSION, bIsHostRecoverSupported)},
|
||
{"PauseEvent", FIELD_OFFSET(DEVICE_EXTENSION, PauseEvent)},
|
||
{"ProtocolModesSupported", FIELD_OFFSET(DEVICE_EXTENSION, ProtocolModesSupported)},
|
||
{"BadProtocolModes", FIELD_OFFSET(DEVICE_EXTENSION, BadProtocolModes)},
|
||
{"ModeSafety", FIELD_OFFSET(DEVICE_EXTENSION, ModeSafety)},
|
||
{"IsIeeeTerminateOk", FIELD_OFFSET(DEVICE_EXTENSION, IsIeeeTerminateOk)},
|
||
{"IsCritical", FIELD_OFFSET(DEVICE_EXTENSION, IsCritical)},
|
||
{"P12843DL", FIELD_OFFSET(DEVICE_EXTENSION, P12843DL)},
|
||
{"log", FIELD_OFFSET(DEVICE_EXTENSION, log)},
|
||
{"WmiLibContext", FIELD_OFFSET(DEVICE_EXTENSION, WmiLibContext)},
|
||
{"WmiRegistrationCount", FIELD_OFFSET(DEVICE_EXTENSION, WmiRegistrationCount)},
|
||
{"DeviceIdString", FIELD_OFFSET(DEVICE_EXTENSION, DeviceIdString)},
|
||
{"DeviceDescription", FIELD_OFFSET(DEVICE_EXTENSION, DeviceDescription)},
|
||
{"dummy", FIELD_OFFSET(DEVICE_EXTENSION, dummy)},
|
||
{"RemoveLock", FIELD_OFFSET(DEVICE_EXTENSION, RemoveLock)},
|
||
{"HwProfileChangeNotificationHandle", FIELD_OFFSET(DEVICE_EXTENSION, HwProfileChangeNotificationHandle)},
|
||
{"ExtensionSignatureEnd", FIELD_OFFSET(DEVICE_EXTENSION, ExtensionSignatureEnd)},
|
||
{NULL, sizeof(DEVICE_EXTENSION)}
|
||
};
|
||
|
||
#if DBG
|
||
#if (1 == DVRH_PAR_LOGFILE)
|
||
/**************************************************************************
|
||
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);
|
||
vsprintf(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)
|
||
{
|
||
ParDump2(PARERRORS, ("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
|
||
***************************************************************************/
|
||
#if 0
|
||
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
|
||
#endif // (1 == DVRH_PAR_LOGFILE)
|
||
|
||
VOID
|
||
ParInitDebugLevel (
|
||
IN PUNICODE_STRING RegistryPath
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Checked Build Only!
|
||
|
||
Initialize debugging variables from registry; set to default values
|
||
if anything fails.
|
||
|
||
Arguments:
|
||
|
||
RegistryPath - Root path in registry where we should look
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
RTL_QUERY_REGISTRY_TABLE paramTable[4];
|
||
PWSTR path;
|
||
ULONG defaultDebugLevel = PARDUMP_SILENT;
|
||
ULONG defaultBreakOn = PAR_BREAK_ON_NOTHING;
|
||
ULONG defaultUseAsserts = 0; // don't use asserts
|
||
|
||
|
||
//
|
||
// We were given a counted string, but we need a null terminated string
|
||
//
|
||
path = ExAllocatePool(PagedPool, RegistryPath->Length+sizeof(WCHAR));
|
||
|
||
if (!path) {
|
||
// can't get a buffer, use defaults and return
|
||
ParDebugLevel = defaultDebugLevel;
|
||
ParBreakOn = defaultBreakOn;
|
||
ParUseAsserts = defaultUseAsserts;
|
||
return;
|
||
}
|
||
|
||
RtlMoveMemory(path, RegistryPath->Buffer, RegistryPath->Length);
|
||
path[ (RegistryPath->Length) / 2 ] = UNICODE_NULL;
|
||
|
||
|
||
//
|
||
// set up table entries for call to RtlQueryRegistryValues
|
||
//
|
||
RtlZeroMemory(¶mTable[0], sizeof(paramTable));
|
||
|
||
paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
paramTable[0].Name = (PWSTR)L"ParDebugLevel";
|
||
paramTable[0].EntryContext = &ParDebugLevel;
|
||
paramTable[0].DefaultType = REG_DWORD;
|
||
paramTable[0].DefaultData = &defaultDebugLevel;
|
||
paramTable[0].DefaultLength = sizeof(ULONG);
|
||
|
||
paramTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
paramTable[1].Name = (PWSTR)L"ParBreakOn";
|
||
paramTable[1].EntryContext = &ParBreakOn;
|
||
paramTable[1].DefaultType = REG_DWORD;
|
||
paramTable[1].DefaultData = &defaultBreakOn;
|
||
paramTable[1].DefaultLength = sizeof(ULONG);
|
||
|
||
paramTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
|
||
paramTable[2].Name = (PWSTR)L"ParUseAsserts";
|
||
paramTable[2].EntryContext = &defaultUseAsserts;
|
||
paramTable[2].DefaultType = REG_DWORD;
|
||
paramTable[2].DefaultData = &defaultBreakOn;
|
||
paramTable[2].DefaultLength = sizeof(ULONG);
|
||
|
||
//
|
||
// leave paramTable[3] as all zeros - this terminates the table
|
||
//
|
||
|
||
Status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
|
||
path,
|
||
¶mTable[0],
|
||
NULL,
|
||
NULL);
|
||
|
||
if (!NT_SUCCESS(Status)) {
|
||
// registry read failed, use defaults
|
||
ParDebugLevel = defaultDebugLevel;
|
||
ParBreakOn = defaultBreakOn;
|
||
ParUseAsserts = defaultUseAsserts;
|
||
}
|
||
|
||
ExFreePool( path );
|
||
|
||
ParDumpV( ("ParDebugLevel = %08x , ParBreakOn = %08x\n", ParDebugLevel, ParBreakOn) );
|
||
|
||
}
|
||
#endif // DBG
|
||
|
||
#if DBG
|
||
VOID
|
||
ParDumpDeviceObjectList(
|
||
PDEVICE_OBJECT ParClassFdo
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is a diagnostic routine that is only
|
||
available in Checked builds
|
||
|
||
Dump the list of ParClass ejected Device Objects
|
||
|
||
Arguments:
|
||
|
||
FdoDeviceObject - The ParClass Function Device Object
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
--*/
|
||
|
||
{
|
||
PDEVICE_EXTENSION FdoExtension = ParClassFdo ->DeviceExtension;
|
||
PDEVICE_OBJECT currentDO = FdoExtension->ParClassPdo;
|
||
|
||
ParDump(PARDUMP_VERBOSE_MAX,
|
||
("PARALLEL: ParDumpDeviceObjectList(...):\n") );
|
||
|
||
while( currentDO ) {
|
||
PDEVICE_EXTENSION currentExt = currentDO->DeviceExtension;
|
||
ParDump(PARDUMP_VERBOSE_MAX,
|
||
("PARALLEL: - %x %wZ %wZ\n",
|
||
currentDO, ¤tExt->ClassName, ¤tExt->SymbolicLinkName) );
|
||
currentDO = ( (PDEVICE_EXTENSION)(currentDO->DeviceExtension) )->Next;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
NTSTATUS
|
||
ParAcquireRemoveLock(
|
||
IN PIO_REMOVE_LOCK RemoveLock,
|
||
IN PVOID Tag OPTIONAL
|
||
)
|
||
{
|
||
NTSTATUS status;
|
||
ParDump2(PARREMLOCK, ("debug::ParAcquireRemoveLock: RemoveLock= %x , Tag= %x\n", RemoveLock, Tag) );
|
||
ParDump2(PARREMLOCK, ("debug::ParAcquireRemoveLock: Count [%x] Removed[%x] - calling IoAcquireRemoveLock\n",
|
||
RemoveLock->Common.IoCount, RemoveLock->Common.Removed));
|
||
status = IoAcquireRemoveLock(RemoveLock, Tag);
|
||
return status;
|
||
}
|
||
|
||
VOID
|
||
ParReleaseRemoveLock(
|
||
IN PIO_REMOVE_LOCK RemoveLock,
|
||
IN PVOID Tag OPTIONAL
|
||
)
|
||
{
|
||
ParDump2(PARREMLOCK, ("debug::ParReleaseRemoveLock: RemoveLock= %x , Tag= %x\n", RemoveLock, Tag) );
|
||
ParDump2(PARREMLOCK, ("debug::ParReleaseRemoveLock: Count [%x] Removed[%x] - calling IoReleaseRemoveLock\n",
|
||
RemoveLock->Common.IoCount, RemoveLock->Common.Removed));
|
||
IoReleaseRemoveLock(RemoveLock, Tag);
|
||
}
|
||
|
||
VOID
|
||
ParReleaseRemoveLockAndWait(
|
||
IN PIO_REMOVE_LOCK RemoveLock,
|
||
IN PVOID Tag
|
||
)
|
||
{
|
||
ParDump2(PARREMLOCK, ("debug::ParReleaseRemoveLockAndWait: RemoveLock= %x , Tag= %x\n", RemoveLock, Tag) );
|
||
ParDump2(PARREMLOCK, ("debug::ParReleaseRemoveLock: Count [%x] Removed[%x] - calling IoReleaseRemoveLockAndWait\n",
|
||
RemoveLock->Common.IoCount, RemoveLock->Common.Removed));
|
||
IoReleaseRemoveLockAndWait(RemoveLock, Tag);
|
||
ParDump2(PARREMLOCK, ("debug::ParReleaseRemoveLock: Count [%x] Removed[%x] - post IoReleaseRemoveLockAndWait\n",
|
||
RemoveLock->Common.IoCount, RemoveLock->Common.Removed));
|
||
}
|
||
|
||
VOID ParDumpDevObjStructList(
|
||
IN PPAR_DEVOBJ_STRUCT DevObjStructHead
|
||
)
|
||
{
|
||
PPAR_DEVOBJ_STRUCT current = DevObjStructHead;
|
||
|
||
if( DevObjStructHead ) {
|
||
ParDump2(PARPNP1, ("debug::ParDumpDevObjStructList - Enter\n") );
|
||
} else {
|
||
ParDump2(PARPNP1, ("debug::ParDumpDevObjStructList - Enter - Empty list - returning\n") );
|
||
return;
|
||
}
|
||
|
||
while( current ) {
|
||
ParDump2(PARPNP1, (" Controller = %x\n", current->Controller) );
|
||
ParDump2(PARPNP1, (" LegacyPodo = %x\n", current->LegacyPodo) );
|
||
ParDump2(PARPNP1, (" EndOfChainPdo = %x\n", current->EndOfChainPdo) );
|
||
ParDump2(PARPNP1, (" Dot3Id0Pdo = %x\n", current->Dot3Id0Pdo) );
|
||
ParDump2(PARPNP1, (" Dot3Id1Pdo = %x\n", current->Dot3Id1Pdo) );
|
||
ParDump2(PARPNP1, (" Dot3Id2Pdo = %x\n", current->Dot3Id2Pdo) );
|
||
ParDump2(PARPNP1, (" Dot3Id3Pdo = %x\n", current->Dot3Id3Pdo) );
|
||
ParDump2(PARPNP1, (" LegacyZipPdo = %x\n", current->LegacyZipPdo) );
|
||
current = current->Next;
|
||
}
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
ParDumpDevExtTable()
|
||
{
|
||
ULONG i = 0;
|
||
|
||
while( gsotDEVICE_EXTENSION[i].pszField ) {
|
||
DbgPrint("%3x - %s\n", gsotDEVICE_EXTENSION[i].dwOffset, gsotDEVICE_EXTENSION[i].pszField);
|
||
++i;
|
||
}
|
||
|
||
DbgPrint("sizeof(DEVICE_EXTENSION) = %08x\n", gsotDEVICE_EXTENSION[i].dwOffset);
|
||
}
|