windows-nt/Source/XPSP1/NT/base/busdrv/acpi/driver/nt/errlog.c
2020-09-26 16:20:57 +08:00

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