1200 lines
27 KiB
C
1200 lines
27 KiB
C
|
/*++ 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_
|