//+---------------------------------------------------------------------------- // // Copyright (C) 1992, Microsoft Corporation // // File: log.c // // Contents: Module to log messages from the driver to the NT event logging // system. // // Classes: // // Functions: LogWriteMessage() // // History: 3/30/93 Milans created // 04/18/93 SudK modified to use a MessageFile. and some // cleanup to the function below. // //----------------------------------------------------------------------------- #include "dfsprocs.h" #define Dbg DEBUG_TRACE_EVENTLOG VOID LogpPutString( IN PUNICODE_STRING pustrString, IN OUT PCHAR *ppStringBuffer, IN OUT UCHAR *pcbBuffer); #ifdef ALLOC_PRAGMA #pragma alloc_text( PAGE, LogWriteMessage ) #pragma alloc_text( PAGE, LogpPutString ) #endif // ALLOC_PRAGMA //+---------------------------------------------------------------------------- // // Function: LogWriteMessage // // Synopsis: Logs a message to the NT event logging system. // // Arguments: [UniqueErrCode] -- The code that identifes the message. // [NtStatusCode] -- Status code from some error. // [nStrings] -- Number of strings being passed in. // [pustrArg] -- The Array of insertion strings. // // Returns: Nothing at all. // // History: 04/18/93 SudK Created. // //----------------------------------------------------------------------------- VOID LogWriteMessage( IN ULONG UniqueErrorCode, IN NTSTATUS NtStatusCode, IN ULONG nStrings, IN PUNICODE_STRING pustrArg OPTIONAL) { PIO_ERROR_LOG_PACKET pErrorLog; UCHAR cbSize; UCHAR *pStringBuffer; ULONG i; // // Compute the size of the Error Log Packet that we need to start with. // cbSize = sizeof(IO_ERROR_LOG_PACKET); for (i = 0; i < nStrings; i++) { cbSize = (UCHAR)( cbSize + pustrArg[i].Length + sizeof(WCHAR)); } if (cbSize > ERROR_LOG_MAXIMUM_SIZE) { cbSize = ERROR_LOG_MAXIMUM_SIZE; } pErrorLog = (PIO_ERROR_LOG_PACKET) IoAllocateErrorLogEntry( DfsData.DriverObject, cbSize); if (!pErrorLog) { // // Well, I guess we won't be logging this one. // return; } // // Zero out all fields, then set the ones we want. // RtlZeroMemory((PVOID) pErrorLog, sizeof(IO_ERROR_LOG_PACKET)); pErrorLog->FinalStatus = NtStatusCode; pErrorLog->ErrorCode = UniqueErrorCode; pErrorLog->NumberOfStrings = (USHORT) nStrings; pErrorLog->StringOffset = sizeof(IO_ERROR_LOG_PACKET); pStringBuffer = ((PCHAR) pErrorLog) + sizeof(IO_ERROR_LOG_PACKET); // // Copy the strings into the buffer, making sure we truncate if and when // we need to. // cbSize -= sizeof(IO_ERROR_LOG_PACKET); for (i = 0; i < nStrings; i++) { LogpPutString(&pustrArg[i], &pStringBuffer, &cbSize); } // // And finally, write out the log // IoWriteErrorLogEntry(pErrorLog); } //+---------------------------------------------------------------------------- // // Function: LogpPutString // // Synopsis: Copies a string into the buffer part of an IO_ERROR_LOG_PACKET. // Takes care of truncating if the whole string won't fit. // // Arguments: [pustrString] -- Pointer to unicode string to copy. // [ppStringBuffer] -- On input, pointer to beginning of buffer // to copy to. On exit, will point one past the // end of the copied string. // [pcbBuffer] -- On input, max size of buffer. On output, // remaining size after string has been copied. // // Returns: Nothing // // History: 04/18/93 SudK Created. // //----------------------------------------------------------------------------- VOID LogpPutString( IN PUNICODE_STRING pustrString, IN OUT PCHAR *ppStringBuffer, IN OUT UCHAR *pcbBuffer) { ULONG len; PWCHAR pwch; if ((*pcbBuffer == 0) || (pustrString->Length == 0)) { return; } if ( *pcbBuffer >= (pustrString->Length + sizeof(WCHAR)) ) { RtlMoveMemory(*ppStringBuffer, pustrString->Buffer, pustrString->Length); (*pcbBuffer) -= pustrString->Length; (*ppStringBuffer) += pustrString->Length; } else { RtlMoveMemory(*ppStringBuffer, pustrString->Buffer, (*pcbBuffer)-sizeof(WCHAR)); *pcbBuffer = sizeof(WCHAR); (*ppStringBuffer) += (*pcbBuffer - sizeof(WCHAR)); } // // Null Terminate the String Now if necessary. // if (*((PWCHAR) *ppStringBuffer - 1) != L'\0') { *((PWCHAR) *ppStringBuffer) = L'\0'; *ppStringBuffer += sizeof(WCHAR); (*pcbBuffer) -= sizeof(WCHAR); } }