-/* $Id: create.c,v 1.49 2001/11/02 09:17:52 ekohl Exp $
+/* $Id: create.c,v 1.50 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PIRP Irp;
KEVENT Event;
PIO_STACK_LOCATION StackLoc;
+ IO_STATUS_BLOCK IoSB;
DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
return (STATUS_UNSUCCESSFUL);
}
- Irp->UserIosb = IoStatusBlock; //return iostatus
+ Irp->UserIosb = &IoSB; //return iostatus
Irp->AssociatedIrp.SystemBuffer = EaBuffer;
Irp->Tail.Overlay.AuxiliaryBuffer = (PCHAR)ExtraCreateParameters;
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();
+ Irp->UserEvent = &Event;
/*
* Get the stack location for the new
KernelMode,
FALSE,
NULL);
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
}
if (!NT_SUCCESS(Status))
{
DPRINT("Failing create request with status %x\n", Status);
ZwClose(*FileHandle);
}
-
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
assert_irql(PASSIVE_LEVEL);
DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));
-/* $Id: dir.c,v 1.10 2000/03/26 19:38:22 ea Exp $
+/* $Id: dir.c,v 1.11 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
NTSTATUS Status;
KEVENT Event;
PIO_STACK_LOCATION IoStack;
+ IO_STATUS_BLOCK IoSB;
DPRINT("NtQueryDirectoryFile()\n");
}
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &IoSB;
Irp->UserEvent = &Event;
Irp->UserBuffer=FileInformation;
{
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
}
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
}
return(Status);
}
-/* $Id: file.c,v 1.14 2001/06/12 12:30:36 ekohl Exp $
+/* $Id: file.c,v 1.15 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PIO_STACK_LOCATION StackPtr;
KEVENT Event;
PVOID SystemBuffer;
+ IO_STATUS_BLOCK IoSB;
assert(IoStatusBlock != NULL);
assert(FileInformation != NULL);
}
Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &IoSB;
Irp->UserEvent = &Event;
StackPtr = IoGetNextIrpStackLocation(Irp);
Status = IoCallDriver(FileObject->DeviceObject,
Irp);
- if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (Status==STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
- Status = Irp->IoStatus.Status;
+ Status = IoSB.Status;
}
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
if (NT_SUCCESS(Status))
{
Status = IoCallDriver(FileObject->DeviceObject,
Irp);
- if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (Status==STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
- Status = Irp->IoStatus.Status;
+ Status = IoStatusBlock.Status;
}
if (ReturnedLength != NULL)
KEVENT Event;
NTSTATUS Status;
PVOID SystemBuffer;
+ IO_STATUS_BLOCK IoSB;
assert(IoStatusBlock != NULL)
assert(FileInformation != NULL)
Length);
Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &IoSB;
Irp->UserEvent = &Event;
StackPtr = IoGetNextIrpStackLocation(Irp);
DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
Status = IoCallDriver(FileObject->DeviceObject,
Irp);
- if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (Status == STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
- Status = Irp->IoStatus.Status;
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
}
-
ExFreePool(SystemBuffer);
ObDereferenceObject(FileObject);
PIO_STACK_LOCATION StackPtr;
KEVENT Event;
NTSTATUS Status;
+ IO_STATUS_BLOCK IoSB;
Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_DATA,
0,
NULL,
&Event,
- IoStatusBlock);
+ &IoSB);
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->FileObject = FileObject;
if (Status==STATUS_PENDING)
{
KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
- Status = Irp->IoStatus.Status;
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
}
return(Status);
}
-/* $Id: fs.c,v 1.18 2001/07/15 15:36:31 ekohl Exp $
+/* $Id: fs.c,v 1.19 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PIRP Irp;
PIO_STACK_LOCATION StackPtr;
KEVENT KEvent;
+ IO_STATUS_BLOCK IoSB;
DPRINT("NtFsControlFile(DeviceHandle %x EventHandle %x ApcRoutine %x "
"ApcContext %x IoStatusBlock %x IoControlCode %x "
OutputBufferSize,
FALSE,
&KEvent,
- IoStatusBlock);
+ &IoSB);
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
StackPtr->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL;
Status = IoCallDriver(DeviceObject,Irp);
- if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (Status == STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&KEvent,Executive,KernelMode,FALSE,NULL);
- return(IoStatusBlock->Status);
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
}
return(Status);
}
-/* $Id: ioctrl.c,v 1.12 2001/03/21 23:27:18 chorns Exp $
+/* $Id: ioctrl.c,v 1.13 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PIRP Irp;
PIO_STACK_LOCATION StackPtr;
KEVENT KEvent;
+ PKEVENT ptrEvent;
+ IO_STATUS_BLOCK IoSB;
DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
"UserApcContext %x IoStatusBlock %x IoControlCode %x "
{
return(Status);
}
-
+ if (Event != NULL)
+ {
+ Status = ObReferenceObjectByHandle (Event,
+ SYNCHRONIZE,
+ ExEventObjectType,
+ UserMode,
+ (PVOID*)&ptrEvent,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ ObDereferenceObject(FileObject);
+ return Status;
+ }
+ }
+ else if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+ {
+ ptrEvent = NULL;
+ }
+ else
+ {
+ KeInitializeEvent (&KEvent,
+ NotificationEvent,
+ FALSE);
+ ptrEvent = &KEvent;
+ }
+
DeviceObject = FileObject->DeviceObject;
KeInitializeEvent(&KEvent,NotificationEvent,TRUE);
OutputBuffer,
OutputBufferSize,
FALSE,
- &KEvent,
- IoStatusBlock);
+ ptrEvent,
+ Event ? IoStatusBlock : &IoSB);
Irp->Overlay.AsynchronousParameters.UserApcRoutine = UserApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = UserApcContext;
StackPtr->Parameters.DeviceIoControl.OutputBufferLength = OutputBufferSize;
Status = IoCallDriver(DeviceObject,Irp);
- if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (Event == NULL && Status == STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&KEvent,Executive,KernelMode,FALSE,NULL);
- return(IoStatusBlock->Status);
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
}
return(Status);
}
-/* $Id: rw.c,v 1.33 2000/10/22 16:36:50 ekohl Exp $
+/* $Id: rw.c,v 1.34 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PIO_STACK_LOCATION StackPtr;
PKEVENT ptrEvent = NULL;
KEVENT Event;
+ IO_STATUS_BLOCK IoSB;
DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
"IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
}
else if (FileObject->Flags & FO_SYNCHRONOUS_IO)
{
+ ptrEvent = NULL;
+ }
+ else
+ {
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
ptrEvent = &Event;
}
- else
- {
- ptrEvent = NULL;
- }
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
FileObject->DeviceObject,
Length,
ByteOffset,
ptrEvent,
- IoStatusBlock);
+ EventHandle ? IoStatusBlock : &IoSB);
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
Status = IoCallDriver(FileObject->DeviceObject,
Irp);
- if ((Status == STATUS_PENDING) &&
- (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (EventHandle == NULL && Status == STATUS_PENDING &&
+ !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
BOOLEAN Alertable;
KernelMode,
Alertable,
NULL);
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock && EventHandle == NULL)
+ {
+ *IoStatusBlock = IoSB;
}
-
return (Status);
}
PIO_STACK_LOCATION StackPtr;
KEVENT Event;
PKEVENT ptrEvent;
+ IO_STATUS_BLOCK IoSB;
DPRINT("NtWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
FileHandle, Buffer, Length);
}
else if (FileObject->Flags & FO_SYNCHRONOUS_IO)
{
+ ptrEvent = NULL;
+ }
+ else
+ {
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
ptrEvent = &Event;
}
- else
- {
- ptrEvent = NULL;
- }
- KeInitializeEvent(&Event,
- NotificationEvent,
- FALSE);
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
FileObject->DeviceObject,
Buffer,
Length,
ByteOffset,
ptrEvent,
- IoStatusBlock);
+ EventHandle ? IoStatusBlock : &IoSB);
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
StackPtr->Parameters.Write.Key = 0;
}
Status = IoCallDriver(FileObject->DeviceObject, Irp);
- if ((Status == STATUS_PENDING) &&
- (FileObject->Flags & FO_SYNCHRONOUS_IO))
+ if (EventHandle == NULL && Status == STATUS_PENDING &&
+ !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{
KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
- Status = Irp->IoStatus.Status;
+ Status = IoSB.Status;
+ }
+ if (IoStatusBlock && EventHandle == NULL)
+ {
+ *IoStatusBlock = IoSB;
}
return(Status);
}
-/* $Id: vpb.c,v 1.13 2001/06/12 12:30:36 ekohl Exp $
+/* $Id: vpb.c,v 1.14 2001/11/02 22:22:33 hbirr Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
NTSTATUS Status;
PIO_STACK_LOCATION StackPtr;
PVOID SystemBuffer;
+ IO_STATUS_BLOCK IoSB;
assert(IoStatusBlock != NULL);
assert(FsInformation != NULL);
Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
Irp->UserEvent = &Event;
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &IoSB;
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;
KernelMode,
FALSE,
NULL);
- Status = IoStatusBlock->Status;
+ Status = IoSB.Status;
}
DPRINT("Status %x\n", Status);
DPRINT("Information %lu\n", IoStatusBlock->Information);
MmSafeCopyToUser(FsInformation,
SystemBuffer,
- IoStatusBlock->Information);
- }
+ IoSB.Information);
+ }
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
ExFreePool(SystemBuffer);
ObDereferenceObject(FileObject);
Irp->AssociatedIrp.SystemBuffer = FsInformation;
Irp->UserEvent = &Event;
Irp->UserIosb = &IoStatusBlock;
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;
NTSTATUS Status;
PIO_STACK_LOCATION StackPtr;
PVOID SystemBuffer;
+ IO_STATUS_BLOCK IoSB;
Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_ATTRIBUTES,
Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
Irp->UserEvent = &Event;
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &IoSB;
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->MajorFunction = IRP_MJ_SET_VOLUME_INFORMATION;
KernelMode,
FALSE,
NULL);
+ Status = IoSB.Status;
}
-
+ if (IoStatusBlock)
+ {
+ *IoStatusBlock = IoSB;
+ }
ExFreePool(SystemBuffer);
return(Status);