1464 lines
33 KiB
C
1464 lines
33 KiB
C
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989-2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
iomgr.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the private structure definitions and APIs used by
|
|||
|
the NT I/O system.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Nar Ganapathy (narg) 1-Jan-1999
|
|||
|
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _IOMGR_
|
|||
|
#define _IOMGR_
|
|||
|
//
|
|||
|
// Define Information fields values for the return value from popups when a
|
|||
|
// volume mount is in progress but failed.
|
|||
|
//
|
|||
|
|
|||
|
#define IOP_ABORT 1
|
|||
|
|
|||
|
#include "ntos.h"
|
|||
|
#include "ntdddisk.h"
|
|||
|
#include "ntddscsi.h"
|
|||
|
#include "mountmgr.h"
|
|||
|
#include "ntiolog.h"
|
|||
|
#include "ntiologc.h"
|
|||
|
#include "ntseapi.h"
|
|||
|
#include "fsrtl.h"
|
|||
|
#include "zwapi.h"
|
|||
|
|
|||
|
#include "stdio.h"
|
|||
|
#include "stdlib.h"
|
|||
|
#include "string.h"
|
|||
|
|
|||
|
#include "safeboot.h"
|
|||
|
#include "ioverifier.h"
|
|||
|
|
|||
|
#include "iopcmn.h"
|
|||
|
|
|||
|
#ifdef POOL_TAGGING
|
|||
|
#undef ExAllocatePool
|
|||
|
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' oI')
|
|||
|
#undef ExAllocatePoolWithQuota
|
|||
|
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' oI')
|
|||
|
#endif
|
|||
|
|
|||
|
typedef struct _DUMP_CONTROL_BLOCK DUMP_CONTROL_BLOCK, *PDUMP_CONTROL_BLOCK;
|
|||
|
|
|||
|
//
|
|||
|
// 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 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;
|
|||
|
ULONG NumPendingApcPopups;
|
|||
|
} 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;
|
|||
|
|
|||
|
typedef
|
|||
|
NTSTATUS
|
|||
|
(FASTCALL *PIO_CALL_DRIVER) (
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(FASTCALL *PIO_COMPLETE_REQUEST) (
|
|||
|
IN PIRP Irp,
|
|||
|
IN CCHAR PriorityBoost
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*PIO_FREE_IRP) (
|
|||
|
IN struct _IRP *Irp
|
|||
|
);
|
|||
|
|
|||
|
typedef
|
|||
|
PIRP
|
|||
|
(*PIO_ALLOCATE_IRP) (
|
|||
|
IN CCHAR StackSize,
|
|||
|
IN BOOLEAN ChargeQuota
|
|||
|
);
|
|||
|
|
|||
|
extern IOP_HARD_ERROR_QUEUE IopHardError;
|
|||
|
extern PIOP_HARD_ERROR_PACKET IopCurrentHardError;
|
|||
|
|
|||
|
#define IOP_MAXIMUM_OUTSTANDING_HARD_ERRORS 25
|
|||
|
|
|||
|
typedef struct _IO_WORKITEM {
|
|||
|
WORK_QUEUE_ITEM WorkItem;
|
|||
|
PIO_WORKITEM_ROUTINE Routine;
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
PVOID Context;
|
|||
|
#if DBG
|
|||
|
ULONG Size;
|
|||
|
#endif
|
|||
|
} IO_WORKITEM;
|
|||
|
|
|||
|
//
|
|||
|
// Define the global data for the error logger and I/O system.
|
|||
|
//
|
|||
|
|
|||
|
extern WORK_QUEUE_ITEM IopErrorLogWorkItem;
|
|||
|
extern BOOLEAN IopErrorLogPortPending;
|
|||
|
extern BOOLEAN IopErrorLogDisabledThisBoot;
|
|||
|
extern KSPIN_LOCK IopErrorLogLock;
|
|||
|
extern LIST_ENTRY IopErrorLogListHead;
|
|||
|
extern ULONG IopErrorLogAllocation;
|
|||
|
extern KSPIN_LOCK IopErrorLogAllocationLock;
|
|||
|
extern const GENERIC_MAPPING IopFileMapping;
|
|||
|
|
|||
|
//
|
|||
|
// 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_PTR 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;
|
|||
|
|
|||
|
//
|
|||
|
// The following is used to indicate we passed through a mount point while
|
|||
|
// parsing the filename. We use this to do an extra check on the device type
|
|||
|
// for the final file
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN TraversedMountPoint;
|
|||
|
|
|||
|
//
|
|||
|
// Device object where the create should start if present on the stack
|
|||
|
// Applicable for kernel opens only.
|
|||
|
//
|
|||
|
|
|||
|
ULONG InternalFlags; // Passed from IopCreateFile
|
|||
|
PDEVICE_OBJECT TopDeviceObjectHint;
|
|||
|
|
|||
|
} OPEN_PACKET, *POPEN_PACKET;
|
|||
|
|
|||
|
//
|
|||
|
// Define a Load Packet (LDP). An 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 a Link Tracking Packet. A link tracking packet is used to open the
|
|||
|
// user-mode link tracking service's LPC port so that information about objects
|
|||
|
// which have been moved can be tracked.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _LINK_TRACKING_PACKET {
|
|||
|
WORK_QUEUE_ITEM WorkQueueItem;
|
|||
|
KEVENT Event;
|
|||
|
NTSTATUS FinalStatus;
|
|||
|
} LINK_TRACKING_PACKET, *PLINK_TRACKING_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 I/O completion packet types.
|
|||
|
//
|
|||
|
|
|||
|
typedef enum _COMPLETION_PACKET_TYPE {
|
|||
|
IopCompletionPacketIrp,
|
|||
|
IopCompletionPacketMini,
|
|||
|
IopCompletionPacketQuota
|
|||
|
} COMPLETION_PACKET_TYPE, *PCOMPLETION_PACKET_TYPE;
|
|||
|
|
|||
|
//
|
|||
|
// 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 {
|
|||
|
|
|||
|
//
|
|||
|
// The following unnamed structure must be exactly identical
|
|||
|
// to the unnamed structure used in the IRP overlay section used
|
|||
|
// for completion queue entries.
|
|||
|
//
|
|||
|
|
|||
|
struct {
|
|||
|
|
|||
|
//
|
|||
|
// List entry - used to queue the packet to completion queue, among
|
|||
|
// others.
|
|||
|
//
|
|||
|
|
|||
|
LIST_ENTRY ListEntry;
|
|||
|
|
|||
|
union {
|
|||
|
|
|||
|
//
|
|||
|
// Current stack location - contains a pointer to the current
|
|||
|
// IO_STACK_LOCATION structure in the IRP stack. This field
|
|||
|
// should never be directly accessed by drivers. They should
|
|||
|
// use the standard functions.
|
|||
|
//
|
|||
|
|
|||
|
struct _IO_STACK_LOCATION *CurrentStackLocation;
|
|||
|
|
|||
|
//
|
|||
|
// Minipacket type.
|
|||
|
//
|
|||
|
|
|||
|
ULONG PacketType;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
PVOID KeyContext;
|
|||
|
PVOID ApcContext;
|
|||
|
NTSTATUS IoStatus;
|
|||
|
ULONG_PTR IoStatusInformation;
|
|||
|
} IOP_MINI_COMPLETION_PACKET, *PIOP_MINI_COMPLETION_PACKET;
|
|||
|
|
|||
|
typedef struct _IO_UNLOAD_SAFE_COMPLETION_CONTEXT {
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
PVOID Context;
|
|||
|
PIO_COMPLETION_ROUTINE CompletionRoutine;
|
|||
|
} IO_UNLOAD_SAFE_COMPLETION_CONTEXT, *PIO_UNLOAD_SAFE_COMPLETION_CONTEXT;
|
|||
|
|
|||
|
typedef struct _IOP_RESERVE_IRP_ALLOCATOR {
|
|||
|
PIRP ReserveIrp;
|
|||
|
LONG IrpAllocated;
|
|||
|
KEVENT Event;
|
|||
|
CCHAR ReserveIrpStackSize;
|
|||
|
} IOP_RESERVE_IRP_ALLOCATOR, *PIOP_RESERVE_IRP_ALLOCATOR;
|
|||
|
|
|||
|
//
|
|||
|
// This structure is the extension to a fileobject if the flag
|
|||
|
// FO_FILE_OBJECT_HAS_EXTENSION is set in the fileobject.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _IOP_FILE_OBJECT_EXTENSION {
|
|||
|
ULONG FileObjectExtensionFlags;
|
|||
|
PDEVICE_OBJECT TopDeviceObjectHint;
|
|||
|
PVOID FilterContext; // Pointer where filter keeps its context
|
|||
|
} IOP_FILE_OBJECT_EXTENSION, *PIOP_FILE_OBJECT_EXTENSION;
|
|||
|
|
|||
|
//
|
|||
|
// Structure to bookkeep stack profiler.
|
|||
|
//
|
|||
|
|
|||
|
#define MAX_LOOKASIDE_IRP_STACK_COUNT 20 // Highest value for a lookaside stack count
|
|||
|
|
|||
|
typedef struct _IOP_IRP_STACK_PROFILER {
|
|||
|
ULONG Profile[MAX_LOOKASIDE_IRP_STACK_COUNT];
|
|||
|
KTIMER Timer;
|
|||
|
KDPC Dpc;
|
|||
|
ULONG Flags;
|
|||
|
ULONG TriggerCount;
|
|||
|
ULONG ProfileDuration;
|
|||
|
} IOP_IRP_STACK_PROFILER, *PIOP_IRP_STACK_PROFILER;
|
|||
|
|
|||
|
|
|||
|
#define IOP_CREATE_USE_TOP_DEVICE_OBJECT_HINT 0x1 // Define for internal flags to IopCreateFile
|
|||
|
#define IOP_CREATE_IGNORE_SHARE_ACCESS_CHECK 0x2
|
|||
|
|
|||
|
// Extension Flag definitions.
|
|||
|
|
|||
|
#define FO_EXTENSION_IGNORE_SHARE_ACCESS_CHECK 0x1 // Ignore share access check.
|
|||
|
|
|||
|
//
|
|||
|
// Define the global data for the I/O system.
|
|||
|
//
|
|||
|
|
|||
|
#define IOP_FIXED_SIZE_MDL_PFNS 0x17
|
|||
|
|
|||
|
#define MAX_RESERVE_IRP_STACK_SIZE 20 // Define 20 as the number of stacks needed for the reserve IRP
|
|||
|
#define IOP_PROFILE_TIME_PERIOD 60 // 60 seconds
|
|||
|
#define NUM_SAMPLE_IRPS 2000
|
|||
|
#define MIN_IRP_THRESHOLD 400 // At least 20 % should be allocated from a given stack location
|
|||
|
|
|||
|
//
|
|||
|
// Define the default number of I/O stack locations a large IRP should
|
|||
|
// have if not specified by the registry.
|
|||
|
//
|
|||
|
|
|||
|
#define DEFAULT_LARGE_IRP_LOCATIONS 8
|
|||
|
#define BASE_STACK_COUNT DEFAULT_LARGE_IRP_LOCATIONS
|
|||
|
|
|||
|
//
|
|||
|
// Defines for IopIrpAllocatorFlags.
|
|||
|
//
|
|||
|
|
|||
|
#define IOP_ENABLE_AUTO_SIZING 0x1
|
|||
|
#define IOP_PROFILE_STACK_COUNT 0x2
|
|||
|
#define IOP_PROFILE_DURATION 1 // 1*60 seconds
|
|||
|
#define IOP_PROFILE_TRIGGER_INTERVAL 10 // 10*60 seconds
|
|||
|
|
|||
|
extern ERESOURCE IopDatabaseResource;
|
|||
|
extern ERESOURCE IopSecurityResource;
|
|||
|
extern ERESOURCE IopCrashDumpLock;
|
|||
|
extern LIST_ENTRY IopDiskFileSystemQueueHead;
|
|||
|
extern LIST_ENTRY IopCdRomFileSystemQueueHead;
|
|||
|
extern LIST_ENTRY IopNetworkFileSystemQueueHead;
|
|||
|
extern LIST_ENTRY IopTapeFileSystemQueueHead;
|
|||
|
extern LIST_ENTRY IopBootDriverReinitializeQueueHead;
|
|||
|
extern LIST_ENTRY IopNotifyShutdownQueueHead;
|
|||
|
extern LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;
|
|||
|
extern LIST_ENTRY IopFsNotifyChangeQueueHead;
|
|||
|
extern KSPIN_LOCK IoStatisticsLock;
|
|||
|
extern KSPIN_LOCK IopTimerLock;
|
|||
|
extern LIST_ENTRY IopTimerQueueHead;
|
|||
|
extern KDPC IopTimerDpc;
|
|||
|
extern KTIMER IopTimer;
|
|||
|
extern ULONG IopTimerCount;
|
|||
|
extern ULONG IopLargeIrpStackLocations;
|
|||
|
extern ULONG IopFsRegistrationOps;
|
|||
|
|
|||
|
extern POBJECT_TYPE IoAdapterObjectType;
|
|||
|
extern POBJECT_TYPE IoCompletionObjectType;
|
|||
|
extern POBJECT_TYPE IoControllerObjectType;
|
|||
|
extern POBJECT_TYPE IoDeviceHandlerObjectType;
|
|||
|
|
|||
|
extern GENERAL_LOOKASIDE IopLargeIrpLookasideList;
|
|||
|
extern GENERAL_LOOKASIDE IopSmallIrpLookasideList;
|
|||
|
extern GENERAL_LOOKASIDE IopMdlLookasideList;
|
|||
|
extern GENERAL_LOOKASIDE IopCompletionLookasideList;
|
|||
|
|
|||
|
extern const UCHAR IopQueryOperationLength[];
|
|||
|
extern const UCHAR IopSetOperationLength[];
|
|||
|
extern const ULONG IopQueryOperationAccess[];
|
|||
|
extern const ULONG IopSetOperationAccess[];
|
|||
|
extern const UCHAR IopQuerySetAlignmentRequirement[];
|
|||
|
extern const UCHAR IopQueryFsOperationLength[];
|
|||
|
extern const UCHAR IopSetFsOperationLength[];
|
|||
|
extern const ULONG IopQueryFsOperationAccess[];
|
|||
|
extern const ULONG IopSetFsOperationAccess[];
|
|||
|
extern const UCHAR IopQuerySetFsAlignmentRequirement[];
|
|||
|
|
|||
|
extern UNICODE_STRING IoArcHalDeviceName;
|
|||
|
extern PUCHAR IoLoaderArcBootDeviceName;
|
|||
|
|
|||
|
|
|||
|
extern LONG IopUniqueDeviceObjectNumber;
|
|||
|
|
|||
|
extern PVOID IopLinkTrackingServiceObject;
|
|||
|
extern PKEVENT IopLinkTrackingServiceEvent;
|
|||
|
extern HANDLE IopLinkTrackingServiceEventHandle;
|
|||
|
extern KEVENT IopLinkTrackingPortObject;
|
|||
|
extern LINK_TRACKING_PACKET IopLinkTrackingPacket;
|
|||
|
|
|||
|
extern UNICODE_STRING IoArcBootDeviceName;
|
|||
|
extern PDUMP_CONTROL_BLOCK IopDumpControlBlock;
|
|||
|
extern ULONG IopDumpControlBlockChecksum;
|
|||
|
|
|||
|
extern LIST_ENTRY IopDriverReinitializeQueueHead;
|
|||
|
|
|||
|
extern BOOLEAN IopVerifierOn;
|
|||
|
|
|||
|
extern PIO_CALL_DRIVER pIofCallDriver;
|
|||
|
extern PIO_COMPLETE_REQUEST pIofCompleteRequest;
|
|||
|
extern PIO_FREE_IRP pIoFreeIrp;
|
|||
|
extern PIO_ALLOCATE_IRP pIoAllocateIrp;
|
|||
|
extern IOP_RESERVE_IRP_ALLOCATOR IopReserveIrpAllocator;
|
|||
|
extern IOP_IRP_STACK_PROFILER IopIrpStackProfiler;
|
|||
|
//
|
|||
|
// 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() \
|
|||
|
KiAcquireQueuedSpinLock ( &KeGetCurrentPrcb()->LockQueue[LockQueueIoCancelLock] )
|
|||
|
|
|||
|
#define IopReleaseCancelSpinLockFromDpcLevel() \
|
|||
|
KiReleaseQueuedSpinLock ( &KeGetCurrentPrcb()->LockQueue[LockQueueIoCancelLock] )
|
|||
|
|
|||
|
#define IopAllocateIrp(StackSize, ChargeQuota) \
|
|||
|
IoAllocateIrp((StackSize), (ChargeQuota))
|
|||
|
|
|||
|
#define IsIoVerifierOn() IopVerifierOn
|
|||
|
|
|||
|
|
|||
|
static __inline VOID
|
|||
|
IopProbeAndLockPages(
|
|||
|
IN OUT PMDL MemoryDescriptorList,
|
|||
|
IN KPROCESSOR_MODE AccessMode,
|
|||
|
IN LOCK_OPERATION Operation,
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN ULONG MajorFunction
|
|||
|
)
|
|||
|
{
|
|||
|
extern LOGICAL MmTrackLockedPages;
|
|||
|
|
|||
|
MmProbeAndLockPages(MemoryDescriptorList, AccessMode, Operation);
|
|||
|
if (MmTrackLockedPages) {
|
|||
|
PVOID DriverRoutine;
|
|||
|
|
|||
|
DriverRoutine = DeviceObject->DriverObject->MajorFunction[MajorFunction];
|
|||
|
MmUpdateMdlTracker(MemoryDescriptorList, DriverRoutine, DeviceObject);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#define IopIsReserveIrp(Irp) ((Irp) == (IopReserveIrpAllocator.ReserveIrp))
|
|||
|
|
|||
|
//
|
|||
|
// Bump the stack profile.
|
|||
|
//
|
|||
|
|
|||
|
#define IopProfileIrpStackCount(StackSize) \
|
|||
|
((StackSize < MAX_LOOKASIDE_IRP_STACK_COUNT) ? \
|
|||
|
IopIrpStackProfiler.Profile[StackSize]++ : 0)
|
|||
|
|
|||
|
//
|
|||
|
// True if auto sizing is enabled.
|
|||
|
//
|
|||
|
#define IopIrpAutoSizingEnabled() ((IopIrpStackProfiler.Flags & IOP_ENABLE_AUTO_SIZING))
|
|||
|
|
|||
|
//
|
|||
|
// True if stack profiling is enabled.
|
|||
|
//
|
|||
|
|
|||
|
#define IopIrpProfileStackCountEnabled() \
|
|||
|
((IopIrpStackProfiler.Flags & (IOP_PROFILE_STACK_COUNT|IOP_ENABLE_AUTO_SIZING)) \
|
|||
|
== (IOP_PROFILE_STACK_COUNT|IOP_ENABLE_AUTO_SIZING))
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopAcquireFileObjectLock(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN KPROCESSOR_MODE RequestorMode,
|
|||
|
IN BOOLEAN Alertable,
|
|||
|
OUT PBOOLEAN Interrupted
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopCheckGetQuotaBufferValidity(
|
|||
|
IN PFILE_GET_QUOTA_INFORMATION QuotaBuffer,
|
|||
|
IN ULONG QuotaLength,
|
|||
|
OUT PULONG_PTR ErrorOffset
|
|||
|
);
|
|||
|
|
|||
|
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 BOOLEAN OnCleanStack,
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopConfigureCrashDump(
|
|||
|
IN HANDLE HandlePagingFile
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopConnectLinkTrackingPort(
|
|||
|
IN PVOID Parameter
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopCreateVpb (
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
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,
|
|||
|
IN BOOLEAN OnCleanStack
|
|||
|
);
|
|||
|
|
|||
|
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.
|
|||
|
//
|
|||
|
// In checked we set Flink == Blink so we can assert free's of queue'd IRPs
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// Irp - Specifies the IRP that is dequeued.
|
|||
|
//
|
|||
|
// Return Value:
|
|||
|
//
|
|||
|
// None.
|
|||
|
//
|
|||
|
//-
|
|||
|
|
|||
|
#define IopDequeueThreadIrp( Irp ) \
|
|||
|
{ \
|
|||
|
RemoveEntryList( &Irp->ThreadListEntry ); \
|
|||
|
InitializeListHead( &Irp->ThreadListEntry ) ; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#ifdef _WIN64
|
|||
|
#define IopApcRoutinePresent(ApcRoutine) ARGUMENT_PRESENT((ULONG_PTR)(ApcRoutine) & ~1)
|
|||
|
#define IopIsIosb32(ApcRoutine) ((ULONG_PTR)(ApcRoutine) & 1)
|
|||
|
#else
|
|||
|
#define IopApcRoutinePresent(ApcRoutine) ARGUMENT_PRESENT(ApcRoutine)
|
|||
|
#endif
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
PDEVICE_OBJECT
|
|||
|
IopGetDeviceAttachmentBase(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetFileInformation(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN ULONG Length,
|
|||
|
IN FILE_INFORMATION_CLASS FileInformationClass,
|
|||
|
OUT PVOID FileInformation,
|
|||
|
OUT PULONG ReturnedLength
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopGetMountFlag(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetRegistryValues(
|
|||
|
IN HANDLE KeyHandle,
|
|||
|
IN PKEY_VALUE_FULL_INFORMATION *ValueList
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetSetObjectId(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN OUT PVOID Buffer,
|
|||
|
IN ULONG Length,
|
|||
|
IN ULONG OperationFlags
|
|||
|
);
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetVolumeId(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN OUT PLINK_TRACKING_INFORMATION ObjectId,
|
|||
|
IN ULONG Length
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopHardErrorThread(
|
|||
|
PVOID StartContext
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopInsertRemoveDevice(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN BOOLEAN Insert
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Interlocked list manipulation funtions using queued spin locks.
|
|||
|
//
|
|||
|
|
|||
|
PLIST_ENTRY
|
|||
|
FASTCALL
|
|||
|
IopInterlockedInsertHeadList (
|
|||
|
IN PLIST_ENTRY ListHead,
|
|||
|
IN PLIST_ENTRY ListEntry
|
|||
|
);
|
|||
|
|
|||
|
PLIST_ENTRY
|
|||
|
FASTCALL
|
|||
|
IopInterlockedInsertTailList (
|
|||
|
IN PLIST_ENTRY ListHead,
|
|||
|
IN PLIST_ENTRY ListEntry
|
|||
|
);
|
|||
|
|
|||
|
PLIST_ENTRY
|
|||
|
FASTCALL
|
|||
|
IopInterlockedRemoveHeadList (
|
|||
|
IN PLIST_ENTRY ListHead
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopIsSameMachine(
|
|||
|
IN PFILE_OBJECT SourceFile,
|
|||
|
IN HANDLE TargetFile
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopLoadFileSystemDriver(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopLoadUnloadDriver(
|
|||
|
IN PVOID Parameter
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopLogErrorEvent(
|
|||
|
IN ULONG SequenceNumber,
|
|||
|
IN ULONG UniqueErrorValue,
|
|||
|
IN NTSTATUS FinalStatus,
|
|||
|
IN NTSTATUS SpecificIOStatus,
|
|||
|
IN ULONG LengthOfInsert1,
|
|||
|
IN PWCHAR Insert1,
|
|||
|
IN ULONG LengthOfInsert2,
|
|||
|
IN PWCHAR Insert2
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopLookupBusStringFromID (
|
|||
|
IN HANDLE KeyHandle,
|
|||
|
IN INTERFACE_TYPE InterfaceType,
|
|||
|
OUT PWCHAR Buffer,
|
|||
|
IN ULONG Length,
|
|||
|
OUT PULONG BusFlags OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopMountVolume(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN BOOLEAN AllowRawMount,
|
|||
|
IN BOOLEAN DeviceLockAlreadyHeld,
|
|||
|
IN BOOLEAN Alertable,
|
|||
|
OUT PVPB *Vpb
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopOpenLinkOrRenameTarget(
|
|||
|
OUT PHANDLE TargetHandle,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID RenameBuffer,
|
|||
|
IN PFILE_OBJECT FileObject
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
IopQueryNameInternal(
|
|||
|
IN PVOID Object,
|
|||
|
IN BOOLEAN HasObjectName,
|
|||
|
IN BOOLEAN UseDosDeviceName,
|
|||
|
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
|
|||
|
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 ) { \
|
|||
|
ULONG Result; \
|
|||
|
Result = InterlockedExchange( &FileObject->Busy, FALSE ); \
|
|||
|
ASSERT(Result != FALSE); \
|
|||
|
if (FileObject->Waiters != 0) { \
|
|||
|
KeSetEvent( &FileObject->Lock, 0, FALSE ); \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
#if _WIN32_WINNT >= 0x0500
|
|||
|
NTSTATUS
|
|||
|
IopSendMessageToTrackService(
|
|||
|
IN PLINK_TRACKING_INFORMATION SourceVolumeId,
|
|||
|
IN PFILE_OBJECTID_BUFFER SourceObjectId,
|
|||
|
IN PFILE_TRACKING_INFORMATION TargetObjectInformation
|
|||
|
);
|
|||
|
#endif
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopSetEaOrQuotaInformationFile(
|
|||
|
IN HANDLE FileHandle,
|
|||
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|||
|
IN PVOID Buffer,
|
|||
|
IN ULONG Length,
|
|||
|
IN BOOLEAN SetEa
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopSetRemoteLink(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN PFILE_OBJECT DestinationFileObject OPTIONAL,
|
|||
|
IN PFILE_TRACKING_INFORMATION FileInformation OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopTrackLink(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|||
|
IN PFILE_TRACKING_INFORMATION FileInformation,
|
|||
|
IN ULONG Length,
|
|||
|
IN PKEVENT Event,
|
|||
|
IN KPROCESSOR_MODE RequestorMode
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
IopDoNameTransmogrify(
|
|||
|
IN PIRP Irp,
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN PREPARSE_DATA_BUFFER ReparseBuffer
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateOtherOperationCount(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateReadOperationCount(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateWriteOperationCount(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateOtherTransferCount(
|
|||
|
IN ULONG TransferCount
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateReadTransferCount(
|
|||
|
IN ULONG TransferCount
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopUpdateWriteTransferCount(
|
|||
|
IN ULONG TransferCount
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
FASTCALL
|
|||
|
IopfCallDriver(
|
|||
|
PDEVICE_OBJECT DeviceObject,
|
|||
|
PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FASTCALL
|
|||
|
IopfCompleteRequest(
|
|||
|
IN PIRP Irp,
|
|||
|
IN CCHAR PriorityBost
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
PIRP
|
|||
|
IopAllocateIrpPrivate(
|
|||
|
IN CCHAR StackSize,
|
|||
|
IN BOOLEAN ChargeQuota
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopFreeIrp(
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
IopAllocateErrorLogEntry(
|
|||
|
IN PDEVICE_OBJECT deviceObject,
|
|||
|
IN PDRIVER_OBJECT driverObject,
|
|||
|
IN UCHAR EntrySize
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopNotifyAlreadyRegisteredFileSystems(
|
|||
|
IN PLIST_ENTRY ListHead,
|
|||
|
IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine,
|
|||
|
IN BOOLEAN SkipRaw
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopCheckUnloadDriver(
|
|||
|
IN PDRIVER_OBJECT driverObject,
|
|||
|
OUT PBOOLEAN unloadDriver
|
|||
|
);
|
|||
|
//
|
|||
|
// Interlocked increment/decrement functions using queued spin locks.
|
|||
|
//
|
|||
|
|
|||
|
ULONG
|
|||
|
FASTCALL
|
|||
|
IopInterlockedDecrementUlong (
|
|||
|
IN KSPIN_LOCK_QUEUE_NUMBER Number,
|
|||
|
IN OUT PULONG Addend
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
FASTCALL
|
|||
|
IopInterlockedIncrementUlong (
|
|||
|
IN KSPIN_LOCK_QUEUE_NUMBER Number,
|
|||
|
IN OUT PULONG Addend
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
IopShutdownBaseFileSystems(
|
|||
|
IN PLIST_ENTRY ListHead
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopPerfLogFileCreate(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN PUNICODE_STRING CompleteName
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopInitializeReserveIrp(
|
|||
|
PIOP_RESERVE_IRP_ALLOCATOR Allocator
|
|||
|
);
|
|||
|
|
|||
|
PIRP
|
|||
|
IopAllocateReserveIrp(
|
|||
|
IN CCHAR StackSize
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopFreeReserveIrp(
|
|||
|
IN PIRP Irp,
|
|||
|
IN CCHAR PriorityBoost
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetBasicInformationFile(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN PFILE_BASIC_INFORMATION BasicInformationBuffer
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopCreateFile(
|
|||
|
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 Disposition,
|
|||
|
IN ULONG CreateOptions,
|
|||
|
IN PVOID EaBuffer OPTIONAL,
|
|||
|
IN ULONG EaLength,
|
|||
|
IN CREATE_FILE_TYPE CreateFileType,
|
|||
|
IN PVOID ExtraCreateParameters OPTIONAL,
|
|||
|
IN ULONG Options,
|
|||
|
IN ULONG InternalFlags,
|
|||
|
IN PVOID DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopVerifyDeviceObjectOnStack(
|
|||
|
IN PDEVICE_OBJECT BaseDeviceObject,
|
|||
|
IN PDEVICE_OBJECT TopDeviceObject
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopVerifyDiskSignature(
|
|||
|
IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout,
|
|||
|
IN PARC_DISK_SIGNATURE LoaderDiskBlock,
|
|||
|
OUT PULONG DiskSignature
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopGetDriverPathInformation(
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
IN PFILE_FS_DRIVER_PATH_INFORMATION FsDpInfo,
|
|||
|
IN ULONG Length
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IopVerifyDriverObjectOnStack(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PDRIVER_OBJECT DriverObject
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
IopInitializeIrpStackProfiler(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopIrpStackProfilerTimer(
|
|||
|
IN struct _KDPC *Dpc,
|
|||
|
IN PVOID DeferredContext,
|
|||
|
IN PVOID SystemArgument1,
|
|||
|
IN PVOID SystemArgument2
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
IopProcessIrpStackProfiler(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
PDEVICE_OBJECT
|
|||
|
IopAttachDeviceToDeviceStackSafe(
|
|||
|
IN PDEVICE_OBJECT SourceDevice,
|
|||
|
IN PDEVICE_OBJECT TargetDevice,
|
|||
|
OUT PDEVICE_OBJECT *AttachedToDeviceObject OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
#endif // _IOMGR_
|