/*++ 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