Windows2003-3790/drivers/watchdog/wd.h

186 lines
4.6 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
wd.h
Abstract:
This is the NT Watchdog driver implementation.
Author:
Michael Maciesowicz (mmacie) 05-May-2000
Environment:
Kernel mode only.
Notes:
Revision History:
--*/
#ifndef _WD_H_
#define _WD_H_
#include "ntddk.h"
#include "watchdog.h"
#define WD_MAX_WAIT ((LONG)((ULONG)(-1) / 4))
#define WD_KEY_WATCHDOG L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Watchdog"
#define WD_KEY_WATCHDOG_DISPLAY L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Watchdog\\Display"
#define WD_KEY_RELIABILITY L"\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\Reliability"
#define WD_TAG 'godW' // Wdog
#define WD_MAX_PROPERTY_SIZE 4096
//
// Define default configuration values - these can be overwriten via registry
// in RTL_REGISTRY_CONTROL\Watchdog\DeviceClass key.
//
#define WD_DEFAULT_TRAP_ONCE 0
#define WD_DEFAULT_DISABLE_BUGCHECK 0
#define WD_DEFAULT_BREAK_POINT_DELAY 0
#if DBG
#define WD_DBG_SUSPENDED_WARNING(pWd, szRoutine) \
{ \
if ((pWd)->SuspendCount) \
{ \
DbgPrint("watchdog!%s: WARNING! Called while suspended!\n", (szRoutine)); \
DbgPrint("watchdog!%s: Watchdog %p\n", (szRoutine), (pWd)); \
} \
}
#else
#define WD_DBG_SUSPENDED_WARNING(pWd, szRoutine) NULL
#endif // DBG
#define ASSERT_WATCHDOG_OBJECT(pWd) \
ASSERT((NULL != (pWd)) && \
(WdStandardWatchdog == ((PWATCHDOG_OBJECT)(pWd))->ObjectType) || \
(WdDeferredWatchdog == ((PWATCHDOG_OBJECT)(pWd))->ObjectType))
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING wszRegistryPath
);
VOID
WdpDeferredWatchdogDpcCallback(
IN PKDPC pDpc,
IN PVOID pDeferredContext,
IN PVOID pSystemArgument1,
IN PVOID pSystemArgument2
);
VOID
WdpDestroyObject(
IN PVOID pWatch
);
NTSTATUS
WdpFlushRegistryKey(
IN PVOID pWatch,
IN PCWSTR pwszKeyName
);
VOID
WdpInitializeObject(
IN PVOID pWatch,
IN PDEVICE_OBJECT pDeviceObject,
IN WD_OBJECT_TYPE objectType,
IN WD_TIME_TYPE timeType,
IN ULONG ulTag
);
BOOLEAN
WdpQueueDeferredEvent(
IN PDEFERRED_WATCHDOG pWatch,
IN WD_EVENT_TYPE eventType
);
VOID
WdpWatchdogDpcCallback(
IN PKDPC pDpc,
IN PVOID pDeferredContext,
IN PVOID pSystemArgument1,
IN PVOID pSystemArgument2
);
//
// Internal ntos API (this is declared in ntifs.h but it's hard to include it here).
//
// TODO: Fix it later.
//
PDEVICE_OBJECT
IoGetDeviceAttachmentBaseRef(
IN PDEVICE_OBJECT pDeviceObject
);
//
// Debug code to trace the sequence of calls into watchdog.
//
#ifdef WDD_TRACE_ENABLED
#define WDD_TRACE_SIZE 128
#define WDD_TRACE_CALL(pWatch, function) WddTrace((pWatch), (function))
typedef enum _WDD_FUNCTION
{
WddWdAllocateDeferredWatchdog = 1,
WddWdFreeDeferredWatchdog,
WddWdStartDeferredWatch,
WddWdStopDeferredWatch,
// WddWdSuspendDeferredWatch,
// WddWdResumeDeferredWatch,
WddWdResetDeferredWatch,
// WddWdEnterMonitoredSection,
// WddWdExitMonitoredSection,
WddWdpDeferredWatchdogDpcCallback,
WddWdpQueueDeferredEvent,
WddWdDdiWatchdogDpcCallback,
WddWdpBugCheckStuckDriver,
WddWdAttachContext,
WddWdCompleteEvent,
WddWdDereferenceObject,
WddWdDetachContext,
WddWdGetDeviceObject,
WddWdGetLastEvent,
WddWdGetLowestDeviceObject,
WddWdReferenceObject,
WddWdpDestroyObject,
WddWdpFlushRegistryKey,
WddWdpInitializeObject
} WDD_FUNCTION, *PWDD_FUNCTION;
typedef struct _WDD_TRACE
{
PDEFERRED_WATCHDOG pWatch;
WDD_FUNCTION function;
} WDD_TRACE, *PWDD_TRACE;
VOID
FASTCALL
WddTrace(
PDEFERRED_WATCHDOG pWatch,
WDD_FUNCTION function
);
#else // WDD_TRACE_ENABLED
#define WDD_TRACE_CALL(pWatch, function) NULL
#endif // WDD_TRACE_ENABLED
#endif // _WD_H_