Participación en la persistencia del registro de errores
Para participar en la persistencia del registro de errores, un complemento PSHED debe implementar las siguientes funciones de devolución de llamada:
En el ejemplo de código siguiente se muestra cómo implementar estas funciones de devolución de llamada.
//
// The PSHED plug-in's WriteErrorRecord callback function
//
NTSTATUS
WriteErrorRecord(
IN OUT PVOID PluginContext,
IN ULONG Flags,
IN ULONG RecordLength,
IN PWHEA_ERROR_RECORD ErrorRecord
)
{
// Check if dummy write operation
if (Flags & WHEA_WRITE_FLAG_DUMMY)
{
return STATUS_SUCCESS;
}
// Write the error record to the persistent data storage
...
// If successful, return success status
if (...)
{
return STATUS_SUCCESS;
}
// Failed to write the error record
else
{
return STATUS_UNSUCCESSFUL;
}
}
//
// The PSHED plug-in's ReadErrorRecord callback function
//
NTSTATUS
ReadErrorRecord(
IN OUT PVOID PluginContext,
IN ULONG Flags,
IN ULONGLONG ErrorRecordId,
OUT ULONGLONG NextErrorRecordId,
IN OUT PULONG RecordLength,
IN OUT PWHEA_ERROR_RECORD ErrorRecord
)
{
ULONG Length;
PWHEA_ERROR_RECORD Record;
// Check if an error record that matches the
// identifier in the ErrorRecordId parameter
// exists in the persistent data storage
if (...)
{
// Retrieve the length of the specified error
// record from the persistent data storage
Length = ...;
// Check if the buffer is too small to contain
// the error record
if (*RecordLength < Length)
{
// Set the RecordLength to the required length
*RecordLength = Length;
// Return error status
return STATUS_BUFFER_TOO_SMALL;
}
// Retrieve the error record from the
// persistent data storage and copy it
// into the buffer pointed to by the
// ErrorRecord parameter.
...
// If successful
if (...)
{
// Set RecordLength to the length of the
// error record
*RecordLength = Length;
// Check if there are any other error records
// in the persistent data storage
if (...)
{
// Return the identifier of the next
// error record
*NextErrorRecordId = ...;
}
// No other error records
else
{
// Return the identifier of this error record
*NextErrorRecordId = ErrorRecordId;
}
// Return success status
return STATUS_SUCCESS;
}
// Failed to read the error record
else
{
// Return error status
return STATUS_UNSUCCESSFUL;
}
}
// The error record does not exist in the
// persistent data storage
else
{
// Return error status
return STATUS_OBJECT_NOT_FOUND;
}
}
//
// The PSHED plug-in's ClearErrorRecord callback function
//
NTSTATUS
ClearErrorRecord(
IN OUT PVOID PluginContext,
IN ULONG Flags,
IN ULONGLONG ErrorRecordId
)
{
// Clear the error record that matches the specified
// error record identifier from the persistent data
// storage.
...
// If successful, return success status
if (...)
{
return STATUS_SUCCESS;
}
// Failed to clear the error record
else
{
return STATUS_UNSUCCESSFUL;
}
}
Un complemento PSHED que participa en la persistencia del registro de errores debe especificar la marca PshedFAErrorRecordPersistence cuando se registra en el sistema operativo.
Para obtener más información sobre la persistencia del registro de errores, vea Mecanismo de persistencia del registro de errores.