125 lines
4.1 KiB
C
125 lines
4.1 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
||
|
//
|
||
|
// File: errlog.c
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
|
||
|
VOID
|
||
|
PptLogError(
|
||
|
IN PDRIVER_OBJECT DriverObject,
|
||
|
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
|
||
|
IN PHYSICAL_ADDRESS P1,
|
||
|
IN PHYSICAL_ADDRESS P2,
|
||
|
IN ULONG SequenceNumber,
|
||
|
IN UCHAR MajorFunctionCode,
|
||
|
IN UCHAR RetryCount,
|
||
|
IN ULONG UniqueErrorValue,
|
||
|
IN NTSTATUS FinalStatus,
|
||
|
IN NTSTATUS SpecificIOStatus
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine allocates an error log entry, copies the supplied data
|
||
|
to it, and requests that it be written to the error log file.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
DriverObject - Supplies a pointer to the driver object for the device
|
||
|
|
||
|
DeviceObject - Supplies a pointer to the device object associated
|
||
|
with the device that had the error, early in
|
||
|
initialization, one may not yet exist.
|
||
|
|
||
|
P1,P2 - Supplies the physical addresses for the controller
|
||
|
ports involved with the error if they are available
|
||
|
and puts them through as dump data.
|
||
|
|
||
|
SequenceNumber - Supplies a ulong value that is unique to an IRP over
|
||
|
the life of the irp in this driver - 0 generally
|
||
|
means an error not associated with an irp.
|
||
|
|
||
|
MajorFunctionCode - Supplies the major function code of the irp if there
|
||
|
is an error associated with it.
|
||
|
|
||
|
RetryCount - Supplies the number of times a particular operation
|
||
|
has been retried.
|
||
|
|
||
|
UniqueErrorValue - Supplies a unique long word that identifies the
|
||
|
particular call to this function.
|
||
|
|
||
|
FinalStatus - Supplies the final status given to the irp that was
|
||
|
associated with this error. If this log entry is
|
||
|
being made during one of the retries this value
|
||
|
will be STATUS_SUCCESS.
|
||
|
|
||
|
SpecificIOStatus - Supplies the IO status for this particular error.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
PIO_ERROR_LOG_PACKET ErrorLogEntry;
|
||
|
PVOID ObjectToUse;
|
||
|
SHORT DumpToAllocate;
|
||
|
|
||
|
DD(NULL,DDE,"PptLogError()\n");
|
||
|
|
||
|
if (ARGUMENT_PRESENT(DeviceObject)) {
|
||
|
ObjectToUse = DeviceObject;
|
||
|
} else {
|
||
|
ObjectToUse = DriverObject;
|
||
|
}
|
||
|
|
||
|
DumpToAllocate = 0;
|
||
|
|
||
|
if (P1.LowPart != 0 || P1.HighPart != 0) {
|
||
|
DumpToAllocate = (SHORT) sizeof(PHYSICAL_ADDRESS);
|
||
|
}
|
||
|
|
||
|
if (P2.LowPart != 0 || P2.HighPart != 0) {
|
||
|
DumpToAllocate += (SHORT) sizeof(PHYSICAL_ADDRESS);
|
||
|
}
|
||
|
|
||
|
ErrorLogEntry = IoAllocateErrorLogEntry(ObjectToUse,
|
||
|
(UCHAR) (sizeof(IO_ERROR_LOG_PACKET) + DumpToAllocate));
|
||
|
|
||
|
if (!ErrorLogEntry) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ErrorLogEntry->ErrorCode = SpecificIOStatus;
|
||
|
ErrorLogEntry->SequenceNumber = SequenceNumber;
|
||
|
ErrorLogEntry->MajorFunctionCode = MajorFunctionCode;
|
||
|
ErrorLogEntry->RetryCount = RetryCount;
|
||
|
ErrorLogEntry->UniqueErrorValue = UniqueErrorValue;
|
||
|
ErrorLogEntry->FinalStatus = FinalStatus;
|
||
|
ErrorLogEntry->DumpDataSize = DumpToAllocate;
|
||
|
|
||
|
if (DumpToAllocate) {
|
||
|
|
||
|
RtlCopyMemory(ErrorLogEntry->DumpData, &P1, sizeof(PHYSICAL_ADDRESS));
|
||
|
|
||
|
if (DumpToAllocate > sizeof(PHYSICAL_ADDRESS)) {
|
||
|
|
||
|
RtlCopyMemory(((PUCHAR) ErrorLogEntry->DumpData) +
|
||
|
sizeof(PHYSICAL_ADDRESS), &P2,
|
||
|
sizeof(PHYSICAL_ADDRESS));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IoWriteErrorLogEntry(ErrorLogEntry);
|
||
|
}
|
||
|
|