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;
|
||
}
|
||
|