176 lines
3.6 KiB
C
176 lines
3.6 KiB
C
|
/*++
|
||
|
|
||
|
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
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|