413 lines
8.1 KiB
C
413 lines
8.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
verifeir.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains the internal structure definitions and APIs used by
|
||
|
Driver Verifier.
|
||
|
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Jordan Tigani (jtigani) 2-May-2000
|
||
|
Silviu Calinoiu (silviuc) 9-May-2000
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#ifndef _VERIFIER_
|
||
|
#define _VERIFIER_
|
||
|
|
||
|
//
|
||
|
// Resource types handled by deadlock detection package.
|
||
|
//
|
||
|
|
||
|
typedef enum _VI_DEADLOCK_RESOURCE_TYPE {
|
||
|
VfDeadlockUnknown = 0,
|
||
|
VfDeadlockMutex,
|
||
|
VfDeadlockFastMutex,
|
||
|
VfDeadlockFastMutexUnsafe,
|
||
|
VfDeadlockSpinLock,
|
||
|
VfDeadlockQueuedSpinLock,
|
||
|
VfDeadlockTypeMaximum
|
||
|
} VI_DEADLOCK_RESOURCE_TYPE, *PVI_DEADLOCK_RESOURCE_TYPE;
|
||
|
|
||
|
//
|
||
|
// HAL Verifier functions
|
||
|
//
|
||
|
|
||
|
|
||
|
struct _DMA_ADAPTER *
|
||
|
VfGetDmaAdapter(
|
||
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
||
|
IN struct _DEVICE_DESCRIPTION *DeviceDescription,
|
||
|
IN OUT PULONG NumberOfMapRegisters
|
||
|
);
|
||
|
|
||
|
PVOID
|
||
|
VfAllocateCrashDumpRegisters(
|
||
|
IN PADAPTER_OBJECT AdapterObject,
|
||
|
IN PULONG NumberOfMapRegisters
|
||
|
);
|
||
|
|
||
|
|
||
|
#if !defined(NO_LEGACY_DRIVERS)
|
||
|
VOID
|
||
|
VfPutDmaAdapter(
|
||
|
struct _DMA_ADAPTER * DmaAdapter
|
||
|
);
|
||
|
|
||
|
|
||
|
PVOID
|
||
|
VfAllocateCommonBuffer(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN ULONG Length,
|
||
|
OUT PPHYSICAL_ADDRESS LogicalAddress,
|
||
|
IN BOOLEAN CacheEnabled
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfFreeCommonBuffer(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN ULONG Length,
|
||
|
IN PHYSICAL_ADDRESS LogicalAddress,
|
||
|
IN PVOID VirtualAddress,
|
||
|
IN BOOLEAN CacheEnabled
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
VfAllocateAdapterChannel(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN ULONG NumberOfMapRegisters,
|
||
|
IN PDRIVER_CONTROL ExecutionRoutine,
|
||
|
IN PVOID Context
|
||
|
);
|
||
|
|
||
|
PHYSICAL_ADDRESS
|
||
|
VfMapTransfer(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN PMDL Mdl,
|
||
|
IN PVOID MapRegisterBase,
|
||
|
IN PVOID CurrentVa,
|
||
|
IN OUT PULONG Length,
|
||
|
IN BOOLEAN WriteToDevice
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
VfFlushAdapterBuffers(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN PMDL Mdl,
|
||
|
IN PVOID MapRegisterBase,
|
||
|
IN PVOID CurrentVa,
|
||
|
IN ULONG Length,
|
||
|
IN BOOLEAN WriteToDevice
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfFreeAdapterChannel(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfFreeMapRegisters(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
PVOID MapRegisterBase,
|
||
|
ULONG NumberOfMapRegisters
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
VfGetDmaAlignment(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
VfReadDmaCounter(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
VfGetScatterGatherList (
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PMDL Mdl,
|
||
|
IN PVOID CurrentVa,
|
||
|
IN ULONG Length,
|
||
|
IN PVOID ExecutionRoutine,
|
||
|
IN PVOID Context,
|
||
|
IN BOOLEAN WriteToDevice
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfPutScatterGatherList(
|
||
|
IN struct _DMA_ADAPTER * DmaAdapter,
|
||
|
IN struct _SCATTER_GATHER_LIST * ScatterGather,
|
||
|
IN BOOLEAN WriteToDevice
|
||
|
);
|
||
|
|
||
|
PADAPTER_OBJECT
|
||
|
VfLegacyGetAdapter(
|
||
|
IN struct _DEVICE_DESCRIPTION *DeviceDescription,
|
||
|
IN OUT PULONG NumberOfMapRegisters
|
||
|
);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
LARGE_INTEGER
|
||
|
VfQueryPerformanceCounter(
|
||
|
IN PLARGE_INTEGER PerformanceFrequency OPTIONAL
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfHalDeleteDevice(
|
||
|
IN PDEVICE_OBJECT DeviceObject
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfDisableHalVerifier (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Resource interfaces for deadlock detection package.
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
VfDeadlockDetectionInitialize(
|
||
|
IN LOGICAL VerifyAllDrivers,
|
||
|
IN LOGICAL VerifyKernel
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfDeadlockDetectionCleanup (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
VfDeadlockInitializeResource(
|
||
|
IN PVOID Resource,
|
||
|
IN VI_DEADLOCK_RESOURCE_TYPE Type,
|
||
|
IN PVOID Caller,
|
||
|
IN BOOLEAN DoNotAcquireLock
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfDeadlockAcquireResource(
|
||
|
IN PVOID Resource,
|
||
|
IN VI_DEADLOCK_RESOURCE_TYPE Type,
|
||
|
IN PKTHREAD Thread,
|
||
|
IN BOOLEAN TryAcquire,
|
||
|
IN PVOID Caller
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
VfDeadlockReleaseResource(
|
||
|
IN PVOID Resource,
|
||
|
IN VI_DEADLOCK_RESOURCE_TYPE Type,
|
||
|
IN PKTHREAD Thread,
|
||
|
IN PVOID Caller
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Used for resource garbage collection.
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
VfDeadlockDeleteMemoryRange(
|
||
|
IN PVOID Address,
|
||
|
IN SIZE_T Size
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Notification from the pool manager so deadlock hierarchies can be terminated.
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
VerifierDeadlockFreePool(
|
||
|
IN PVOID Address,
|
||
|
IN SIZE_T NumberOfBytes
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Verifier versions to catch file I/O above PASSIVE_LEVEL
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
VerifierNtCreateFile(
|
||
|
OUT PHANDLE FileHandle,
|
||
|
IN ACCESS_MASK DesiredAccess,
|
||
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
|
IN PLARGE_INTEGER AllocationSize OPTIONAL,
|
||
|
IN ULONG FileAttributes,
|
||
|
IN ULONG ShareAccess,
|
||
|
IN ULONG CreateDisposition,
|
||
|
IN ULONG CreateOptions,
|
||
|
IN PVOID EaBuffer OPTIONAL,
|
||
|
IN ULONG EaLength
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
VerifierNtWriteFile(
|
||
|
IN HANDLE FileHandle,
|
||
|
IN HANDLE Event OPTIONAL,
|
||
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||
|
IN PVOID ApcContext OPTIONAL,
|
||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
|
IN PVOID Buffer,
|
||
|
IN ULONG Length,
|
||
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
||
|
IN PULONG Key OPTIONAL
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
VerifierNtReadFile(
|
||
|
IN HANDLE FileHandle,
|
||
|
IN HANDLE Event OPTIONAL,
|
||
|
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
|
||
|
IN PVOID ApcContext OPTIONAL,
|
||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||
|
OUT PVOID Buffer,
|
||
|
IN ULONG Length,
|
||
|
IN PLARGE_INTEGER ByteOffset OPTIONAL,
|
||
|
IN PULONG Key OPTIONAL
|
||
|
);
|
||
|
|
||
|
typedef enum {
|
||
|
|
||
|
//
|
||
|
// Bugs in this class are severe enough that the hardware should be removed
|
||
|
// from a running production machine.
|
||
|
//
|
||
|
VFFAILURE_FAIL_IN_FIELD = 0,
|
||
|
|
||
|
//
|
||
|
// Bugs of this class are severe enough for WHQL to deny a logo for the
|
||
|
// failing whateverware.
|
||
|
//
|
||
|
VFFAILURE_FAIL_LOGO = 1,
|
||
|
|
||
|
//
|
||
|
// Bugs of this class stop the machine only if it is running under a kernel
|
||
|
// debugger.
|
||
|
//
|
||
|
VFFAILURE_FAIL_UNDER_DEBUGGER = 2
|
||
|
|
||
|
} VF_FAILURE_CLASS, *PVF_FAILURE_CLASS;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Example usage: (note - perMinorFlags statically preinitialized to zero)
|
||
|
//
|
||
|
// VfFailDeviceNode(
|
||
|
// PhysicalDeviceObject
|
||
|
// major,
|
||
|
// minor,
|
||
|
// VFFAILURE_FAIL_LOGO,
|
||
|
// &perMinorFlags,
|
||
|
// "Device %DevObj mishandled register %Ulong",
|
||
|
// "%Ulong%DevObj",
|
||
|
// value,
|
||
|
// deviceObject
|
||
|
// );
|
||
|
//
|
||
|
VOID
|
||
|
VfFailDeviceNode(
|
||
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
||
|
IN ULONG BugCheckMajorCode,
|
||
|
IN ULONG BugCheckMinorCode,
|
||
|
IN VF_FAILURE_CLASS FailureClass,
|
||
|
IN OUT PULONG AssertionControl,
|
||
|
IN PSTR DebuggerMessageText,
|
||
|
IN PSTR ParameterFormatString,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Example usage: (note - perMinorFlags statically preinitialized to zero)
|
||
|
//
|
||
|
// VfFailDriver(
|
||
|
// major,
|
||
|
// minor,
|
||
|
// VFFAILURE_FAIL_LOGO,
|
||
|
// &perMinorFlags,
|
||
|
// "Driver at %Routine returned %Ulong",
|
||
|
// "%Ulong%Routine",
|
||
|
// value,
|
||
|
// routine
|
||
|
// );
|
||
|
//
|
||
|
VOID
|
||
|
VfFailDriver(
|
||
|
IN ULONG BugCheckMajorCode,
|
||
|
IN ULONG BugCheckMinorCode,
|
||
|
IN VF_FAILURE_CLASS FailureClass,
|
||
|
IN OUT PULONG AssertionControl,
|
||
|
IN PSTR DebuggerMessageText,
|
||
|
IN PSTR ParameterFormatString,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Example usage: (note - perMinorFlags statically preinitialized to zero)
|
||
|
//
|
||
|
// VfFailSystemBIOS(
|
||
|
// major,
|
||
|
// minor,
|
||
|
// VFFAILURE_FAIL_LOGO,
|
||
|
// &perMinorFlags,
|
||
|
// "Driver at %Routine returned %Ulong",
|
||
|
// "%Ulong%Routine",
|
||
|
// value,
|
||
|
// routine
|
||
|
// );
|
||
|
//
|
||
|
VOID
|
||
|
VfFailSystemBIOS(
|
||
|
IN ULONG BugCheckMajorCode,
|
||
|
IN ULONG BugCheckMinorCode,
|
||
|
IN VF_FAILURE_CLASS FailureClass,
|
||
|
IN OUT PULONG AssertionControl,
|
||
|
IN PSTR DebuggerMessageText,
|
||
|
IN PSTR ParameterFormatString,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
typedef enum {
|
||
|
|
||
|
//
|
||
|
// Driver object
|
||
|
//
|
||
|
VFOBJTYPE_DRIVER = 0,
|
||
|
|
||
|
//
|
||
|
// Physical Device Object pointing to hardware
|
||
|
//
|
||
|
VFOBJTYPE_DEVICE,
|
||
|
|
||
|
//
|
||
|
// System BIOS (no object)
|
||
|
//
|
||
|
VFOBJTYPE_SYSTEM_BIOS
|
||
|
|
||
|
} VF_OBJECT_TYPE;
|
||
|
|
||
|
BOOLEAN
|
||
|
VfIsVerificationEnabled(
|
||
|
IN VF_OBJECT_TYPE VfObjectType,
|
||
|
IN PVOID Object OPTIONAL
|
||
|
);
|
||
|
|
||
|
#endif
|
||
|
|