143 lines
3.6 KiB
C
143 lines
3.6 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (C) 1991-8 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
errlog.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
this module provides error logging capabilities for
|
|||
|
the redbook driver
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Henry Gabryjelski (henrygab) 1-Oct-1998
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
kernel mode only
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include "redbook.h"
|
|||
|
#include "proto.h"
|
|||
|
#include "errlog.tmh"
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
RedBookLogError(
|
|||
|
IN PREDBOOK_DEVICE_EXTENSION DeviceExtension,
|
|||
|
IN NTSTATUS IoErrorCode,
|
|||
|
IN NTSTATUS FinalStatus
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine performs error logging for the redbook driver.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Extension - Extension.
|
|||
|
UniqueErrorValue - Values defined to uniquely identify error location.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PIO_ERROR_LOG_PACKET errorLogPacket;
|
|||
|
ULONG count;
|
|||
|
ULONG rCount;
|
|||
|
USHORT simpleCode;
|
|||
|
ULONG packetSize;
|
|||
|
|
|||
|
count = InterlockedIncrement(&DeviceExtension->ErrorLog.Count);
|
|||
|
simpleCode = (USHORT)(IoErrorCode & REDBOOK_ERR_MASK);
|
|||
|
|
|||
|
ASSERT(simpleCode < REDBOOK_ERR_MAXIMUM);
|
|||
|
|
|||
|
switch (IoErrorCode) {
|
|||
|
case REDBOOK_ERR_TOO_MANY_READ_ERRORS:
|
|||
|
case REDBOOK_ERR_TOO_MANY_STREAM_ERRORS:
|
|||
|
case REDBOOK_ERR_CANNOT_OPEN_SYSAUDIO_MIXER:
|
|||
|
case REDBOOK_ERR_CANNOT_CREATE_VIRTUAL_SOURCE:
|
|||
|
case REDBOOK_ERR_CANNOT_OPEN_PREFERRED_WAVEOUT_DEVICE:
|
|||
|
case REDBOOK_ERR_CANNOT_GET_NUMBER_OF_PINS:
|
|||
|
case REDBOOK_ERR_CANNOT_CONNECT_TO_PLAYBACK_PINS:
|
|||
|
case REDBOOK_ERR_WMI_INIT_FAILED:
|
|||
|
case REDBOOK_ERR_CANNOT_CREATE_THREAD:
|
|||
|
case REDBOOK_ERR_INSUFFICIENT_DATA_STREAM_PAUSED:
|
|||
|
case REDBOOK_ERR_UNSUPPORTED_DRIVE:
|
|||
|
NOTHING;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
KdPrintEx((DPFLTR_REDBOOK_ID, RedbookDebugError, "[redbook] "
|
|||
|
"LogErr !! Invalid error code %lx\n", IoErrorCode));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Use an exponential backoff algorithm to log events.
|
|||
|
//
|
|||
|
|
|||
|
rCount = InterlockedIncrement(&DeviceExtension->ErrorLog.RCount[simpleCode]);
|
|||
|
|
|||
|
if (CountOfSetBits(rCount) != 1) {
|
|||
|
KdPrintEx((DPFLTR_REDBOOK_ID, RedbookDebugErrlog, "[redbook] "
|
|||
|
"LogError => IoErrorCode %lx Occurance %d\n",
|
|||
|
IoErrorCode, rCount));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
KdPrintEx((DPFLTR_REDBOOK_ID, RedbookDebugErrlog, "[redbook] "
|
|||
|
"LogError => IoErrorCode %lx Occurance %d\n",
|
|||
|
IoErrorCode, rCount));
|
|||
|
|
|||
|
packetSize = sizeof(IO_ERROR_LOG_PACKET) + sizeof(ULONG);
|
|||
|
|
|||
|
errorLogPacket = (PIO_ERROR_LOG_PACKET)
|
|||
|
IoAllocateErrorLogEntry(DeviceExtension->SelfDeviceObject,
|
|||
|
(UCHAR)packetSize);
|
|||
|
|
|||
|
if (errorLogPacket==NULL) {
|
|||
|
KdPrintEx((DPFLTR_REDBOOK_ID, RedbookDebugErrlog, "[redbook] "
|
|||
|
"LogError => unable to allocate error log packet\n"));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
KdPrintEx((DPFLTR_REDBOOK_ID, RedbookDebugErrlog, "[redbook] "
|
|||
|
"LogError => allocated error log at %p, size %x\n",
|
|||
|
errorLogPacket, packetSize));
|
|||
|
|
|||
|
//
|
|||
|
// this function relies upon IoAllocateErrorLogEntry() zero'ing the packet
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
errorLogPacket->MajorFunctionCode = -1;
|
|||
|
errorLogPacket->IoControlCode = -1;
|
|||
|
errorLogPacket->ErrorCode = IoErrorCode;
|
|||
|
errorLogPacket->FinalStatus = FinalStatus;
|
|||
|
errorLogPacket->SequenceNumber = count;
|
|||
|
errorLogPacket->DumpDataSize = 4; // bytes
|
|||
|
errorLogPacket->DumpData[0] = rCount;
|
|||
|
|
|||
|
|
|||
|
IoWriteErrorLogEntry(errorLogPacket);
|
|||
|
return;
|
|||
|
}
|
|||
|
|