199 lines
4.4 KiB
C
199 lines
4.4 KiB
C
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
errlog.c
|
|
|
|
Abstract:
|
|
|
|
This module contains routines for writting to the error log
|
|
|
|
Author:
|
|
|
|
Hanumant Yadav
|
|
|
|
Environment:
|
|
|
|
NT Kernel Model Driver only
|
|
|
|
Revision History:
|
|
10/19/2000 Fixed event log function, removed dead code.
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
//
|
|
// We need to know the name of the driver when we write log errors
|
|
//
|
|
PDRIVER_OBJECT AcpiDriverObject;
|
|
|
|
|
|
|
|
NTSTATUS
|
|
ACPIWriteEventLogEntry (
|
|
IN ULONG ErrorCode,
|
|
IN PVOID InsertionStrings, OPTIONAL
|
|
IN ULONG StringCount, OPTIONAL
|
|
IN PVOID DumpData, OPTIONAL
|
|
IN ULONG DataSize OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description: Write a entry to the Event Log.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
ErrorCode - ACPI error code (acpilog.mc).
|
|
InsertionStrings - Strings to substitute in the .mc file error.
|
|
StringCount - number of strings being passed in InsertionStrings.
|
|
DumpData - Dump data.
|
|
DataSize - Dump data size.
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS - STATUS_SUCCESS on success
|
|
STATUS_INSUFFICIENT_RESOURCES
|
|
STATUS_UNSUCCESSFUL
|
|
--*/
|
|
{
|
|
NTSTATUS status = STATUS_SUCCESS;
|
|
ULONG totalPacketSize = 0;
|
|
ULONG i, stringSize = 0;
|
|
PWCHAR *strings, temp;
|
|
PIO_ERROR_LOG_PACKET logEntry = NULL;
|
|
|
|
|
|
//
|
|
// Calculate total string length, including NULL.
|
|
//
|
|
|
|
strings = (PWCHAR *) InsertionStrings;
|
|
|
|
for (i = 0; i < StringCount; i++)
|
|
{
|
|
UNICODE_STRING unicodeString;
|
|
|
|
RtlInitUnicodeString(&unicodeString, strings[i]);
|
|
stringSize += unicodeString.Length + sizeof(UNICODE_NULL);
|
|
}
|
|
|
|
//
|
|
// Calculate total packet size to allocate. The packet must be
|
|
// at least sizeof(IO_ERROR_LOG_PACKET) and not larger than
|
|
// ERROR_LOG_MAXIMUM_SIZE or the IoAllocateErrorLogEntry call will fail.
|
|
//
|
|
|
|
totalPacketSize = (sizeof(IO_ERROR_LOG_PACKET)) + DataSize + stringSize;
|
|
|
|
if (totalPacketSize <= ERROR_LOG_MAXIMUM_SIZE)
|
|
{
|
|
//
|
|
// Allocate the error log packet
|
|
//
|
|
logEntry = IoAllocateErrorLogEntry((PDRIVER_OBJECT) AcpiDriverObject,
|
|
(UCHAR) totalPacketSize);
|
|
|
|
if (logEntry)
|
|
{
|
|
RtlZeroMemory(logEntry, totalPacketSize);
|
|
|
|
//
|
|
// Fill out the packet
|
|
//
|
|
logEntry->DumpDataSize = (USHORT) DataSize;
|
|
logEntry->NumberOfStrings = (USHORT) StringCount;
|
|
logEntry->ErrorCode = ErrorCode;
|
|
|
|
if (StringCount)
|
|
{
|
|
logEntry->StringOffset = (USHORT) ((sizeof(IO_ERROR_LOG_PACKET)) + DataSize);
|
|
}
|
|
|
|
//
|
|
// Copy Dump Data
|
|
//
|
|
if (DataSize)
|
|
{
|
|
RtlCopyMemory((PVOID) logEntry->DumpData,
|
|
DumpData,
|
|
DataSize);
|
|
}
|
|
|
|
//
|
|
// Copy String Data
|
|
//
|
|
temp = (PWCHAR) ((PUCHAR) logEntry + logEntry->StringOffset);
|
|
|
|
for (i = 0; i < StringCount; i++)
|
|
{
|
|
PWCHAR ptr = strings[i];
|
|
|
|
//
|
|
// This routine will copy the null terminator on the string
|
|
//
|
|
while ((*temp++ = *ptr++) != UNICODE_NULL);
|
|
}
|
|
|
|
//
|
|
// Submit error log packet
|
|
//
|
|
IoWriteErrorLogEntry(logEntry);
|
|
|
|
}
|
|
else
|
|
{
|
|
ACPIPrint((
|
|
ACPI_PRINT_CRITICAL,
|
|
"ACPIWriteEventLogEntry: Failed IoAllocateErrorLogEntry().\n"
|
|
));
|
|
status = STATUS_INSUFFICIENT_RESOURCES;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ACPIPrint((
|
|
ACPI_PRINT_CRITICAL,
|
|
"ACPIWriteEventLogEntry: Error Log Entry too large.\n"
|
|
));
|
|
|
|
status = STATUS_UNSUCCESSFUL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
|
|
PDEVICE_OBJECT
|
|
ACPIGetRootDeviceObject(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description: Get the value of the ACPI root device object.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
PDEVICE_OBJECT - ACPI Root Device Object.
|
|
|
|
--*/
|
|
|
|
{
|
|
if(RootDeviceExtension)
|
|
{
|
|
return RootDeviceExtension->DeviceObject;
|
|
}
|
|
|
|
return NULL;
|
|
}
|