X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fio%2Firp.c;h=1619680ecba52de8d1f8c7e2c67b331651bebba9;hp=c436611b288a11b48700fe1d4e8fe9443c58b8b5;hb=HEAD;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/ntoskrnl/io/irp.c b/ntoskrnl/io/irp.c index c436611..1619680 100644 --- a/ntoskrnl/io/irp.c +++ b/ntoskrnl/io/irp.c @@ -46,6 +46,9 @@ /* FUNCTIONS ****************************************************************/ +/* + * @implemented + */ VOID STDCALL IoFreeIrp(PIRP Irp) /* @@ -58,6 +61,9 @@ IoFreeIrp(PIRP Irp) } +/* + * @unimplemented + */ PIRP STDCALL IoMakeAssociatedIrp(PIRP Irp, CCHAR StackSize) @@ -77,6 +83,9 @@ IoMakeAssociatedIrp(PIRP Irp, } +/* + * @implemented + */ VOID STDCALL IoInitializeIrp(PIRP Irp, USHORT PacketSize, @@ -99,6 +108,9 @@ IoInitializeIrp(PIRP Irp, } +/* + * @implemented + */ NTSTATUS FASTCALL IofCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -128,11 +140,14 @@ IofCallDriver(PDEVICE_OBJECT DeviceObject, DPRINT("MajorFunction %d\n", Param->MajorFunction); DPRINT("DriverObject->MajorFunction[Param->MajorFunction] %x\n", DriverObject->MajorFunction[Param->MajorFunction]); - + return DriverObject->MajorFunction[Param->MajorFunction](DeviceObject, Irp); } +/* + * @implemented + */ NTSTATUS STDCALL IoCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp) @@ -142,6 +157,9 @@ IoCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp) } +/* + * @implemented + */ PIRP STDCALL IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota) @@ -191,25 +209,12 @@ IoAllocateIrp(CCHAR StackSize, } -VOID STDCALL -IopCompleteRequest(struct _KAPC* Apc, - PKNORMAL_ROUTINE* NormalRoutine, - PVOID* NormalContext, - PVOID* SystemArgument1, - PVOID* SystemArgument2) -{ - DPRINT("IopCompleteRequest(Apc %x, SystemArgument1 %x, (*SystemArgument1) %x\n", - Apc, - SystemArgument1, - *SystemArgument1); - IoSecondStageCompletion((PIRP)(*SystemArgument1), - (KPRIORITY)(*SystemArgument2)); -} - - +/* + * @implemented + */ VOID FASTCALL IofCompleteRequest(PIRP Irp, - CCHAR PriorityBoost) + 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 @@ -222,6 +227,7 @@ IofCompleteRequest(PIRP Irp, ULONG i; NTSTATUS Status; PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT OriginalFileObject; DPRINT("IoCompleteRequest(Irp %x, PriorityBoost %d) Event %x THread %x\n", Irp,PriorityBoost, Irp->UserEvent, PsGetCurrentThread()); @@ -261,7 +267,7 @@ IofCompleteRequest(PIRP Irp, { Status = Irp->Stack[i].CompletionRoutine(DeviceObject, Irp, - Irp->Stack[i].CompletionContext); + Irp->Stack[i].Context); if (Status == STATUS_MORE_PROCESSING_REQUIRED) { @@ -275,33 +281,48 @@ IofCompleteRequest(PIRP Irp, } } + //Windows NT File System Internals, page 154 + OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject; + if (Irp->PendingReturned) - { - DPRINT("Dispatching APC\n"); - KeInitializeApc(&Irp->Tail.Apc, - &Irp->Tail.Overlay.Thread->Tcb, - 0, - IopCompleteRequest, - NULL, - (PKNORMAL_ROUTINE) - NULL, - KernelMode, - NULL); - KeInsertQueueApc(&Irp->Tail.Apc, - (PVOID)Irp, - (PVOID)(ULONG)PriorityBoost, - KernelMode); - DPRINT("Finished dispatching APC\n"); - } + { + BOOLEAN bStatus; + + DPRINT("Dispatching APC\n"); + KeInitializeApc( &Irp->Tail.Apc, + &Irp->Tail.Overlay.Thread->Tcb, + OriginalApcEnvironment, + IoSecondStageCompletion, + NULL, + (PKNORMAL_ROUTINE) NULL, + KernelMode, + OriginalFileObject); + + bStatus = KeInsertQueueApc(&Irp->Tail.Apc, + (PVOID)Irp, + (PVOID)(ULONG)PriorityBoost, + PriorityBoost); + + if (bStatus == FALSE) + { + DPRINT1("Error queueing APC for thread. Thread has probably exited.\n"); + } + + DPRINT("Finished dispatching APC\n"); + } else - { - DPRINT("Calling completion routine directly\n"); - IoSecondStageCompletion(Irp,PriorityBoost); - DPRINT("Finished completition routine\n"); - } + { + DPRINT("Calling IoSecondStageCompletion routine directly\n"); + IoSecondStageCompletion(NULL,NULL,(PVOID)&OriginalFileObject,(PVOID) &Irp,(PVOID) &PriorityBoost); + DPRINT("Finished completition routine\n"); + } + } +/* + * @implemented + */ VOID STDCALL IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) @@ -324,38 +345,40 @@ IoCompleteRequest(PIRP Irp, * * RETURN VALUE * TRUE if Irp's operation is synchronous; otherwise FALSE. + * + * @implemented */ BOOLEAN STDCALL IoIsOperationSynchronous(IN PIRP Irp) { - PFILE_OBJECT FileObject = NULL; - ULONG Flags = 0; + PFILE_OBJECT FileObject = NULL; - /* Check the FILE_OBJECT's flags first. */ - FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; - if (!(FO_SYNCHRONOUS_IO & FileObject->Flags)) - { - /* Check IRP's flags. */ - Flags = Irp->Flags; - if (!((IRP_SYNCHRONOUS_API | IRP_SYNCHRONOUS_PAGING_IO) & Flags)) - { - return(FALSE); - } - } + FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; + + if (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) + { + return TRUE; + } - /* Check more IRP's flags. */ - Flags = Irp->Flags; - if (!(IRP_PAGING_IO & Flags) - || (IRP_SYNCHRONOUS_PAGING_IO & Flags)) - { - return(TRUE); - } + if (Irp->Flags & IRP_PAGING_IO) + { + return FALSE; + } + + //NOTE: Windows 2000 crash if IoStack->FileObject == NULL, so I guess we should too;-) + if (Irp->Flags & IRP_SYNCHRONOUS_API || FileObject->Flags & FO_SYNCHRONOUS_IO) + { + return TRUE; + } - /* Otherwise, it is an asynchronous operation. */ - return(FALSE); + /* Otherwise, it is an asynchronous operation. */ + return FALSE; } +/* + * @unimplemented + */ VOID STDCALL IoEnqueueIrp(IN PIRP Irp) { @@ -363,6 +386,9 @@ IoEnqueueIrp(IN PIRP Irp) } +/* + * @implemented + */ VOID STDCALL IoSetTopLevelIrp(IN PIRP Irp) { @@ -373,6 +399,9 @@ IoSetTopLevelIrp(IN PIRP Irp) } +/* + * @implemented + */ PIRP STDCALL IoGetTopLevelIrp(VOID) { @@ -380,44 +409,13 @@ IoGetTopLevelIrp(VOID) } +/* + * @unimplemented + */ VOID STDCALL IoQueueThreadIrp(IN PIRP Irp) { UNIMPLEMENTED; } -/* -NTSTATUS -STDCALL -IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable) -{ - UNIMPLEMENTED; - return 0; -} - -NTSTATUS -STDCALL -IoGetDeviceProperty( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_REGISTRY_PROPERTY DeviceProperty, - IN ULONG BufferLength, - OUT PVOID PropertyBuffer, - OUT PULONG ResultLength) -{ - UNIMPLEMENTED; - return 0; -} - -NTSTATUS -STDCALL -IoOpenDeviceRegistryKey( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DevInstKeyType, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DevInstRegKey) -{ - UNIMPLEMENTED; - return 0; -} - */ /* EOF */