456 lines
11 KiB
C
456 lines
11 KiB
C
/*++
|
||
|
||
Copyright (c) 1989-2001 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
iop.h
|
||
|
||
Abstract:
|
||
|
||
This module contains the private structure definitions and APIs used by
|
||
the NT I/O system.
|
||
|
||
--*/
|
||
|
||
#ifndef _IOP_
|
||
#define _IOP_
|
||
|
||
#ifndef FAR
|
||
#define FAR
|
||
#endif
|
||
|
||
#include "ntos.h"
|
||
|
||
//
|
||
// Define the global data for the I/O system.
|
||
//
|
||
|
||
extern 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;
|
||
ULONG Options;
|
||
ULONG Disposition;
|
||
ULONG DesiredAccess;
|
||
|
||
//
|
||
// 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 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 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;
|
||
|
||
} OPEN_PACKET, *POPEN_PACKET;
|
||
|
||
//
|
||
// Define I/O completion packet types.
|
||
//
|
||
|
||
typedef enum _COMPLETION_PACKET_TYPE {
|
||
IopCompletionPacketIrp,
|
||
IopCompletionPacketMini
|
||
} 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;
|
||
|
||
extern const UCHAR IopQueryOperationLength[];
|
||
extern const UCHAR IopSetOperationLength[];
|
||
extern const ULONG IopQueryOperationAccess[];
|
||
extern const ULONG IopSetOperationAccess[];
|
||
extern const UCHAR IopQueryFsOperationLength[];
|
||
extern const ULONG IopQueryFsOperationAccess[];
|
||
|
||
#define IopAcquireCompletionLock() KeRaiseIrqlToDpcLevel()
|
||
#define IopReleaseCompletionLock(OldIrql) KeLowerIrql(OldIrql)
|
||
|
||
//
|
||
// Define routines private to the I/O system.
|
||
//
|
||
|
||
VOID
|
||
FASTCALL
|
||
IopAcquireFileObjectLock(
|
||
IN PFILE_OBJECT FileObject
|
||
);
|
||
|
||
NTSTATUS
|
||
IopAllocateIrpCleanup(
|
||
IN PFILE_OBJECT FileObject,
|
||
IN PKEVENT EventObject OPTIONAL
|
||
);
|
||
|
||
PIRP
|
||
IopAllocateIrpMustSucceed(
|
||
IN CCHAR StackSize
|
||
);
|
||
|
||
VOID
|
||
IopCloseFile(
|
||
IN PVOID Object,
|
||
IN ULONG SystemHandleCount
|
||
);
|
||
|
||
VOID
|
||
IopCompleteUnloadOrDelete(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN KIRQL Irql
|
||
);
|
||
|
||
VOID
|
||
IopCompleteRequest(
|
||
IN PKAPC Apc,
|
||
IN PKNORMAL_ROUTINE *NormalRoutine,
|
||
IN PVOID *NormalContext,
|
||
IN PVOID *SystemArgument1,
|
||
IN PVOID *SystemArgument2
|
||
);
|
||
|
||
VOID
|
||
IopDecrementDeviceObjectRef(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
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)
|
||
#else
|
||
#define IopApcRoutinePresent(ApcRoutine) ARGUMENT_PRESENT((ULONG_PTR)(ApcRoutine))
|
||
#endif
|
||
|
||
#define IopApcRoutineMode(ApcRoutine) \
|
||
((KPROCESSOR_MODE)((ApcRoutine == NtUserIoApcDispatcher) ? UserMode : KernelMode))
|
||
|
||
VOID
|
||
IopDisassociateThreadIrp(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
IopDropIrp(
|
||
IN PIRP Irp,
|
||
IN PFILE_OBJECT FileObject
|
||
);
|
||
|
||
VOID
|
||
IopExceptionCleanup(
|
||
IN PFILE_OBJECT FileObject,
|
||
IN PIRP Irp,
|
||
IN PKEVENT EventObject OPTIONAL
|
||
);
|
||
|
||
NTSTATUS
|
||
IopGetFileName(
|
||
IN PFILE_OBJECT FileObject,
|
||
IN ULONG Length,
|
||
OUT PVOID FileInformation,
|
||
OUT PULONG ReturnedLength
|
||
);
|
||
|
||
//++
|
||
//
|
||
// 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); \
|
||
InitializeListHead (&(Irp)->ThreadListEntry); \
|
||
(Irp)->Tail.Overlay.CurrentStackLocation = \
|
||
((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + \
|
||
sizeof( IRP ) + \
|
||
( (StackSize) * sizeof( IO_STACK_LOCATION )))); }
|
||
|
||
NTSTATUS
|
||
IopOpenRenameTarget(
|
||
OUT PHANDLE TargetHandle,
|
||
IN PIRP Irp,
|
||
IN PFILE_RENAME_INFORMATION RenameBuffer,
|
||
IN PFILE_OBJECT FileObject
|
||
);
|
||
|
||
NTSTATUS
|
||
IopParseFile(
|
||
IN PVOID ParseObject,
|
||
IN POBJECT_TYPE ObjectType,
|
||
IN ULONG Attributes,
|
||
IN OUT POBJECT_STRING CompleteName,
|
||
IN OUT POBJECT_STRING RemainingName,
|
||
IN OUT PVOID Context OPTIONAL,
|
||
OUT PVOID *Object
|
||
);
|
||
|
||
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 ); \
|
||
}
|
||
|
||
BOOLEAN
|
||
FASTCALL
|
||
IopReleaseFileObjectLock(
|
||
IN PFILE_OBJECT FileObject
|
||
);
|
||
|
||
NTSTATUS
|
||
IopSynchronousApiServiceTail(
|
||
IN NTSTATUS ReturnedStatus,
|
||
IN PKEVENT Event,
|
||
IN PIRP Irp,
|
||
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 BOOLEAN SynchronousIo
|
||
);
|
||
|
||
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
|
||
);
|
||
|
||
#endif // _IOP_
|