#define NDEBUG
#include <debug.h>
-#define TAG_ERR TAG('E', 'r', 'r', ' ')
+#define TAG_ERR ' rrE'
/* GLOBALS ****************************************************************/
/* FUNCTIONS ****************************************************************/
/*++
-* @name ExpRaiseHardError
+* @name ExpSystemErrorHandler
*
* For now it's a stub
*
IN PULONG_PTR Parameters,
IN BOOLEAN Shutdown)
{
+ ULONG_PTR BugCheckParameters[MAXIMUM_HARDERROR_PARAMETERS] = {0, 0, 0, 0};
+ ULONG i;
+
+ /* Sanity check */
+ ASSERT(NumberOfParameters <= MAXIMUM_HARDERROR_PARAMETERS);
+
+ /*
+ * KeBugCheck expects MAXIMUM_HARDERROR_PARAMETERS parameters,
+ * but we might get called with less, so use a local buffer here.
+ */
+ for (i = 0; i < NumberOfParameters; i++)
+ {
+ /* Copy them over */
+ BugCheckParameters[i] = Parameters[i];
+ }
+
/* FIXME: STUB */
KeBugCheckEx(FATAL_UNHANDLED_HARD_ERROR,
ErrorStatus,
- 0,
+ (ULONG_PTR)BugCheckParameters,
0,
0);
return STATUS_SUCCESS;
* Optional string parameter (can be only one per error code)
*
* @param Parameters
- * Array of ULONG parameters for use in error message string
+ * Array of ULONG_PTR parameters for use in error message string
*
* @param ValidResponseOptions
* See HARDERROR_RESPONSE_OPTION for possible values description
}
/* Enter SEH Block */
- _SEH_TRY
+ _SEH2_TRY
{
/* Validate the response pointer */
ProbeForWriteUlong(Response);
}
}
}
- _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Free captured buffer */
if (SafeParams) ExFreePool(SafeParams);
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- /* If we failed to capture/probe, bail out */
- if (!NT_SUCCESS(Status)) return Status;
+ /* Return the exception code */
+ _SEH2_YIELD(return _SEH2_GetExceptionCode());
+ }
+ _SEH2_END;
/* Call the system function directly, because we probed */
ExpRaiseHardError(ErrorStatus,
if (SafeParams) ExFreePool(SafeParams);
/* Enter SEH Block for return */
- _SEH_TRY
+ _SEH2_TRY
{
/* Return the response */
*Response = SafeResponse;
}
- _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = _SEH_GetExceptionCode();
+ /* Get the exception code */
+ Status = _SEH2_GetExceptionCode();
}
- _SEH_END;
+ _SEH2_END;
}
else
{