2020-09-30 17:12:29 +02:00

1200 lines
27 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++ BUILD Version: 0002
Copyright (c) 1989 Microsoft Corporation
Module Name:
iop.h
Abstract:
This module contains the private structure definitions and APIs used by
the NT I/O system.
Author:
Darryl E. Havens (darrylh) 17-Apr-1989
Revision History:
--*/
#ifndef _IOP_
#define _IOP_
#include "ntos.h"
#include "ntdddisk.h"
#include "ntddscsi.h"
#include "ntiodump.h"
#include "ntiolog.h"
#include "ntiologc.h"
#include "ntseapi.h"
#include "zwapi.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fsrtl.h"
//#if defined(_PNP_POWER_)
#include "pnpiop.h"
//#endif
#ifdef POOL_TAGGING
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' oI')
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' oI')
#endif
extern ULONG BreakDiskByteOffset;
extern ULONG BreakPfn;
//
// Define Information fields values for the return value from popups when a
// volume mount is in progress but failed.
//
#define IOP_ABORT 1
//
// Define transfer types for process counters.
//
typedef enum _TRANSFER_TYPE {
ReadTransfer,
WriteTransfer,
OtherTransfer
} TRANSFER_TYPE, *PTRANSFER_TYPE;
//
// Define the maximum amount of memory that can be allocated for all
// outstanding error log packets.
//
#define IOP_MAXIMUM_LOG_ALLOCATION PAGE_SIZE
//
// Define an error log entry.
//
typedef struct _ERROR_LOG_ENTRY {
USHORT Type;
USHORT Size;
LIST_ENTRY ListEntry;
PDEVICE_OBJECT DeviceObject;
PDRIVER_OBJECT DriverObject;
LARGE_INTEGER TimeStamp;
} ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY;
//
// Define both the global IOP_HARD_ERROR_QUEUE and IOP_HARD_ERROR_PACKET
// structures. Also set the maximum number of outstanding hard error
// packets allowed.
//
typedef struct _IOP_HARD_ERROR_QUEUE {
WORK_QUEUE_ITEM ExWorkItem;
LIST_ENTRY WorkQueue;
KSPIN_LOCK WorkQueueSpinLock;
KSEMAPHORE WorkQueueSemaphore;
BOOLEAN ThreadStarted;
} IOP_HARD_ERROR_QUEUE, *PIOP_HARD_ERROR_QUEUE;
typedef struct _IOP_HARD_ERROR_PACKET {
LIST_ENTRY WorkQueueLinks;
NTSTATUS ErrorStatus;
UNICODE_STRING String;
} IOP_HARD_ERROR_PACKET, *PIOP_HARD_ERROR_PACKET;
typedef struct _IOP_APC_HARD_ERROR_PACKET {
WORK_QUEUE_ITEM Item;
PIRP Irp;
PVPB Vpb;
PDEVICE_OBJECT RealDeviceObject;
} IOP_APC_HARD_ERROR_PACKET, *PIOP_APC_HARD_ERROR_PACKET;
extern IOP_HARD_ERROR_QUEUE IopHardError;
extern PIOP_HARD_ERROR_PACKET IopCurrentHardError;
#define IOP_MAXIMUM_OUTSTANDING_HARD_ERRORS 25
//
// Define the global data for the error logger and I/O system.
//
extern WORK_QUEUE_ITEM IopErrorLogWorkItem;
extern BOOLEAN IopErrorLogPortPending;
extern KSPIN_LOCK IopErrorLogLock;
extern LIST_ENTRY IopErrorLogListHead;
extern ULONG IopErrorLogAllocation;
extern KSPIN_LOCK IopErrorLogAllocationLock;
extern KSPIN_LOCK IopCancelSpinLock;
extern KSPIN_LOCK IopVpbSpinLock;
extern GENERIC_MAPPING IopFileMapping;
extern GENERIC_MAPPING IopCompletionMapping;
//
// Define a dummy file object for use on stack for fast open operations.
//
typedef struct _DUMMY_FILE_OBJECT {
OBJECT_HEADER ObjectHeader;
CHAR FileObjectBody[ sizeof( FILE_OBJECT ) ];
} DUMMY_FILE_OBJECT, *PDUMMY_FILE_OBJECT;
//
// Define the structures private to the I/O system.
//
#define OPEN_PACKET_PATTERN 0xbeaa0251
//
// Define an Open Packet (OP). An OP is used to communicate information
// between the NtCreateFile service executing in the context of the caller
// and the device object parse routine. It is the parse routine who actually
// creates the file object for the file.
//
typedef struct _OPEN_PACKET {
CSHORT Type;
CSHORT Size;
PFILE_OBJECT FileObject;
NTSTATUS FinalStatus;
ULONG Information;
ULONG ParseCheck;
PFILE_OBJECT RelatedFileObject;
//
// The following are the open-specific parameters. Notice that the desired
// access field is passed through to the parse routine via the object
// management architecture, so it does not need to be repeated here. Also
// note that the same is true for the file name.
//
LARGE_INTEGER AllocationSize;
ULONG CreateOptions;
USHORT FileAttributes;
USHORT ShareAccess;
PVOID EaBuffer;
ULONG EaLength;
ULONG Options;
ULONG Disposition;
//
// The following is used when performing a fast query during open to get
// back the file attributes for a file.
//
PFILE_BASIC_INFORMATION BasicInformation;
//
// The following is used when performing a fast network query during open
// to get back the network file attributes for a file.
//
PFILE_NETWORK_OPEN_INFORMATION NetworkInformation;
//
// The type of file to create.
//
CREATE_FILE_TYPE CreateFileType;
//
// The following pointer provides a way of passing the parameters
// specific to the file type of the file being created to the parse
// routine.
//
PVOID ExtraCreateParameters;
//
// The following is used to indicate that an open of a device has been
// performed and the access check for the device has already been done,
// but because of a reparse, the I/O system has been called again for
// the same device. Since the access check has already been made, the
// state cannot handle being called again (access was already granted)
// and it need not anyway since the check has already been made.
//
BOOLEAN Override;
//
// The following is used to indicate that a file is being opened for the
// sole purpose of querying its attributes. This causes a considerable
// number of shortcuts to be taken in the parse, query, and close paths.
//
BOOLEAN QueryOnly;
//
// The following is used to indicate that a file is being opened for the
// sole purpose of deleting it. This causes a considerable number of
// shortcurs to be taken in the parse and close paths.
//
BOOLEAN DeleteOnly;
//
// The following is used to indicate that a file being opened for a query
// only is being opened to query its network attributes rather than just
// its FAT file attributes.
//
BOOLEAN FullAttributes;
//
// The following pointer is used when a fast open operation for a fast
// delete or fast query attributes call is being made rather than a
// general file open. The dummy file object is actually stored on the
// the caller's stack rather than allocated pool to speed things up.
//
PDUMMY_FILE_OBJECT LocalFileObject;
} OPEN_PACKET, *POPEN_PACKET;
//
// Define a Load Packet (LDP). A LDP is used to communicate load and unload
// driver information between the appropriate system services and the routine
// that actually performs the work. This is implemented using a packet
// because various drivers need to be initialized in the context of THE
// system process because they create threads within its context which open
// handles to objects that henceforth are only valid in the context of that
// process.
//
typedef struct _LOAD_PACKET {
WORK_QUEUE_ITEM WorkQueueItem;
KEVENT Event;
PDRIVER_OBJECT DriverObject;
PUNICODE_STRING DriverServiceName;
NTSTATUS FinalStatus;
} LOAD_PACKET, *PLOAD_PACKET;
//
// Define the type for entries placed on the driver reinitialization queue.
// These entries are entered onto the tail when the driver requests that
// it be reinitialized, and removed from the head by the code that actually
// performs the reinitialization.
//
typedef struct _REINIT_PACKET {
LIST_ENTRY ListEntry;
PDRIVER_OBJECT DriverObject;
PDRIVER_REINITIALIZE DriverReinitializationRoutine;
PVOID Context;
} REINIT_PACKET, *PREINIT_PACKET;
//
// Define the type for entries placed on the driver shutdown notification queue.
// These entries represent those drivers that would like to be notified that the
// system is begin shutdown before it actually goes down.
//
typedef struct _SHUTDOWN_PACKET {
LIST_ENTRY ListEntry;
PDEVICE_OBJECT DeviceObject;
} SHUTDOWN_PACKET, *PSHUTDOWN_PACKET;
//
// Define the type for entries placed on the file system registration change
// notification queue.
//
typedef struct _NOTIFICATION_PACKET {
LIST_ENTRY ListEntry;
PDRIVER_OBJECT DriverObject;
PDRIVER_FS_NOTIFICATION NotificationRoutine;
} NOTIFICATION_PACKET, *PNOTIFICATION_PACKET;
//
// Define the type for completion packets inserted onto completion ports when
// there is no full I/O request packet that was used to perform the I/O
// operation. This occurs when the fast I/O path is used, and when the user
// directly inserts a completion message.
//
typedef struct _IOP_MINI_COMPLETION_PACKET {
LIST_ENTRY ListEntry;
ULONG TypeFlag;
ULONG KeyContext;
PVOID ApcContext;
NTSTATUS IoStatus;
ULONG IoStatusInformation;
} IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET;
//
// Define the type for a dump control block. This structure is used to describe
// all of the data, drivers, and memory necessary to dump all of physical memory
// to the disk after a bugcheck.
//
typedef struct _MINIPORT_NODE {
LIST_ENTRY ListEntry;
PLDR_DATA_TABLE_ENTRY DriverEntry;
ULONG DriverChecksum;
} MINIPORT_NODE, *PMINIPORT_NODE;
#define IO_TYPE_DCB 0xff
#define DCB_DUMP_ENABLED 0x01
#define DCB_SUMMARY_ENABLED 0x02
#define DCB_AUTO_REBOOT 0x04
typedef struct _DUMP_CONTROL_BLOCK {
UCHAR Type;
CHAR Flags;
USHORT Size;
CCHAR NumberProcessors;
CHAR Reserved;
USHORT ProcessorArchitecture;
PLDR_DATA_TABLE_ENTRY DiskDumpDriver;
ULONG DiskDumpChecksum;
LIST_ENTRY MiniportQueue;
PPHYSICAL_MEMORY_DESCRIPTOR MemoryDescriptor;
ULONG MemoryDescriptorChecksum;
PLARGE_INTEGER FileDescriptorArray;
ULONG FileDescriptorChecksum;
ULONG FileDescriptorSize;
ULONG DiskSignature;
LARGE_INTEGER PartitionOffset;
PVOID NonCachedBufferVa1;
PVOID NonCachedBufferVa2;
PHYSICAL_ADDRESS NonCachedBufferPa1;
PHYSICAL_ADDRESS NonCachedBufferPa2;
PVOID Buffer;
PULONG HeaderPage;
ULONG HeaderPfn;
PVOID LoadedModuleList;
PADAPTER_OBJECT AdapterObject;
PVOID MappedRegisterBase;
ULONG MappedAddressChecksum;
ULONG MappedAddressCount;
PVOID PortConfiguration;
ULONG MajorVersion;
ULONG MinorVersion;
CHAR VersionUser[32];
ANSI_STRING PssInitMsg;
ANSI_STRING PssProgressMsg;
ANSI_STRING PssDoneMsg;
} DUMP_CONTROL_BLOCK, *PDUMP_CONTROL_BLOCK;
//
// Define the global data for the I/O system.
//
#define IOP_FIXED_SIZE_MDL_PFNS 0x17
extern KSPIN_LOCK IopDatabaseLock;
extern ERESOURCE IopDatabaseResource;
extern LIST_ENTRY IopDiskFileSystemQueueHead;
extern LIST_ENTRY IopCdRomFileSystemQueueHead;
extern LIST_ENTRY IopNetworkFileSystemQueueHead;
extern LIST_ENTRY IopTapeFileSystemQueueHead;
extern LIST_ENTRY IopDriverReinitializeQueueHead;
extern LIST_ENTRY IopNotifyShutdownQueueHead;
extern LIST_ENTRY IopFsNotifyChangeQueueHead;
extern KSPIN_LOCK IoStatisticsLock;
extern KSEMAPHORE IopRegistrySemaphore;
extern KSPIN_LOCK IopTimerLock;
extern LIST_ENTRY IopTimerQueueHead;
extern KDPC IopTimerDpc;
extern KTIMER IopTimer;
extern ULONG IopTimerCount;
extern ULONG IopLargeIrpStackLocations;
extern KSPIN_LOCK IopCompletionLock;
extern POBJECT_TYPE IoAdapterObjectType;
extern POBJECT_TYPE IoCompletionObjectType;
extern POBJECT_TYPE IoControllerObjectType;
extern POBJECT_TYPE IoDeviceObjectType;
extern POBJECT_TYPE IoDriverObjectType;
extern POBJECT_TYPE IoDeviceHandlerObjectType;
extern POBJECT_TYPE IoFileObjectType;
extern ULONG IoDeviceHandlerObjectSize;
extern NPAGED_LOOKASIDE_LIST IopLargeIrpLookasideList;
extern NPAGED_LOOKASIDE_LIST IopSmallIrpLookasideList;
extern NPAGED_LOOKASIDE_LIST IopMdlLookasideList;
extern UCHAR IopQueryOperationLength[];
extern UCHAR IopSetOperationLength[];
extern ULONG IopQueryOperationAccess[];
extern ULONG IopSetOperationAccess[];
extern UCHAR IopQuerySetAlignmentRequirement[];
extern UCHAR IopQueryFsOperationLength[];
extern UCHAR IopSetFsOperationLength[];
extern ULONG IopQueryFsOperationAccess[];
extern ULONG IopSetFsOperationAccess[];
extern UCHAR IopQuerySetFsAlignmentRequirement[];
extern PDUMP_CONTROL_BLOCK IopDumpControlBlock;
extern ULONG IopDumpControlBlockChecksum;
//
// The following declaration cannot go in EX.H since POBJECT_TYPE is not defined
// until OB.H, which depends on EX.H. Hence, it is not exported by the EX
// component at all.
//
extern POBJECT_TYPE ExEventObjectType;
//
// Define routines private to the I/O system.
//
VOID
IopAbortRequest(
IN PKAPC Apc
);
//+
//
// BOOLEAN
// IopAcquireFastLock(
// IN PFILE_OBJECT FileObject
// )
//
// Routine Description:
//
// This routine is invoked to acquire the fast lock for a file object.
// This lock protects the busy indicator in the file object resource.
//
// Arguments:
//
// FileObject - Pointer to the file object to be locked.
//
// Return Values:
//
// FALSE - the fileobject was not locked (it was busy)
// TRUE - the fileobject was locked & the busy flag has been set to TRUE
//
//-
#define IopAcquireFastLock( FileObject ) \
( InterlockedExchange( &FileObject->Busy, (ULONG) TRUE ) == FALSE )
#define IopAcquireCancelSpinLockAtDpcLevel() \
ExAcquireSpinLockAtDpcLevel (&IopCancelSpinLock)
#define IopReleaseCancelSpinLockFromDpcLevel() \
ExReleaseSpinLockFromDpcLevel (&IopCancelSpinLock)
NTSTATUS
IopAcquireFileObjectLock(
IN PFILE_OBJECT FileObject,
IN KPROCESSOR_MODE RequestorMode,
IN BOOLEAN Alertable,
OUT PBOOLEAN Interrupted
);
PIRP
IopAllocateIrp(
IN CCHAR StackSize,
IN BOOLEAN ChargeQuota
);
VOID
IopAllocateIrpCleanup(
IN PFILE_OBJECT FileObject,
IN PKEVENT EventObject OPTIONAL
);
PIRP
IopAllocateIrpMustSucceed(
IN CCHAR StackSize
);
VOID
IopApcHardError(
IN PVOID StartContext
);
VOID
IopCancelAlertedRequest(
IN PKEVENT Event,
IN PIRP Irp
);
VOID
IopCheckBackupRestorePrivilege(
IN PACCESS_STATE AccessState,
IN OUT PULONG CreateOptions,
IN KPROCESSOR_MODE PreviousMode,
IN ULONG Disposition
);
ULONG
IopChecksum(
IN PVOID Buffer,
IN ULONG Length
);
VOID
IopCloseFile(
IN PEPROCESS Process OPTIONAL,
IN PVOID Object,
IN ULONG GrantedAccess,
IN ULONG ProcessHandleCount,
IN ULONG SystemHandleCount
);
VOID
IopCompleteUnloadOrDelete(
IN PDEVICE_OBJECT DeviceObject,
IN KIRQL Irql
);
VOID
IopCompletePageWrite(
IN PKAPC Apc,
IN PKNORMAL_ROUTINE *NormalRoutine,
IN PVOID *NormalContext,
IN PVOID *SystemArgument1,
IN PVOID *SystemArgument2
);
VOID
IopCompleteRequest(
IN PKAPC Apc,
IN PKNORMAL_ROUTINE *NormalRoutine,
IN PVOID *NormalContext,
IN PVOID *SystemArgument1,
IN PVOID *SystemArgument2
);
VOID
IopDeallocateApc(
IN PKAPC Apc,
IN PKNORMAL_ROUTINE *NormalRoutine,
IN PVOID *NormalContext,
IN PVOID *SystemArgument1,
IN PVOID *SystemArgument2
);
VOID
IopDecrementDeviceObjectRef(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN AlwaysUnload
);
VOID
IopDeleteDriver(
IN PVOID Object
);
VOID
IopDeleteDevice(
IN PVOID Object
);
VOID
IopDeleteFile(
IN PVOID Object
);
VOID
IopDeleteIoCompletion(
IN PVOID Object
);
//+
//
// VOID
// IopDequeueThreadIrp(
// IN PIRP Irp
// )
//
// Routine Description:
//
// This routine dequeues the specified I/O Request Packet (IRP) from the
// thread IRP queue which it is currently queued.
//
// Arguments:
//
// Irp - Specifies the IRP that is dequeued.
//
// Return Value:
//
// None.
//
//-
#define IopDequeueThreadIrp( Irp ) { RemoveEntryList( &Irp->ThreadListEntry ); }
VOID
IopDisassociateThreadIrp(
VOID
);
BOOLEAN
IopDmaDispatch(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext
);
VOID
IopDropIrp(
IN PIRP Irp,
IN PFILE_OBJECT FileObject
);
LONG
IopExceptionFilter(
IN PEXCEPTION_POINTERS ExceptionPointers,
OUT PNTSTATUS ExceptionCode
);
VOID
IopExceptionCleanup(
IN PFILE_OBJECT FileObject,
IN PIRP Irp,
IN PKEVENT EventObject OPTIONAL,
IN PKEVENT KernelEvent OPTIONAL
);
VOID
IopErrorLogThread(
IN PVOID StartContext
);
VOID
IopFreeIrpAndMdls(
IN PIRP Irp
);
NTSTATUS
IopGetDriverNameFromKeyNode(
IN HANDLE KeyHandle,
OUT PUNICODE_STRING DriverName
);
NTSTATUS
IopGetFileName(
IN PFILE_OBJECT FileObject,
IN ULONG Length,
OUT PVOID FileInformation,
OUT PULONG ReturnedLength
);
BOOLEAN
IopGetMountFlag(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
IopGetRegistryKeyInformation(
IN HANDLE KeyHandle,
OUT PKEY_FULL_INFORMATION *Information
);
NTSTATUS
IopGetRegistryValue(
IN HANDLE KeyHandle,
IN PWSTR ValueName,
OUT PKEY_VALUE_FULL_INFORMATION *Information
);
NTSTATUS
IopGetRegistryValues(
IN HANDLE KeyHandle,
IN PKEY_VALUE_FULL_INFORMATION *ValueList
);
NTSTATUS
IopGetRegistryValues(
IN HANDLE KeyHandle,
IN PKEY_VALUE_FULL_INFORMATION *ValueList
);
NTSTATUS
IopGetSetSecurityObject(
IN PVOID Object,
IN SECURITY_OPERATION_CODE OperationCode,
IN PSECURITY_INFORMATION SecurityInformation,
IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
IN OUT PULONG CapturedLength,
IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
IN POOL_TYPE PoolType,
IN PGENERIC_MAPPING GenericMapping
);
VOID
IopHardErrorThread(
PVOID StartContext
);
//++
//
// VOID
// IopInitializeIrp(
// IN OUT PIRP Irp,
// IN USHORT PacketSize,
// IN CCHAR StackSize
// )
//
// Routine Description:
//
// Initializes an IRP.
//
// Arguments:
//
// Irp - a pointer to the IRP to initialize.
//
// PacketSize - length, in bytes, of the IRP.
//
// StackSize - Number of stack locations in the IRP.
//
// Return Value:
//
// None.
//
//--
#define IopInitializeIrp( Irp, PacketSize, StackSize ) { \
RtlZeroMemory( (Irp), (PacketSize) ); \
(Irp)->Type = (CSHORT) IO_TYPE_IRP; \
(Irp)->Size = (USHORT) ((PacketSize)); \
(Irp)->StackCount = (CCHAR) ((StackSize)); \
(Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1); \
(Irp)->ApcEnvironment = KeGetCurrentApcEnvironment(); \
(Irp)->Tail.Overlay.CurrentStackLocation = \
((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + \
sizeof( IRP ) + \
( (StackSize) * sizeof( IO_STACK_LOCATION )))); }
VOID
IopInitializeResourceMap (
PLOADER_PARAMETER_BLOCK LoaderBlock
);
VOID
IopInsertRemoveDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN Insert
);
NTSTATUS
IopInvalidDeviceRequest(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
IopLoadDriver(
IN HANDLE KeyHandle
);
VOID
IopLoadFileSystemDriver(
IN PDEVICE_OBJECT DeviceObject
);
VOID
IopLoadUnloadDriver(
IN PVOID Parameter
);
NTSTATUS
IopMountVolume(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN AllowRawMount,
IN BOOLEAN DeviceLockAlreadyHeld
);
NTSTATUS
IopOpenLinkOrRenameTarget(
OUT PHANDLE TargetHandle,
IN PIRP Irp,
IN PVOID RenameBuffer,
IN PFILE_OBJECT FileObject
);
NTSTATUS
IopOpenRegistryKey(
OUT PHANDLE Handle,
IN HANDLE BaseHandle OPTIONAL,
IN PUNICODE_STRING KeyName,
IN ACCESS_MASK DesiredAccess,
IN BOOLEAN Create
);
NTSTATUS
IopLookupBusStringFromID (
IN HANDLE KeyHandle,
IN INTERFACE_TYPE InterfaceType,
OUT PWCHAR Buffer,
IN ULONG Length,
OUT PULONG BusFlags OPTIONAL
);
NTSTATUS
IopParseDevice(
IN PVOID ParseObject,
IN PVOID ObjectType,
IN PACCESS_STATE AccessState,
IN KPROCESSOR_MODE AccessMode,
IN ULONG Attributes,
IN OUT PUNICODE_STRING CompleteName,
IN OUT PUNICODE_STRING RemainingName,
IN OUT PVOID Context OPTIONAL,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
OUT PVOID *Object
);
NTSTATUS
IopParseFile(
IN PVOID ParseObject,
IN PVOID ObjectType,
IN PACCESS_STATE AccessState,
IN KPROCESSOR_MODE AccessMode,
IN ULONG Attributes,
IN OUT PUNICODE_STRING CompleteName,
IN OUT PUNICODE_STRING RemainingName,
IN OUT PVOID Context OPTIONAL,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
OUT PVOID *Object
);
BOOLEAN
IopProtectSystemPartition(
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
NTSTATUS
IopQueryName(
IN PVOID Object,
IN BOOLEAN HasObjectName,
OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
IN ULONG Length,
OUT PULONG ReturnLength
);
NTSTATUS
IopQueryXxxInformation(
IN PFILE_OBJECT FileObject,
IN ULONG InformationClass,
IN ULONG Length,
OUT PVOID Information,
OUT PULONG ReturnedLength,
IN BOOLEAN FileInformation
);
//+
// VOID
// IopQueueThreadIrp(
// IN PIRP Irp
// )
//
// Routine Description:
//
// This routine queues the specified I/O Request Packet (IRP) to the thread
// whose TCB address is stored in the packet.
//
// Arguments:
//
// Irp - Supplies the IRP to be queued for the specified thread.
//
// Return Value:
//
// None.
//
//-
#define IopQueueThreadIrp( Irp ) { \
KIRQL irql; \
KeRaiseIrql( APC_LEVEL, &irql ); \
InsertHeadList( &Irp->Tail.Overlay.Thread->IrpList, \
&Irp->ThreadListEntry ); \
KeLowerIrql( irql ); \
}
VOID
IopQueueWorkRequest(
IN PIRP Irp
);
VOID
IopRaiseHardError(
IN PVOID NormalContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
IopRaiseInformationalHardError(
IN PVOID NormalContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
IopReadyDeviceObjects(
IN PDRIVER_OBJECT DriverObject
);
//+
//
// VOID
// IopReleaseFileObjectLock(
// IN PFILE_OBJECT FileObject
// )
//
// Routine Description:
//
// This routine is invoked to release ownership of the file object lock.
//
// Arguments:
//
// FileObject - Pointer to the file object whose ownership is to be
// released.
//
// Return Value:
//
// None.
//
//-
#define IopReleaseFileObjectLock( FileObject ) { \
FileObject->Busy = FALSE; \
if (FileObject->Waiters != 0) { \
KeSetEvent( &FileObject->Lock, 0, FALSE ); \
} \
}
VOID
IopStartApcHardError(
IN PVOID StartContext
);
NTSTATUS
IopSynchronousApiServiceTail(
IN NTSTATUS ReturnedStatus,
IN PKEVENT Event,
IN PIRP Irp,
IN KPROCESSOR_MODE RequestorMode,
IN PIO_STATUS_BLOCK LocalIoStatus,
OUT PIO_STATUS_BLOCK IoStatusBlock
);
NTSTATUS
IopSynchronousServiceTail(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PFILE_OBJECT FileObject,
IN BOOLEAN DeferredIoCompletion,
IN KPROCESSOR_MODE RequestorMode,
IN BOOLEAN SynchronousIo,
IN TRANSFER_TYPE TransferType
);
VOID
IopTimerDispatch(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
//++
//
// VOID
// IopUpdateOtherOperationCount(
// VOID
// )
//
// Routine Description:
//
// This routine is invoked to update the operation count for the current
// process to indicate that an I/O service other than a read or write
// has been invoked.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateOtherOperationCount() ( IoOtherOperationCount++ )
//++
//
// VOID
// IopUpdateReadOperationCount(
// VOID
// )
//
// Routine Description:
//
// This routine is invoked to update the read operation count for the
// current process to indicate that the NtReadFile system service has
// been invoked.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateReadOperationCount() ( IoReadOperationCount++ )
//++
//
// VOID
// IopUpdateWriteOperationCount(
// VOID
// )
//
// Routine Description:
//
// This routine is invoked to update the write operation count for the
// current process to indicate that the NtWriteFile service other has
// been invoked.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateWriteOperationCount() ( IoWriteOperationCount++ )
//++
//
// VOID
// IopUpdateOtherTransferCount(
// IN ULONG TransferCount
// )
//
// Routine Description:
//
// This routine is invoked to update the transfer count for the current
// process for an operation other than a read or write system service.
//
// Arguments:
//
// TransferCount - The count of the number of bytes transferred.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateOtherTransferCount( TransferCount ) \
ExInterlockedAddLargeStatistic( &IoOtherTransferCount, TransferCount )
//++
//
// VOID
// IopUpdateReadTransferCount(
// IN ULONG TransferCount
// )
//
// Routine Description:
//
// This routine is invoked to update the read transfer count for the
// current process.
//
// Arguments:
//
// TransferCount - The count of the number of bytes transferred.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateReadTransferCount( TransferCount ) \
ExInterlockedAddLargeStatistic( &IoReadTransferCount, TransferCount )
//++
//
// VOID
// IopUpdateWriteTransferCount(
// IN ULONG TransferCount
// )
//
// Routine Description:
//
// This routine is invoked to update the write transfer count for the
// current process.
//
// Arguments:
//
// TransferCount - The count of the number of bytes transferred.
//
// Return Value:
//
// None.
//
//--
#define IopUpdateWriteTransferCount( TransferCount ) \
ExInterlockedAddLargeStatistic( &IoWriteTransferCount, TransferCount )
VOID
IopUserCompletion(
IN PKAPC Apc,
IN PKNORMAL_ROUTINE *NormalRoutine,
IN PVOID *NormalContext,
IN PVOID *SystemArgument1,
IN PVOID *SystemArgument2
);
NTSTATUS
IopXxxControlFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN BOOLEAN DeviceIoControl
);
NTSTATUS
IopReportResourceUsage(
IN PUNICODE_STRING DriverClassName OPTIONAL,
IN PDRIVER_OBJECT DriverObject,
IN PCM_RESOURCE_LIST DriverList OPTIONAL,
IN ULONG DriverListSize OPTIONAL,
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
IN ULONG DeviceListSize OPTIONAL,
IN BOOLEAN OverrideConflict,
OUT PBOOLEAN ConflictDetected
);
#if DBG
PRTL_EVENT_ID_INFO IopCreateFileEventId;
PRTL_EVENT_ID_INFO IopReadFileEventId;
PRTL_EVENT_ID_INFO IopWriteFileEventId;
PRTL_EVENT_ID_INFO IopCloseFileEventId;
#endif // DBG
#endif // _IOP_