Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

185 lines
3.3 KiB

/*++
Copyright(c) 2000 Microsoft Corporation
Module Name:
eventlog.c
Abstract:
Author:
Todd Carpenter
Environment:
Kernel Mode Only
Revision History:
07-12-2000 created
--*/
#include "eventlog.h"
#include "dbgsys.h"
ULONG ErrorLogCount = 0;
NTSTATUS
WriteEventLogEntry (
IN PVOID DeviceObject,
IN ULONG ErrorCode,
IN PVOID InsertionStrings, OPTIONAL
IN ULONG StringCount, OPTIONAL
IN PVOID DumpData, OPTIONAL
IN ULONG DataSize OPTIONAL
)
/*++
Routine Description:
Arguments:
Status -
UniqueErrorValue -
InsertionStrings -
StringCount -
DumpData -
DataSize -
Return Value:
NTSTATUS
--*/
{
#define ERROR_PACKET_SIZE sizeof(IO_ERROR_LOG_PACKET)
NTSTATUS status = STATUS_SUCCESS;
ULONG totalPacketSize;
ULONG i, stringSize = 0;
PWCHAR *strings, temp;
PIO_ERROR_LOG_PACKET logEntry;
//
// 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);
//stringSize += (wcslen(strings[i]) + 1) * sizeof(WCHAR);
}
//
// 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 = ERROR_PACKET_SIZE + DataSize + stringSize;
if (totalPacketSize >= ERROR_LOG_MAXIMUM_SIZE) {
DebugPrint((TRACE, "WriteEventLogEntry: Error Log Entry too large.\n"));
status = STATUS_UNSUCCESSFUL;
goto WriteEventLogEntryExit;
}
//
// Allocate the error log packet
//
logEntry = IoAllocateErrorLogEntry(DeviceObject,
(UCHAR) totalPacketSize);
if (!logEntry) {
status = STATUS_INSUFFICIENT_RESOURCES;
goto WriteEventLogEntryExit;
}
RtlZeroMemory(logEntry, totalPacketSize);
//
// Fill out the packet
//
//logEntry->MajorFunctionCode = 0;
//logEntry->RetryCount = 0;
//logEntry->UniqueErrorValue = 0;
//logEntry->FinalStatus = 0;
//logEntry->SequenceNumber = ErrorLogCount++;
//logEntry->IoControlCode = 0;
//logEntry->DeviceOffset.QuadPart = 0;
logEntry->DumpDataSize = (USHORT) DataSize;
logEntry->NumberOfStrings = (USHORT) StringCount;
logEntry->EventCategory = 0x1; // type devices
logEntry->ErrorCode = ErrorCode;
if (StringCount) {
logEntry->StringOffset = (USHORT) (ERROR_PACKET_SIZE + 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);
WriteEventLogEntryExit:
return status;
}