From 1eed2a945a8a626ccc0d6298df210e946c68bae6 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Mon, 6 Mar 2000 01:02:30 +0000 Subject: [PATCH] Added .Type and .Size attributes to the IRP object: so far nothing seems broken. Added __stdcall to some Io subsystem functions. Attempt to implement IoIsOperationSynchronous(). svn path=/trunk/; revision=1033 --- reactos/include/ddk/iofuncs.h | 37 +++++--- reactos/include/ddk/iotypes.h | 4 +- reactos/ntoskrnl/io/fs.c | 3 +- reactos/ntoskrnl/io/irp.c | 167 +++++++++++++++++++++++++++++++--- reactos/ntoskrnl/ntoskrnl.def | 16 +++- reactos/ntoskrnl/ntoskrnl.edf | 16 +++- 6 files changed, 210 insertions(+), 33 deletions(-) diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index 5c038b555d8..ae923897a4d 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -1,4 +1,4 @@ -/* $Id: iofuncs.h,v 1.6 2000/03/05 19:17:37 ea Exp $ */ +/* $Id: iofuncs.h,v 1.7 2000/03/06 01:02:30 ea Exp $ */ /* IO MANAGER ***************************************************************/ BOOLEAN @@ -100,6 +100,7 @@ IoAllocateErrorLogEntry ( * On failure NULL */ PIRP +STDCALL IoAllocateIrp ( CCHAR StackSize, BOOLEAN ChargeQuota @@ -281,11 +282,17 @@ IoBuildSynchronousFsdRequest ( * FUNCTION: Sends an irp to the next lower driver */ NTSTATUS +FASTCALL +IofCallDriver ( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); +NTSTATUS +STDCALL IoCallDriver ( PDEVICE_OBJECT DeviceObject, - PIRP irp + PIRP Irp ); - BOOLEAN IoCancelIrp ( PIRP Irp @@ -309,11 +316,17 @@ IoCheckShareAccess ( * thread making the request */ VOID +FASTCALL +IofCompleteRequest ( + PIRP Irp, + CCHAR PriorityBoost + ); +VOID +STDCALL IoCompleteRequest ( PIRP Irp, CCHAR PriorityBoost ); - NTSTATUS IoConnectInterrupt ( PKINTERRUPT * InterruptObject, @@ -458,12 +471,11 @@ VOID IoFreeController ( PCONTROLLER_OBJECT ControllerObject ); - VOID +STDCALL IoFreeIrp ( PIRP Irp ); - VOID IoFreeMapRegisters ( PADAPTER_OBJECT AdapterObject, @@ -502,12 +514,11 @@ IoGetDeviceObjectPointer ( PFILE_OBJECT * FileObject, PDEVICE_OBJECT * DeviceObject ); - PDEVICE_OBJECT +STDCALL IoGetDeviceToVerify ( PETHREAD Thread ); - PGENERIC_MAPPING IoGetFileObjectGenericMapping (VOID); @@ -547,6 +558,7 @@ IoInitializeDpcRequest ( * StackSize = Number of stack locations in the IRP */ VOID +STDCALL IoInitializeIrp ( PIRP Irp, USHORT PacketSize, @@ -564,18 +576,21 @@ BOOLEAN IoIsErrorUserInduced ( NTSTATUS Status ); - +BOOLEAN +STDCALL +IoIsOperationSynchronous ( + IN PIRP Irp + ); BOOLEAN IoIsTotalDeviceFailure ( NTSTATUS Status ); - PIRP +STDCALL IoMakeAssociatedIrp ( PIRP Irp, CCHAR StackSize ); - PHYSICAL_ADDRESS IoMapTransfer ( PADAPTER_OBJECT AdapterObject, diff --git a/reactos/include/ddk/iotypes.h b/reactos/include/ddk/iotypes.h index 1397c97d26e..d60145f32b3 100644 --- a/reactos/include/ddk/iotypes.h +++ b/reactos/include/ddk/iotypes.h @@ -1,4 +1,4 @@ -/* $Id: iotypes.h,v 1.11 2000/03/05 19:17:37 ea Exp $ +/* $Id: iotypes.h,v 1.12 2000/03/06 01:02:30 ea Exp $ * */ @@ -265,6 +265,8 @@ typedef struct _FILE_OBJECT typedef struct _IRP { + CSHORT Type; + USHORT Size; PMDL MdlAddress; ULONG Flags; union diff --git a/reactos/ntoskrnl/io/fs.c b/reactos/ntoskrnl/io/fs.c index f90dac2bf87..1da59e13a7b 100644 --- a/reactos/ntoskrnl/io/fs.c +++ b/reactos/ntoskrnl/io/fs.c @@ -1,4 +1,5 @@ -/* +/* $Id: fs.c,v 1.11 2000/03/06 01:02:30 ea Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/fs.c diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 87c088751fe..ff02e89087e 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -1,4 +1,5 @@ -/* +/* $Id: irp.c,v 1.26 2000/03/06 01:02:30 ea Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/irp.c @@ -39,7 +40,9 @@ /* FUNCTIONS ****************************************************************/ -PDEVICE_OBJECT IoGetDeviceToVerify(PETHREAD Thread) +PDEVICE_OBJECT +STDCALL +IoGetDeviceToVerify (PETHREAD Thread) /* * FUNCTION: Returns a pointer to the device, representing a removable-media * device, that is the target of the given thread's I/O request @@ -48,7 +51,10 @@ PDEVICE_OBJECT IoGetDeviceToVerify(PETHREAD Thread) UNIMPLEMENTED; } -VOID IoFreeIrp(PIRP Irp) + +VOID +STDCALL +IoFreeIrp (PIRP Irp) /* * FUNCTION: Releases a caller allocated irp * ARGUMENTS: @@ -58,7 +64,10 @@ VOID IoFreeIrp(PIRP Irp) ExFreePool(Irp); } -PIRP IoMakeAssociatedIrp(PIRP Irp, CCHAR StackSize) + +PIRP +STDCALL +IoMakeAssociatedIrp (PIRP Irp, CCHAR StackSize) /* * FUNCTION: Allocates and initializes an irp to associated with a master irp * ARGUMENTS: @@ -73,7 +82,13 @@ PIRP IoMakeAssociatedIrp(PIRP Irp, CCHAR StackSize) UNIMPLEMENTED; } -VOID IoMarkIrpPending(PIRP Irp) + +/********************************************************************** + * NAME INTERNAL + * IoMarkIrpPending + */ +VOID +IoMarkIrpPending (PIRP Irp) /* * FUNCTION: Marks the specified irp, indicating further processing will * be required by other driver routines @@ -86,7 +101,13 @@ VOID IoMarkIrpPending(PIRP Irp) IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED; } -USHORT IoSizeOfIrp(CCHAR StackSize) + +/********************************************************************** + * NAME INTERNAL + * IoSizeOfIrp + */ +USHORT +IoSizeOfIrp (CCHAR StackSize) /* * FUNCTION: Determines the size of an IRP * ARGUMENTS: @@ -97,7 +118,10 @@ USHORT IoSizeOfIrp(CCHAR StackSize) return(sizeof(IRP)+((StackSize-1)*sizeof(IO_STACK_LOCATION))); } -VOID IoInitializeIrp(PIRP Irp, USHORT PacketSize, CCHAR StackSize) + +VOID +STDCALL +IoInitializeIrp (PIRP Irp, USHORT PacketSize, CCHAR StackSize) /* * FUNCTION: Initalizes an irp allocated by the caller * ARGUMENTS: @@ -109,12 +133,19 @@ VOID IoInitializeIrp(PIRP Irp, USHORT PacketSize, CCHAR StackSize) assert(Irp != NULL); memset(Irp, 0, PacketSize); + Irp->Size = PacketSize; Irp->StackCount = StackSize; Irp->CurrentLocation = StackSize; Irp->Tail.Overlay.CurrentStackLocation = IoGetCurrentIrpStackLocation(Irp); } -PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp) + +/********************************************************************** + * NAME INTERNAL + * IoGetCurrentIrpStackLocation + */ +PIO_STACK_LOCATION +IoGetCurrentIrpStackLocation (PIRP Irp) /* * FUNCTION: Gets a pointer to the callers location in the I/O stack in * the given IRP @@ -131,13 +162,25 @@ PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp) return(&Irp->Stack[(ULONG)Irp->CurrentLocation]); } -VOID IoSetNextIrpStackLocation(PIRP Irp) + +/********************************************************************** + * NAME INTERNAL + * IoSetNextIrpStackLocation + */ +VOID +IoSetNextIrpStackLocation (PIRP Irp) { Irp->CurrentLocation--; Irp->Tail.Overlay.CurrentStackLocation--; } -PIO_STACK_LOCATION IoGetNextIrpStackLocation(PIRP Irp) + +/********************************************************************** + * NAME INTERNAL + * IoGetNextIrpStackLocation + */ +PIO_STACK_LOCATION +IoGetNextIrpStackLocation (PIRP Irp) /* * FUNCTION: Gives a higher level driver access to the next lower driver's * I/O stack location @@ -153,7 +196,10 @@ PIO_STACK_LOCATION IoGetNextIrpStackLocation(PIRP Irp) return(&Irp->Stack[Irp->CurrentLocation-1]); } -NTSTATUS IoCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp) + +NTSTATUS +FASTCALL +IofCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp) /* * FUNCTION: Sends an IRP to the next lower driver */ @@ -178,7 +224,21 @@ NTSTATUS IoCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp) return Status; } -PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota) + +NTSTATUS +STDCALL +IoCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp) +{ + return IofCallDriver ( + DeviceObject, + Irp + ); +} + + +PIRP +STDCALL +IoAllocateIrp (CCHAR StackSize, BOOLEAN ChargeQuota) /* * FUNCTION: Allocates an IRP * ARGUMENTS: @@ -218,7 +278,13 @@ PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota) return Irp; } -VOID IoSetCompletionRoutine(PIRP Irp, + +/********************************************************************** + * NAME INTERNAL + * IoSetCompletionRoutine + */ +VOID +IoSetCompletionRoutine (PIRP Irp, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID Context, BOOLEAN InvokeOnSuccess, @@ -256,7 +322,10 @@ VOID IopCompleteRequest(struct _KAPC* Apc, (KPRIORITY)(*SystemArgument2)); } -VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) + +VOID +FASTCALL +IofCompleteRequest (PIRP Irp, CCHAR PriorityBoost) /* * FUNCTION: Indicates the caller has finished all processing for a given * I/O request and is returning the given IRP to the I/O manager @@ -320,3 +389,73 @@ VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) } } + +VOID +STDCALL +IoCompleteRequest (PIRP Irp, CCHAR PriorityBoost) +{ + IofCompleteRequest ( + Irp, + PriorityBoost + ); +} + + +/********************************************************************** + * NAME EXPORTED + * IoIsOperationSynchronous@4 + * + * DESCRIPTION + * Check if the I/O operation associated with the given IRP + * is synchronous. + * + * ARGUMENTS + * Irp Packet to check. + * + * RETURN VALUE + * TRUE if Irp's operation is synchronous; otherwise FALSE. + */ +BOOLEAN +STDCALL +IoIsOperationSynchronous ( + IN PIRP Irp + ) +{ + ULONG Flags = 0; + PFILE_OBJECT FileObject = NULL; + + /* + * Check the associated FILE_OBJECT's + * flags first. + */ + FileObject = Irp->Tail.Overlay.OriginalFileObject; + if (!(FO_SYNCHRONOUS_IO & FileObject->Flags)) + { + /* Check IRP's flags. */ + Flags = Irp->Flags; + if (!( (IRP_SYNCHRONOUS_API | IRP_SYNCHRONOUS_PAGING_IO) + & Flags + )) + { + return FALSE; + } + } + /* + * Check more IRP's flags. + */ + Flags = Irp->Flags; + if ( !(IRP_MOUNT_COMPLETION & Flags) + || (IRP_SYNCHRONOUS_PAGING_IO & Flags) + ) + { + return TRUE; + } + /* + * Otherwise, it is an + * asynchronous operation. + */ + return FALSE; +} + + +/* EOF */ diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index e6c10483aa7..a9cd2cb26be 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.def,v 1.52 2000/03/05 19:17:39 ea Exp $ +; $Id: ntoskrnl.def,v 1.53 2000/03/06 01:02:30 ea Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -146,11 +146,12 @@ FsRtlTruncateMcb@8 FsRtlUninitializeFileLock@4 FsRtlUninitializeLargeMcb@4 FsRtlUninitializeMcb@4 +IoAllocateIrp@8 IoAllocateController IoAttachDeviceToDeviceStack IoBuildSynchronousFsdRequest -IoCallDriver -IoCompleteRequest +IoCallDriver@8 +IoCompleteRequest@8 IoConnectInterrupt IoCreateController IoCreateDevice @@ -161,11 +162,16 @@ IoDeleteController IoDeleteDevice IoDisconnectInterrupt IoFreeController +IoFreeIrp@4 IoGetBaseFileSystemDeviceObject@4 IoGetCurrentIrpStackLocation +IoGetDeviceToVerify@4 IoGetRelatedDeviceObject@4 IoInitializeDpcRequest +IoInitializeIrp@12 IoInitializeTimer +IoIsOperationSynchronous@4 +IoMakeAssociatedIrp@8 IoMarkIrpPending IoRegisterFileSystem IoRequestDpc @@ -174,6 +180,10 @@ IoStartNextPacket IoStartNextPacketByKey IoStartTimer IoStopTimer +;@IofCallDriver@0 +IofCallDriver@8 +;@IofCompleteRequest@0 +IofCompleteRequest@8 KdDebuggerEnabled DATA KdDebuggerNotPresent DATA KdPollBreakIn@0 diff --git a/reactos/ntoskrnl/ntoskrnl.edf b/reactos/ntoskrnl/ntoskrnl.edf index a2e0b5af2a4..a857e33444c 100644 --- a/reactos/ntoskrnl/ntoskrnl.edf +++ b/reactos/ntoskrnl/ntoskrnl.edf @@ -1,4 +1,4 @@ -; $Id: ntoskrnl.edf,v 1.39 2000/03/05 19:17:40 ea Exp $ +; $Id: ntoskrnl.edf,v 1.40 2000/03/06 01:02:30 ea Exp $ ; ; reactos/ntoskrnl/ntoskrnl.def ; @@ -146,11 +146,12 @@ FsRtlTruncateMcb=FsRtlTruncateMcb@8 FsRtlUninitializeFileLock=FsRtlUninitializeFileLock@4 FsRtlUninitializeLargeMcb=FsRtlUninitializeLargeMcb@4 FsRtlUninitializeMcb=FsRtlUninitializeMcb@4 +IoAllocateIrp=IoAllocateIrp@8 IoAllocateController IoAttachDeviceToDeviceStack IoBuildSynchronousFsdRequest -IoCallDriver -IoCompleteRequest +IoCallDriver=IoCallDriver@8 +IoCompleteRequest=IoCompleteRequest@8 IoConnectInterrupt IoCreateController IoCreateDevice @@ -161,11 +162,16 @@ IoDeleteController IoDeleteDevice IoDisconnectInterrupt IoFreeController +IoFreeIrp=IoFreeIrp@4 IoGetBaseFileSystemDeviceObject=IoGetBaseFileSystemDeviceObject@4 IoGetCurrentIrpStackLocation +IoGetDeviceToVerify=IoGetDeviceToVerify@4 IoGetRelatedDeviceObject=IoGetRelatedDeviceObject@4 IoInitializeDpcRequest +IoInitializeIrp=IoInitializeIrp@12 IoInitializeTimer +IoIsOperationSynchronous=IoIsOperationSynchronous@4 +IoMakeAssociatedIrp@8 IoMarkIrpPending IoRegisterFileSystem IoRequestDpc @@ -174,6 +180,10 @@ IoStartNextPacket IoStartNextPacketByKey IoStartTimer IoStopTimer +;IofCallDriver=@IofCallDriver@0 +IofCallDriver=IofCallDriver@8 +;IofCompleteRequest=@IofCompleteRequest@0 +IofCompleteRequest=IofCompleteRequest@8 KdDebuggerEnabled DATA KdDebuggerNotPresent DATA KdPollBreakIn=KdPollBreakIn@0