/* FUNCTIONS ****************************************************************/
+/*
+ * @implemented
+ */
VOID STDCALL
IoFreeIrp(PIRP Irp)
/*
}
+/*
+ * @unimplemented
+ */
PIRP STDCALL
IoMakeAssociatedIrp(PIRP Irp,
CCHAR StackSize)
}
+/*
+ * @implemented
+ */
VOID STDCALL
IoInitializeIrp(PIRP Irp,
USHORT PacketSize,
}
+/*
+ * @implemented
+ */
NTSTATUS FASTCALL
IofCallDriver(PDEVICE_OBJECT DeviceObject,
PIRP Irp)
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)
}
+/*
+ * @implemented
+ */
PIRP STDCALL
IoAllocateIrp(CCHAR StackSize,
BOOLEAN ChargeQuota)
}
-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
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());
{
Status = Irp->Stack[i].CompletionRoutine(DeviceObject,
Irp,
- Irp->Stack[i].CompletionContext);
+ Irp->Stack[i].Context);
if (Status == STATUS_MORE_PROCESSING_REQUIRED)
{
}
}
+ //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)
*
* 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)
{
}
+/*
+ * @implemented
+ */
VOID STDCALL
IoSetTopLevelIrp(IN PIRP Irp)
{
}
+/*
+ * @implemented
+ */
PIRP STDCALL
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 */