Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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"
#ifdef _USE_ETW
#include "errlog.tmh"
#endif // _USE_ETW
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; }
|