windows-nt/Source/XPSP1/NT/drivers/storage/redbook/errlog.c
2020-09-26 16:20:57 +08:00

143 lines
3.6 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}