/*++ Copyright (c) 2000 Microsoft Corporation Module Name: vffileio.c Abstract: This module contains code that monitors file I/O functions for misuse. Author: Adrian J. Oney (adriao) 19-Dec-2000 Environment: Kernel mode Revision History: --*/ #include "vfdef.h" #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGEVRFY,VerifierNtCreateFile) #pragma alloc_text(PAGEVRFY,VerifierNtWriteFile) #pragma alloc_text(PAGEVRFY,VerifierNtReadFile) #endif // ALLOC_PRAGMA 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 ) { // // We use VERIFIER_OPTION_TRACK_IRPS until we add a generic IOVerifier // setting. // if (VfSettingsIsOptionEnabled(NULL, VERIFIER_OPTION_TRACK_IRPS)) { if (KeGetCurrentIrql() > PASSIVE_LEVEL) { // // The driver has made a mistake. Fail it now. // WDM_FAIL_ROUTINE(( DCERROR_FILE_IO_AT_BAD_IRQL, DCPARAM_ROUTINE, _ReturnAddress() )); } } return NtCreateFile( FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, 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 ) { // // We use VERIFIER_OPTION_TRACK_IRPS until we add a generic IOVerifier // setting. // if (VfSettingsIsOptionEnabled(NULL, VERIFIER_OPTION_TRACK_IRPS)) { if (KeGetCurrentIrql() > PASSIVE_LEVEL) { // // The driver has made a mistake. Fail it now. // WDM_FAIL_ROUTINE(( DCERROR_FILE_IO_AT_BAD_IRQL, DCPARAM_ROUTINE, _ReturnAddress() )); } } return NtWriteFile( FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key ); } 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 ) { // // We use VERIFIER_OPTION_TRACK_IRPS until we add a generic IOVerifier // setting. // if (VfSettingsIsOptionEnabled(NULL, VERIFIER_OPTION_TRACK_IRPS)) { if (KeGetCurrentIrql() > PASSIVE_LEVEL) { // // The driver has made a mistake. Fail it now. // WDM_FAIL_ROUTINE(( DCERROR_FILE_IO_AT_BAD_IRQL, DCPARAM_ROUTINE, _ReturnAddress() )); } } return NtReadFile( FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key ); }