/*++ Copyright (c) 1991 - 2001 Microsoft Corporation Module Name: #### ## # ###### ##### ##### ## # ### ## ## ## ## ### # ## ## ## ## ### # ### ## ## ## ## #### # ## ## ## ## #### # ## ## ## ## ## ## # #### ## ##### ##### # #### ## ## ## ####### ## # ### ## ## #### # ### ####### ## ## ## ## # ## ## ## ## ## # ## ## ## ## ## ## ## #### # # ## ##### ## ## # # ## ## ##### ## ## ## Abstract: This header contains all definitions that are internal to the watchdog driver. Author: Wesley Witt (wesw) 23-Jan-2002 Environment: Kernel mode only. Notes: --*/ extern "C" { #include #include #include #include #include #include #include #include #include } #pragma warning(error:4101) // Unreferenced local variable // // externs // extern ULONG ShutdownCountTime; extern ULONG RunningCountTime; extern ULONG WdDebugLevel; extern ULONG OsMajorVersion; extern ULONG OsMinorVersion; extern PWATCHDOG_TIMER_RESOURCE_TABLE WdTable; // // Memory allocation /// #define WD_POOL_TAG 'tpaS' #ifdef POOL_TAGGING #ifdef ExAllocatePool #undef ExAllocatePool #endif #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,WD_POOL_TAG) #endif // // General purpose macros // #define STRING_SZ(_str) (wcslen((PWSTR)_str)*sizeof(WCHAR)) #define ARRAY_SZ(_ary) (sizeof(_ary)/sizeof(_ary[0])) #define SecToNano(_sec) (LONGLONG)((_sec) * 1000 * 1000 * 10) #define NanoToSec(_nano) (ULONG)((_nano) / (1000 * 1000 * 10)) #define CLEARBITS(_val,_mask) ((_val) &= ~(_mask)) #define SETBITS(_val,_mask) ((_val) |= (_mask)) #define MIN_TIMEOUT_VALUE (100) // // Control Register Bits // #define WATCHDOG_CONTROL_TRIGGER 0x80 // Setting this to 1 causes a new countdown to start #define WATCHDOG_CONTROL_BIOS_JUMPER 0x08 // Is the timer disabled in the BIOS? (0=false,1=true) #define WATCHDOG_CONTROL_TIMER_MODE 0x04 // Controls what happens when the timer fires (0=reset,1=shutdown) #define WATCHDOG_CONTROL_FIRED 0x02 // The timer fired causing the last reboot #define WATCHDOG_CONTROL_ENABLE 0x01 // Starts/stops the timer typedef struct _SYSTEM_HEALTH_DATA { ULONG CpuCount; LONG HealthyCpuRatio; LONGLONG TickCountPrevious; LONGLONG ContextSwitchesPrevious; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION ProcInfo; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION ProcInfoPrev; ULONG ProcInfoSize; LONG ContextSwitchRate; LONG CPUTime; LONG ContextCpuRatio; } SYSTEM_HEALTH_DATA, *PSYSTEM_HEALTH_DATA; typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT TargetObject; PDEVICE_OBJECT Pdo; LONG IsStarted; LONG IsRemoved; IO_REMOVE_LOCK RemoveLock; KSPIN_LOCK DeviceLock; KTIMER Timer; KDPC TimerDpc; PULONG ControlRegisterAddress; PULONG CountRegisterAddress; ULONG MaxCount; ULONG DpcTimeout; ULONG Units; ULONG HardwareTimeout; SYSTEM_HEALTH_DATA Health; ULONG WdState; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // // Debug Stuff // #define WD_DEBUG_ERROR_LEVEL 0x00000001 #define WD_WARNING_LEVEL 0x00000002 #define WD_DEBUG_TRACE_LEVEL 0x00000004 #define WD_DEBUG_INFO_LEVEL 0x00000008 #define WD_DEBUG_IGNORE_LEVEL 0xffffffff #if DBG #define DebugPrint(_X_) WdDebugPrint _X_ #else #define DebugPrint(_X_) #endif #define REPORT_ERROR(_msg_,_status_) \ DebugPrint(( WD_DEBUG_ERROR_LEVEL, "%s [0x%08x]: %s @ %d\n", _msg_, _status_, __FILE__, __LINE__ )) #define ERROR_RETURN(_msg_,_status_) \ { \ REPORT_ERROR(_msg_,_status_); \ __leave; \ } #if DBG VOID WdDebugPrint( IN ULONG DebugLevel, IN PSTR DebugMessage, IN ... ); PCHAR PnPMinorFunctionString( UCHAR MinorFunction ); PCHAR IoctlString( ULONG IoControlCode ); PCHAR PowerMinorFunctionString( UCHAR MinorFunction ); PCHAR PowerSystemStateString( SYSTEM_POWER_STATE State ); PCHAR PowerDeviceStateString( DEVICE_POWER_STATE State ); PCHAR PnPMinorFunctionString( UCHAR MinorFunction ); #endif // // prototypes // extern "C" { NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS WdPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS WdAddDevice( IN PDRIVER_OBJECT DriverObject, IN OUT PDEVICE_OBJECT PhysicalDeviceObject ); NTSTATUS WdPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS WdShutdown( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS WdSystemControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS WdDefaultDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS WdHandlerFunction( IN WATCHDOG_HANDLER_ACTION Action, IN PVOID Context, IN OUT PULONG DataValue, IN BOOLEAN NoLocks ); } // extern "C" NTSTATUS WdInitializeSoftwareTimer( PDEVICE_EXTENSION DeviceExtension ); // // util.cpp // VOID PrintDriverVersion( IN PDRIVER_OBJECT DriverObject ); NTSTATUS CallLowerDriverAndWait( IN PIRP Irp, IN PDEVICE_OBJECT TargetObject ); NTSTATUS CompleteRequest( PIRP Irp, NTSTATUS Status, ULONG_PTR OutputLength ); NTSTATUS ForwardRequest( IN PIRP Irp, IN PDEVICE_OBJECT TargetObject ); NTSTATUS OpenParametersRegistryKey( IN PUNICODE_STRING RegistryPath, IN ULONG AccessMode, OUT PHANDLE RegistryHandle ); NTSTATUS CreateParametersRegistryKey( IN PUNICODE_STRING RegistryPath, OUT PHANDLE parametersKey ); NTSTATUS ReadRegistryValue( IN PUNICODE_STRING RegistryPath, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *KeyInformation ); NTSTATUS WriteRegistryValue( IN PUNICODE_STRING RegistryPath, IN PWSTR ValueName, IN ULONG RegistryType, IN PVOID RegistryValue, IN ULONG RegistryValueLength ); VOID GetOsVersion( VOID ); NTSTATUS WdInitializeSystemHealth( PSYSTEM_HEALTH_DATA Health ); BOOLEAN WdCheckSystemHealth( PSYSTEM_HEALTH_DATA Health ); NTSTATUS WriteEventLogEntry ( IN PDEVICE_EXTENSION DeviceExtension, IN ULONG ErrorCode, IN PVOID InsertionStrings, OPTIONAL IN ULONG StringCount, OPTIONAL IN PVOID DumpData, OPTIONAL IN ULONG DataSize OPTIONAL ); ULONG ConvertTimeoutFromMilliseconds( IN ULONG Units, IN ULONG UserTimeout ); ULONG ConvertTimeoutToMilliseconds( IN ULONG Units, IN ULONG NativeTimeout ); PVOID WdGetAcpiTable( IN ULONG Signature ); VOID PingWatchdogTimer( IN PDEVICE_EXTENSION DeviceExtension, IN BOOLEAN LockResources ); void WdHandlerSetTimeoutValue( IN PDEVICE_EXTENSION DeviceExtension, IN ULONG Timeout, IN BOOLEAN PingTimer ); ULONG WdHandlerQueryTimeoutValue( IN PDEVICE_EXTENSION DeviceExtension ); void WdHandlerResetTimer( IN PDEVICE_EXTENSION DeviceExtension ); void WdHandlerStopTimer( IN PDEVICE_EXTENSION DeviceExtension ); void WdHandlerStartTimer( IN PDEVICE_EXTENSION DeviceExtension ); void WdHandlerSetTriggerAction( IN PDEVICE_EXTENSION DeviceExtension, IN ULONG TriggerAction ); ULONG WdHandlerQueryTriggerAction( IN PDEVICE_EXTENSION DeviceExtension ); ULONG WdHandlerQueryState( IN PDEVICE_EXTENSION DeviceExtension, IN BOOLEAN QueryFiredFromDevice ); void WdHandlerResetFired( IN PDEVICE_EXTENSION DeviceExtension );