//
// Driver Verifier Control Applet
// Copyright (c) Microsoft Corporation, 1999
//

//
// header: verify.hxx
// author: silviuc
// created: Mon Jan 04 12:34:19 1999
//

#ifndef _VERIFY_HXX_INCLUDED_
#define _VERIFY_HXX_INCLUDED_

//
// Constant:
//
//  MI_SUSPECT_DRIVER_BUFFER_LENGTH
//
// Description:
//
//  The maximum length of the string containing the
//  driver names (according to ntos\mm\mi.h
//

#define MI_SUSPECT_DRIVER_BUFFER_LENGTH 512


//
// Constant:
//
//  VRFP_MAX_NUMBER_DRIVERS
//
// Description:
//
//  The maximum number of drivers we can deal with.
//

#define VRFP_MAX_NUMBER_DRIVERS 256


//
// Type:
//
//     VRF_DRIVER_STATE
//
// Description:
//
//     This is the type to represent the state of the driver
//     from the verifier perspective. The name of the driver
//     is just the file name without path therefore we have
//     just a small name buffer.
//

typedef struct {

    TCHAR Name [ _MAX_PATH ];
    BOOL Verified;
    BOOL CurrentlyVerified;
    TCHAR Provider[ 128 ];
    TCHAR Version[ 64 ];

} VRF_DRIVER_STATE, * PVRF_DRIVER_STATE;


//
// Type:
//
//     VRF_VERIFIER_STATE
//
// Description:
//
//     This is the type used for data transfer from/to the registry
//     driver verifier settings. The `DriverInfo' and `DriverNames'
//     fields are filled with pointers to internal data structures
//     when VrfGetVerifierState() is called. The caller of this function
//     does not have to deallocate or manage in any other way these
//     areas.
//

typedef struct {

    BOOL AllDriversVerified;

    BOOL SpecialPoolVerification;
    BOOL PagedCodeVerification;
    BOOL AllocationFaultInjection;
    BOOL PoolTracking;
    BOOL IoVerifier;
    ULONG SysIoVerifierLevel;

    ULONG DriverCount;
    TCHAR DriverNames[ MI_SUSPECT_DRIVER_BUFFER_LENGTH ];
    VRF_DRIVER_STATE DriverInfo[ VRFP_MAX_NUMBER_DRIVERS ];

    TCHAR AdditionalDriverNames[ MI_SUSPECT_DRIVER_BUFFER_LENGTH ];

} VRF_VERIFIER_STATE, * PVRF_VERIFIER_STATE;


//
// Type:
//
//     KRN_DRIVER_STATE
//
// Description:
//
//     This type reflects the per user information as it is
//     maintained by the system verifier.
//

typedef struct {

    TCHAR Name [ _MAX_PATH ];

    ULONG Loads;
    ULONG Unloads;

    ULONG CurrentPagedPoolAllocations;
    ULONG CurrentNonPagedPoolAllocations;
    ULONG PeakPagedPoolAllocations;
    ULONG PeakNonPagedPoolAllocations;

    SIZE_T PagedPoolUsageInBytes;
    SIZE_T NonPagedPoolUsageInBytes;
    SIZE_T PeakPagedPoolUsageInBytes;
    SIZE_T PeakNonPagedPoolUsageInBytes;

} KRN_DRIVER_STATE, * PKRN_DRIVER_STATE;


//
// Type:
//
//     KRN_VERIFIER_STATE
//
// Description:
//
//     This type reflects the global information as it is
//     maintained by the system verifier.
//

typedef struct {

    ULONG Level;

    BOOL SpecialPool;
    BOOL IrqlChecking;
    BOOL FaultInjection;
    BOOL PoolTrack;
    BOOL IoVerif;

    ULONG RaiseIrqls;
    ULONG AcquireSpinLocks;
    ULONG SynchronizeExecutions;
    ULONG AllocationsAttempted;

    ULONG AllocationsSucceeded;
    ULONG AllocationsSucceededSpecialPool;
    ULONG AllocationsWithNoTag;

    ULONG Trims;
    ULONG AllocationsFailed;
    ULONG AllocationsFailedDeliberately;

    ULONG UnTrackedPool;

    ULONG DriverCount;
    KRN_DRIVER_STATE DriverInfo[ VRFP_MAX_NUMBER_DRIVERS ];

} KRN_VERIFIER_STATE, * PKRN_VERIFIER_STATE;


//
// array length macro
//

#define ARRAY_LENGTH( array ) ( sizeof( array ) / sizeof( array[ 0 ] ) )

//
// Verifier management functions
//

BOOL
VrfGetVerifierState (

    PVRF_VERIFIER_STATE VrfState);

BOOL
VrfSetVerifierState (

    PVRF_VERIFIER_STATE VrfState);


BOOL
VrfSetVolatileFlags (

    UINT uNewFlags);

BOOL
VrfSetVolatileOptions(

    BOOL bSpecialPool,
    BOOL bIrqlChecking,
    BOOL bFaultInjection );

BOOL
VrfClearAllVerifierSettings (

    );

BOOL
VrfNotifyDriverSelection (

    PVRF_VERIFIER_STATE VrfState,
    ULONG Index );

//
// Support for dynamic set of verified drivers
//

BOOL VrfVolatileAddDriver( 

    const WCHAR *szDriverName );

BOOL VrfVolatileRemoveDriver( 

    const WCHAR *szDriverName );


//
// System verifier information
//

BOOL
KrnGetSystemVerifierState (

    PKRN_VERIFIER_STATE KrnState);

//
// Command line execution
//

DWORD
VrfExecuteCommandLine (

    int Count,
    LPTSTR Args[]);

//
// Miscellaneous functions
//

void
__cdecl
VrfError ( // defined in modspage.cxx

    LPTSTR fmt,
    ...);

void
__cdecl
VrfErrorResourceFormat( // defined in modspage.cxx

    UINT uIdResourceFormat,
    ... );

//////////////////////////////////////////////////////////////////////
/////////////////////////////////////////// strings operations support
//////////////////////////////////////////////////////////////////////

BOOL
GetStringFromResources(

    UINT uIdResource,
    TCHAR *strBuffer,
    int nBufferLength );

void
VrfPrintStringFromResources(

    UINT uIdResource);

BOOL
VrfOuputStringFromResources(

    UINT uIdResource,
    BOOL bConvertToOEM,
    FILE *file );   // returns FALSE on a _fputts error (disk full)

void
VrfPrintNarrowStringOEMFormat(

    char *szText );

BOOL
VrfOutputWideStringOEMFormat(

    LPTSTR strText,
    BOOL bAppendNewLine,
    FILE *file );   // returns FALSE on a fprintf of fputs error (disk full)

BOOL
__cdecl
VrfFTPrintf(
    BOOL bConvertToOEM,
    FILE *file,
    LPTSTR fmt,
    ...);           // returns FALSE on a _ftprintf error (disk full)

BOOL
__cdecl
VrfFTPrintfResourceFormat(
    BOOL bConvertToOEM,
    FILE *file,
    UINT uIdResFmtString,
    ...);           // returns FALSE on a _ftprintf error (disk full)

void
__cdecl
VrfTPrintfResourceFormat(
    UINT uIdResFmtString,
    ...);

void
VrfPutTS(
    LPTSTR strText );

//
// Exit codes for cmd line execution
//

#define EXIT_CODE_SUCCESS       0
#define EXIT_CODE_ERROR         1
#define EXIT_CODE_REBOOT_NEEDED 2

//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////// Global Data
//////////////////////////////////////////////////////////////////////

//
// Command line / GUI
//

extern BOOL g_bCommandLineMode;

//
// OS version and build number information
//

extern OSVERSIONINFO g_OsVersion;

// ...
#endif // #ifndef _VERIFY_HXX_INCLUDED_

//
// end of header: verify.hxx
//