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