186 lines
3.3 KiB
C
186 lines
3.3 KiB
C
/*++
|
|
|
|
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;
|
|
}
|
|
|