|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
watchdog.h
Abstract:
Contains all structure and routine definitions for NT Watchdog services.
Author:
Michael Maciesowicz (mmacie) 05-May-2000
Environment:
Kernel mode only.
Notes:
Revision History:
--*/
#ifndef _WATCHDOG_H_
#define _WATCHDOG_H_
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
#ifdef WATCHDOG_EXPORTS
#define WATCHDOGAPI
#else
#define WATCHDOGAPI __declspec(dllimport)
#endif // WATCHDOG_EXPORTS
//
// Do not dereference any watchdog data types directly!!!
// They're subject to change at any time.
//
//
// Data types.
//
typedef enum _WD_OBJECT_TYPE { WdStandardWatchdog = 'WSdW', // WdSW
WdDeferredWatchdog = 'WDdW' // WdDW
} WD_OBJECT_TYPE, *PWD_OBJECT_TYPE;
typedef enum _WD_TIME_TYPE { WdKernelTime = 1, WdUserTime, WdFullTime } WD_TIME_TYPE, *PWD_TIME_TYPE;
typedef enum _WD_EVENT_TYPE { WdNoEvent = 1, WdTimeoutEvent, WdRecoveryEvent } WD_EVENT_TYPE, *PWD_EVENT_TYPE;
typedef struct _WATCHDOG_OBJECT { WD_OBJECT_TYPE ObjectType; LONG ReferenceCount; ULONG OwnerTag; PDEVICE_OBJECT DeviceObject; WD_TIME_TYPE TimeType; WD_EVENT_TYPE LastEvent; struct _KTHREAD *RESTRICTED_POINTER LastQueuedThread; KSPIN_LOCK SpinLock; } WATCHDOG_OBJECT, *PWATCHDOG_OBJECT;
typedef struct _DEFERRED_WATCHDOG { WATCHDOG_OBJECT Header; LONG Period; LONG SuspendCount; LONG InCount; LONG OutCount; LONG LastInCount; LONG LastOutCount; ULONG LastKernelTime; ULONG LastUserTime; ULONG TimeIncrement; LONG Trigger; BOOLEAN Started; struct _KTHREAD *RESTRICTED_POINTER Thread; struct _KTIMER Timer; struct _KDPC TimerDpc; struct _KDPC *ClientDpc; } DEFERRED_WATCHDOG, *PDEFERRED_WATCHDOG;
typedef struct _WATCHDOG { WATCHDOG_OBJECT Header; ULONG StartCount; ULONG SuspendCount; ULONG LastKernelTime; ULONG LastUserTime; ULONG TimeIncrement; LARGE_INTEGER DueTime; LARGE_INTEGER InitialDueTime; struct _KTHREAD *RESTRICTED_POINTER Thread; struct _KTIMER Timer; struct _KDPC TimerDpc; struct _KDPC *ClientDpc; } WATCHDOG, *PWATCHDOG;
//
// Deferred watchdog function prototypes.
//
WATCHDOGAPI PDEFERRED_WATCHDOG WdAllocateDeferredWatchdog( IN PDEVICE_OBJECT DeviceObject, IN WD_TIME_TYPE TimeType, IN ULONG Tag );
WATCHDOGAPI VOID FASTCALL WdEnterMonitoredSection( IN PDEFERRED_WATCHDOG Watch );
WATCHDOGAPI VOID FASTCALL WdExitMonitoredSection( IN PDEFERRED_WATCHDOG Watch );
WATCHDOGAPI VOID WdFreeDeferredWatchdog( IN PDEFERRED_WATCHDOG Watch );
WATCHDOGAPI VOID FASTCALL WdResetDeferredWatch( IN PDEFERRED_WATCHDOG Watch );
WATCHDOGAPI VOID FASTCALL WdResumeDeferredWatch( IN PDEFERRED_WATCHDOG Watch, IN BOOLEAN Incremental );
WATCHDOGAPI VOID WdStartDeferredWatch( IN PDEFERRED_WATCHDOG Watch, IN PKDPC Dpc, IN LONG Period );
WATCHDOGAPI VOID WdStopDeferredWatch( IN PDEFERRED_WATCHDOG Watch );
WATCHDOGAPI VOID FASTCALL WdSuspendDeferredWatch( IN PDEFERRED_WATCHDOG Watch );
//
// Watchdog function prototypes.
//
WATCHDOGAPI PWATCHDOG WdAllocateWatchdog( IN PDEVICE_OBJECT DeviceObject, IN WD_TIME_TYPE TimeType, IN ULONG Tag );
WATCHDOGAPI VOID WdFreeWatchdog( IN PWATCHDOG Watch );
WATCHDOGAPI VOID WdResetWatch( IN PWATCHDOG Watch );
WATCHDOGAPI VOID WdResumeWatch( IN PWATCHDOG Watch, IN BOOLEAN Incremental );
WATCHDOGAPI VOID WdStartWatch( IN PWATCHDOG Watch, IN LARGE_INTEGER DueTime, IN PKDPC Dpc );
WATCHDOGAPI VOID WdStopWatch( IN PWATCHDOG Watch, IN BOOLEAN Incremental );
WATCHDOGAPI VOID WdSuspendWatch( IN PWATCHDOG Watch );
WATCHDOGAPI VOID WdDdiWatchdogDpcCallback( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );
//
// Common function prototypes.
//
WATCHDOGAPI VOID WdCompleteEvent( IN PVOID Watch, IN PKTHREAD Thread );
WATCHDOGAPI VOID WdDereferenceObject( IN PVOID Watch );
WATCHDOGAPI PDEVICE_OBJECT WdGetDeviceObject( IN PVOID Watch );
WATCHDOGAPI WD_EVENT_TYPE WdGetLastEvent( IN PVOID Watch );
WATCHDOGAPI PDEVICE_OBJECT WdGetLowestDeviceObject( IN PVOID Watch );
WATCHDOGAPI VOID WdReferenceObject( IN PVOID Watch );
#ifdef __cplusplus
} #endif // __cplusplus
#endif // _WATCHDOG_H_
|