Initialize IRP.RequestorMode in system functions that can be called from user mode.

Use safe copy routine to copy IoStatusBlock if a system funtion was called from user mode.
Do not use local IoStatusBlock copy in system functions.

svn path=/trunk/; revision=6995
This commit is contained in:
Eric Kohl 2003-12-13 14:36:42 +00:00
parent 90f099cffe
commit 619a2c32d9
10 changed files with 363 additions and 339 deletions

View file

@ -234,9 +234,19 @@ IoSecondStageCompletion(
} }
if (Irp->UserIosb!=NULL) if (Irp->UserIosb!=NULL)
{
if (Irp->RequestorMode == KernelMode)
{ {
*Irp->UserIosb = Irp->IoStatus; *Irp->UserIosb = Irp->IoStatus;
} }
else
{
DPRINT("Irp->RequestorMode == UserMode\n");
MmSafeCopyToUser(Irp->UserIosb,
&Irp->IoStatus,
sizeof(IO_STATUS_BLOCK));
}
}
if (Irp->UserEvent) if (Irp->UserEvent)
{ {
@ -302,5 +312,4 @@ IoSecondStageCompletion(
} }
IoFreeIrp(Irp); IoFreeIrp(Irp);
} }

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.69 2003/11/06 18:05:54 ekohl Exp $ /* $Id: create.c,v 1.70 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -344,6 +344,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackLoc; PIO_STACK_LOCATION StackLoc;
IO_SECURITY_CONTEXT SecurityContext; IO_SECURITY_CONTEXT SecurityContext;
KPROCESSOR_MODE PreviousMode;
DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, " DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n", "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
@ -357,10 +358,12 @@ IoCreateFile(OUT PHANDLE FileHandle,
*FileHandle = 0; *FileHandle = 0;
Status = ObCreateObject(ExGetPreviousMode(), PreviousMode = ExGetPreviousMode();
Status = ObCreateObject(PreviousMode,
IoFileObjectType, IoFileObjectType,
ObjectAttributes, ObjectAttributes,
ExGetPreviousMode(), PreviousMode,
NULL, NULL,
sizeof(FILE_OBJECT), sizeof(FILE_OBJECT),
0, 0,
@ -421,7 +424,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
//trigger FileObject/Event dereferencing //trigger FileObject/Event dereferencing
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->UserIosb = IoStatusBlock; Irp->UserIosb = IoStatusBlock;
Irp->AssociatedIrp.SystemBuffer = EaBuffer; Irp->AssociatedIrp.SystemBuffer = EaBuffer;
Irp->Tail.Overlay.AuxiliaryBuffer = (PCHAR)ExtraCreateParameters; Irp->Tail.Overlay.AuxiliaryBuffer = (PCHAR)ExtraCreateParameters;
@ -476,7 +479,7 @@ IoCreateFile(OUT PHANDLE FileHandle,
{ {
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
Executive, Executive,
KernelMode, PreviousMode,
FALSE, FALSE,
NULL); NULL);
Status = IoStatusBlock->Status; Status = IoStatusBlock->Status;

View file

@ -1,4 +1,4 @@
/* $Id: dir.c,v 1.19 2003/08/07 11:47:33 silverblade Exp $ /* $Id: dir.c,v 1.20 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -92,14 +92,16 @@ NtQueryDirectoryFile(
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
NTSTATUS Status; NTSTATUS Status;
PEXTENDED_IO_STACK_LOCATION IoStack; PEXTENDED_IO_STACK_LOCATION IoStack;
IO_STATUS_BLOCK IoSB; KPROCESSOR_MODE PreviousMode;
DPRINT("NtQueryDirectoryFile()\n"); DPRINT("NtQueryDirectoryFile()\n");
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_LIST_DIRECTORY, FILE_LIST_DIRECTORY,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID *)&FileObject, (PVOID *)&FileObject,
NULL); NULL);
@ -117,10 +119,10 @@ NtQueryDirectoryFile(
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->UserIosb = &IoSB; Irp->UserIosb = IoStatusBlock;
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
KeResetEvent( &FileObject->Event ); KeResetEvent( &FileObject->Event );
Irp->UserBuffer=FileInformation; Irp->UserBuffer=FileInformation;
@ -155,20 +157,14 @@ NtQueryDirectoryFile(
Status = IoCallDriver(FileObject->DeviceObject,Irp); Status = IoCallDriver(FileObject->DeviceObject,Irp);
if (Status==STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO)) if (Status==STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
{ {
if (FileObject->Flags & FO_ALERTABLE_IO) KeWaitForSingleObject(&FileObject->Event,
{ Executive,
KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,TRUE,NULL); PreviousMode,
} FileObject->Flags & FO_ALERTABLE_IO,
else NULL);
{ Status = IoStatusBlock->Status;
KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,FALSE,NULL);
}
Status = IoSB.Status;
}
if (IoStatusBlock)
{
*IoStatusBlock = IoSB;
} }
return(Status); return(Status);
} }

View file

@ -1,4 +1,4 @@
/* $Id: file.c,v 1.27 2003/11/08 07:42:10 ekohl Exp $ /* $Id: file.c,v 1.28 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -42,6 +42,7 @@ NtQueryInformationFile(HANDLE FileHandle,
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
PVOID SystemBuffer; PVOID SystemBuffer;
KPROCESSOR_MODE PreviousMode;
assert(IoStatusBlock != NULL); assert(IoStatusBlock != NULL);
assert(FileInformation != NULL); assert(FileInformation != NULL);
@ -50,10 +51,12 @@ NtQueryInformationFile(HANDLE FileHandle,
"Class %d)\n", FileHandle, IoStatusBlock, FileInformation, "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
Length, FileInformationClass); Length, FileInformationClass);
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_READ_ATTRIBUTES, FILE_READ_ATTRIBUTES,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID *)&FileObject, (PVOID *)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -84,7 +87,7 @@ NtQueryInformationFile(HANDLE FileHandle,
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->AssociatedIrp.SystemBuffer = SystemBuffer; Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
Irp->UserIosb = IoStatusBlock; Irp->UserIosb = IoStatusBlock;
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
@ -108,8 +111,8 @@ NtQueryInformationFile(HANDLE FileHandle,
{ {
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
Executive, Executive,
KernelMode, PreviousMode,
FALSE, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
Status = IoStatusBlock->Status; Status = IoStatusBlock->Status;
} }
@ -169,7 +172,7 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject,
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = KernelMode;
Irp->AssociatedIrp.SystemBuffer = FileInformation; Irp->AssociatedIrp.SystemBuffer = FileInformation;
Irp->UserIosb = &IoStatusBlock; Irp->UserIosb = &IoStatusBlock;
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
@ -194,7 +197,7 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject,
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
Executive, Executive,
KernelMode, KernelMode,
FALSE, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
Status = IoStatusBlock.Status; Status = IoStatusBlock.Status;
} }
@ -225,6 +228,7 @@ NtSetInformationFile(HANDLE FileHandle,
PIRP Irp; PIRP Irp;
NTSTATUS Status; NTSTATUS Status;
PVOID SystemBuffer; PVOID SystemBuffer;
KPROCESSOR_MODE PreviousMode;
assert(IoStatusBlock != NULL) assert(IoStatusBlock != NULL)
assert(FileInformation != NULL) assert(FileInformation != NULL)
@ -233,11 +237,13 @@ NtSetInformationFile(HANDLE FileHandle,
"Class %d)\n", FileHandle, IoStatusBlock, FileInformation, "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
Length, FileInformationClass); Length, FileInformationClass);
PreviousMode = ExGetPreviousMode();
/* Get the file object from the file handle */ /* Get the file object from the file handle */
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_ATTRIBUTES, FILE_WRITE_ATTRIBUTES,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID *)&FileObject, (PVOID *)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -261,7 +267,7 @@ NtSetInformationFile(HANDLE FileHandle,
Status = ObReferenceObjectByHandle(((PFILE_COMPLETION_INFORMATION)FileInformation)->IoCompletionHandle, Status = ObReferenceObjectByHandle(((PFILE_COMPLETION_INFORMATION)FileInformation)->IoCompletionHandle,
IO_COMPLETION_MODIFY_STATE,//??? IO_COMPLETION_MODIFY_STATE,//???
ExIoCompletionType, ExIoCompletionType,
UserMode, PreviousMode,
(PVOID*)&Queue, (PVOID*)&Queue,
NULL); NULL);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
@ -305,7 +311,7 @@ NtSetInformationFile(HANDLE FileHandle,
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->AssociatedIrp.SystemBuffer = SystemBuffer; Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
Irp->UserIosb = IoStatusBlock; Irp->UserIosb = IoStatusBlock;
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
@ -334,8 +340,8 @@ NtSetInformationFile(HANDLE FileHandle,
{ {
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
Executive, Executive,
KernelMode, PreviousMode,
FALSE, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
Status = IoStatusBlock->Status; Status = IoStatusBlock->Status;
} }

View file

@ -48,12 +48,14 @@ NtFlushBuffersFile (
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
NTSTATUS Status; NTSTATUS Status;
IO_STATUS_BLOCK IoSB; KPROCESSOR_MODE PreviousMode;
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_DATA, FILE_WRITE_DATA,
NULL, NULL,
UserMode, PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (Status != STATUS_SUCCESS) if (Status != STATUS_SUCCESS)
@ -67,23 +69,26 @@ NtFlushBuffersFile (
0, 0,
NULL, NULL,
&FileObject->Event, &FileObject->Event,
&IoSB); IoStatusBlock);
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr = IoGetNextIrpStackLocation(Irp);
StackPtr->FileObject = FileObject; StackPtr->FileObject = FileObject;
Status = IoCallDriver(FileObject->DeviceObject,Irp); Status = IoCallDriver(FileObject->DeviceObject,Irp);
if (Status == STATUS_PENDING) if (Status == STATUS_PENDING)
{ {
KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,FALSE,NULL); KeWaitForSingleObject(&FileObject->Event,
Status = IoSB.Status; Executive,
} PreviousMode,
if (IoStatusBlock) FileObject->Flags & FO_ALERTABLE_IO,
{ NULL);
*IoStatusBlock = IoSB; Status = IoStatusBlock->Status;
} }
return(Status); return(Status);
} }

View file

@ -1,4 +1,4 @@
/* $Id: fs.c,v 1.39 2003/11/27 00:50:05 gdalsnes Exp $ /* $Id: fs.c,v 1.40 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -77,7 +77,7 @@ NtFsControlFile (
PIRP Irp; PIRP Irp;
PEXTENDED_IO_STACK_LOCATION StackPtr; PEXTENDED_IO_STACK_LOCATION StackPtr;
PKEVENT ptrEvent; PKEVENT ptrEvent;
IO_STATUS_BLOCK IoSB; KPROCESSOR_MODE PreviousMode;
DPRINT("NtFsControlFile(DeviceHandle %x EventHandle %x ApcRoutine %x " DPRINT("NtFsControlFile(DeviceHandle %x EventHandle %x ApcRoutine %x "
"ApcContext %x IoStatusBlock %x IoControlCode %x " "ApcContext %x IoStatusBlock %x IoControlCode %x "
@ -87,10 +87,12 @@ NtFsControlFile (
IoControlCode,InputBuffer,InputBufferSize,OutputBuffer, IoControlCode,InputBuffer,InputBufferSize,OutputBuffer,
OutputBufferSize); OutputBufferSize);
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(DeviceHandle, Status = ObReferenceObjectByHandle(DeviceHandle,
FILE_READ_DATA | FILE_WRITE_DATA, FILE_READ_DATA | FILE_WRITE_DATA,
NULL, NULL,
KernelMode, PreviousMode,
(PVOID *) &FileObject, (PVOID *) &FileObject,
NULL); NULL);
@ -104,7 +106,7 @@ NtFsControlFile (
Status = ObReferenceObjectByHandle (EventHandle, Status = ObReferenceObjectByHandle (EventHandle,
SYNCHRONIZE, SYNCHRONIZE,
ExEventObjectType, ExEventObjectType,
UserMode, PreviousMode,
(PVOID*)&ptrEvent, (PVOID*)&ptrEvent,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -130,11 +132,12 @@ NtFsControlFile (
OutputBufferSize, OutputBufferSize,
FALSE, FALSE,
ptrEvent, ptrEvent,
&IoSB); IoStatusBlock);
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine; Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext; Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
@ -147,15 +150,16 @@ NtFsControlFile (
StackPtr->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL; StackPtr->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL;
Status = IoCallDriver(DeviceObject,Irp); Status = IoCallDriver(DeviceObject,Irp);
if (Status == STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO)) if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
{ {
KeWaitForSingleObject(ptrEvent,Executive,KernelMode,FALSE,NULL); KeWaitForSingleObject(ptrEvent,
Status = IoSB.Status; Executive,
} PreviousMode,
if (IoStatusBlock) FileObject->Flags & FO_ALERTABLE_IO,
{ NULL);
*IoStatusBlock = IoSB; Status = IoStatusBlock->Status;
} }
return(Status); return(Status);
} }

View file

@ -1,4 +1,4 @@
/* $Id: ioctrl.c,v 1.22 2003/11/28 17:17:44 ekohl Exp $ /* $Id: ioctrl.c,v 1.23 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -37,13 +37,13 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
OUT PVOID OutputBuffer, OUT PVOID OutputBuffer,
IN ULONG OutputBufferLength OPTIONAL) IN ULONG OutputBufferLength OPTIONAL)
{ {
IO_STATUS_BLOCK SafeIoStatusBlock;
NTSTATUS Status; NTSTATUS Status;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
PKEVENT EventObject; PKEVENT EventObject;
KPROCESSOR_MODE PreviousMode;
DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x " DPRINT("NtDeviceIoControlFile(DeviceHandle %x Event %x UserApcRoutine %x "
"UserApcContext %x IoStatusBlock %x IoControlCode %x " "UserApcContext %x IoStatusBlock %x IoControlCode %x "
@ -56,10 +56,12 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
if (IoStatusBlock == NULL) if (IoStatusBlock == NULL)
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle (DeviceHandle, Status = ObReferenceObjectByHandle (DeviceHandle,
FILE_READ_DATA | FILE_WRITE_DATA, FILE_READ_DATA | FILE_WRITE_DATA,
IoFileObjectType, IoFileObjectType,
KernelMode, PreviousMode,
(PVOID *) &FileObject, (PVOID *) &FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -72,7 +74,7 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
Status = ObReferenceObjectByHandle (Event, Status = ObReferenceObjectByHandle (Event,
SYNCHRONIZE, SYNCHRONIZE,
ExEventObjectType, ExEventObjectType,
UserMode, PreviousMode,
(PVOID*)&EventObject, (PVOID*)&EventObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -97,11 +99,12 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
OutputBufferLength, OutputBufferLength,
FALSE, FALSE,
EventObject, EventObject,
&SafeIoStatusBlock); IoStatusBlock);
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->Overlay.AsynchronousParameters.UserApcRoutine = UserApcRoutine; Irp->Overlay.AsynchronousParameters.UserApcRoutine = UserApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = UserApcContext; Irp->Overlay.AsynchronousParameters.UserApcContext = UserApcContext;
@ -114,13 +117,10 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
Status = IoCallDriver(DeviceObject,Irp); Status = IoCallDriver(DeviceObject,Irp);
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO)) if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
{ {
BOOLEAN Alertable;
Alertable = (FileObject->Flags & FO_ALERTABLE_IO) ? TRUE : FALSE;
Status = KeWaitForSingleObject (EventObject, Status = KeWaitForSingleObject (EventObject,
Executive, Executive,
UserMode, PreviousMode,
Alertable, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
if (Status != STATUS_WAIT_0) if (Status != STATUS_WAIT_0)
{ {
@ -128,12 +128,9 @@ NtDeviceIoControlFile (IN HANDLE DeviceHandle,
return Status; return Status;
} }
Status = SafeIoStatusBlock.Status; Status = IoStatusBlock->Status;
} }
IoStatusBlock->Status = SafeIoStatusBlock.Status;
IoStatusBlock->Information = SafeIoStatusBlock.Information;
return Status; return Status;
} }

View file

@ -21,9 +21,8 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS static NTSTATUS STDCALL
STDCALL IopLockFileCompletionRoutine(
NtLockFileCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp, IN PIRP Irp,
IN PVOID Context IN PVOID Context
@ -31,7 +30,7 @@ STDCALL
{ {
ExFreePool(Context); ExFreePool(Context);
return STATUS_SUCCESS; return STATUS_SUCCESS;
//FIXME: should I call IoFreeIrp and return STATUS_MORE_PROCESSING_REQUIRED? // FIXME: Should I call IoFreeIrp and return STATUS_MORE_PROCESSING_REQUIRED?
} }
/* /*
@ -44,7 +43,7 @@ NtLockFile (
IN HANDLE EventHandle OPTIONAL, IN HANDLE EventHandle OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL, IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK UserIoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER ByteOffset, IN PLARGE_INTEGER ByteOffset,
IN PLARGE_INTEGER Length, IN PLARGE_INTEGER Length,
IN PULONG Key, IN PULONG Key,
@ -52,74 +51,68 @@ NtLockFile (
IN BOOLEAN ExclusiveLock IN BOOLEAN ExclusiveLock
) )
{ {
NTSTATUS Status;
PFILE_OBJECT FileObject = NULL; PFILE_OBJECT FileObject = NULL;
PLARGE_INTEGER LocalLength = NULL; PLARGE_INTEGER LocalLength = NULL;
PKEVENT Event = NULL; PKEVENT Event = NULL;
PIRP Irp = NULL; PIRP Irp = NULL;
PEXTENDED_IO_STACK_LOCATION StackPtr; PEXTENDED_IO_STACK_LOCATION StackPtr;
IO_STATUS_BLOCK LocalIoStatusBlock;
PIO_STATUS_BLOCK IoStatusBlock;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
ULONG FobFlags; KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
// FIXME: instead of this, use SEH when available? // FIXME: instead of this, use SEH when available?
if (!Length || !ByteOffset) { if (!Length || !ByteOffset)
{
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto fail; goto fail;
} }
Status = ObReferenceObjectByHandle( PreviousMode = ExGetPreviousMode();
FileHandle,
Status = ObReferenceObjectByHandle(FileHandle,
0, 0,
IoFileObjectType, IoFileObjectType,
ExGetPreviousMode(), PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status))
if (!NT_SUCCESS(Status)){ {
goto fail; goto fail;
} }
DeviceObject = IoGetRelatedDeviceObject(FileObject); DeviceObject = IoGetRelatedDeviceObject(FileObject);
Irp = IoAllocateIrp( Irp = IoAllocateIrp(DeviceObject->StackSize,
DeviceObject->StackSize, TRUE);
TRUE if (Irp == NULL)
); {
if (Irp == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto fail; goto fail;
} }
if (EventHandle != NULL && !FailImmediatedly) { if (EventHandle != NULL && !FailImmediatedly)
Status = ObReferenceObjectByHandle( {
EventHandle, Status = ObReferenceObjectByHandle(EventHandle,
SYNCHRONIZE, SYNCHRONIZE,
ExEventObjectType, ExEventObjectType,
ExGetPreviousMode(), PreviousMode,
(PVOID*)&Event, (PVOID*)&Event,
NULL); NULL);
if (!NT_SUCCESS(Status))
if (!NT_SUCCESS(Status)) { {
goto fail; goto fail;
} }
} }
else { else
{
Event = &FileObject->Event; Event = &FileObject->Event;
KeResetEvent(Event); KeResetEvent(Event);
} }
if ((FileObject->Flags & FO_SYNCHRONOUS_IO) || FailImmediatedly) /* Trigger FileObject/Event dereferencing */
IoStatusBlock = &LocalIoStatusBlock;
else
IoStatusBlock = UserIoStatusBlock;
//trigger FileObject/Event dereferencing
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine; Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext; Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
@ -132,15 +125,17 @@ NtLockFile (
StackPtr->MinorFunction = IRP_MN_LOCK; StackPtr->MinorFunction = IRP_MN_LOCK;
StackPtr->FileObject = FileObject; StackPtr->FileObject = FileObject;
if (ExclusiveLock) StackPtr->Flags |= SL_EXCLUSIVE_LOCK; if (ExclusiveLock)
if (FailImmediatedly) StackPtr->Flags |= SL_FAIL_IMMEDIATELY; StackPtr->Flags |= SL_EXCLUSIVE_LOCK;
LocalLength = ExAllocatePoolWithTag( if (FailImmediatedly)
NonPagedPool, StackPtr->Flags |= SL_FAIL_IMMEDIATELY;
LocalLength = ExAllocatePoolWithTag(NonPagedPool,
sizeof(LARGE_INTEGER), sizeof(LARGE_INTEGER),
TAG_LOCK TAG_LOCK);
); if (!LocalLength)
if (!LocalLength){ {
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto fail; goto fail;
} }
@ -151,59 +146,55 @@ NtLockFile (
StackPtr->Parameters.LockControl.ByteOffset = *ByteOffset; StackPtr->Parameters.LockControl.ByteOffset = *ByteOffset;
StackPtr->Parameters.LockControl.Key = Key ? *Key : 0; StackPtr->Parameters.LockControl.Key = Key ? *Key : 0;
IoSetCompletionRoutine( IoSetCompletionRoutine(Irp,
Irp, IopLockFileCompletionRoutine,
NtLockFileCompletionRoutine,
LocalLength, LocalLength,
TRUE, TRUE,
TRUE, TRUE,
TRUE); TRUE);
//can't touch FileObject after IoCallDriver since it might be freed /* Can't touch FileObject after IoCallDriver since it might be freed */
FobFlags = FileObject->Flags;
Status = IofCallDriver(DeviceObject, Irp); Status = IofCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
if (Status == STATUS_PENDING && (FobFlags & FO_SYNCHRONOUS_IO)) { {
Status = KeWaitForSingleObject(Event,
Status = KeWaitForSingleObject(
Event,
Executive, Executive,
ExGetPreviousMode() , PreviousMode,
(FobFlags & FO_ALERTABLE_IO) ? TRUE : FALSE, FileObject->Flags & FO_ALERTABLE_IO,
NULL NULL);
);
if (Status != STATUS_WAIT_0) { if (Status != STATUS_WAIT_0)
{
DPRINT1("NtLockFile -> KeWaitForSingleObject failed!\n"); DPRINT1("NtLockFile -> KeWaitForSingleObject failed!\n");
/* /*
FIXME: should do some special processing here if alertable wait * FIXME: Should do some special processing here if alertable wait
was interupted by user apc or a thread alert (STATUS_ALERTED, STATUS_USER_APC) * was interupted by user apc or a thread alert (STATUS_ALERTED, STATUS_USER_APC)
*/ */
return Status; //set status to something else? return Status; /* Set status to something else? */
} }
Status = LocalIoStatusBlock.Status; Status = IoStatusBlock->Status;
} }
if (FobFlags & FO_SYNCHRONOUS_IO)
*UserIoStatusBlock = LocalIoStatusBlock;
return Status; return Status;
fail:; fail:;
if (LocalLength)
ExFreePool(LocalLength);
if (LocalLength) ExFreePool(LocalLength); if (Irp)
if (Irp) IoFreeIrp(Irp); IoFreeIrp(Irp);
if (Event) ObDereferenceObject(Event);
if (FileObject) ObDereferenceObject(FileObject); if (Event)
ObDereferenceObject(Event);
if (FileObject)
ObDereferenceObject(FileObject);
return Status; return Status;
} }
/* /*
* @unimplemented * @unimplemented
*/ */
@ -211,58 +202,58 @@ NTSTATUS
STDCALL STDCALL
NtUnlockFile ( NtUnlockFile (
IN HANDLE FileHandle, IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK UserIoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER ByteOffset, IN PLARGE_INTEGER ByteOffset,
IN PLARGE_INTEGER Length, IN PLARGE_INTEGER Length,
OUT PULONG Key OPTIONAL OUT PULONG Key OPTIONAL
) )
{ {
NTSTATUS Status;
PFILE_OBJECT FileObject = NULL; PFILE_OBJECT FileObject = NULL;
PLARGE_INTEGER LocalLength = NULL; PLARGE_INTEGER LocalLength = NULL;
PIRP Irp = NULL; PIRP Irp = NULL;
PEXTENDED_IO_STACK_LOCATION StackPtr; PEXTENDED_IO_STACK_LOCATION StackPtr;
IO_STATUS_BLOCK LocalIoStatusBlock;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
// FIXME: instead of this, use SEH when available // FIXME: instead of this, use SEH when available
if (!Length || !ByteOffset) { if (!Length || !ByteOffset)
{
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto fail; goto fail;
} }
PreviousMode = ExGetPreviousMode();
/* /*
BUGBUG: ObReferenceObjectByHandle fails if DesiredAccess=0 and mode=UserMode * BUGBUG: ObReferenceObjectByHandle fails if DesiredAccess=0 and mode=UserMode
It should ONLY fail if we desire an access that conflict with granted access! * It should ONLY fail if we desire an access that conflict with granted access!
*/ */
Status = ObReferenceObjectByHandle( Status = ObReferenceObjectByHandle(FileHandle,
FileHandle, 0, //FILE_READ_DATA,//BUGBUG: have to use something...but shouldn't have to!
FILE_READ_DATA,//BUGBUG: have to use something...but shouldn't have to!
IoFileObjectType, IoFileObjectType,
ExGetPreviousMode(), PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status))
if (!NT_SUCCESS(Status)){ {
goto fail; goto fail;
} }
DeviceObject = IoGetRelatedDeviceObject(FileObject); DeviceObject = IoGetRelatedDeviceObject(FileObject);
Irp = IoAllocateIrp( Irp = IoAllocateIrp(DeviceObject->StackSize,
DeviceObject->StackSize, TRUE);
TRUE if (Irp == NULL)
); {
if (Irp == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto fail; goto fail;
} }
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->UserIosb = &LocalIoStatusBlock; Irp->UserIosb = IoStatusBlock;
Irp->Tail.Overlay.Thread = PsGetCurrentThread(); Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = (PEXTENDED_IO_STACK_LOCATION) IoGetNextIrpStackLocation(Irp); StackPtr = (PEXTENDED_IO_STACK_LOCATION) IoGetNextIrpStackLocation(Irp);
@ -271,12 +262,11 @@ NtUnlockFile (
StackPtr->DeviceObject = DeviceObject; StackPtr->DeviceObject = DeviceObject;
StackPtr->FileObject = FileObject; StackPtr->FileObject = FileObject;
LocalLength = ExAllocatePoolWithTag( LocalLength = ExAllocatePoolWithTag(NonPagedPool,
NonPagedPool,
sizeof(LARGE_INTEGER), sizeof(LARGE_INTEGER),
TAG_LOCK TAG_LOCK);
); if (!LocalLength)
if (!LocalLength){ {
Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
goto fail; goto fail;
} }
@ -287,20 +277,22 @@ NtUnlockFile (
StackPtr->Parameters.LockControl.ByteOffset = *ByteOffset; StackPtr->Parameters.LockControl.ByteOffset = *ByteOffset;
StackPtr->Parameters.LockControl.Key = Key ? *Key : 0; StackPtr->Parameters.LockControl.Key = Key ? *Key : 0;
//allways syncronious /* Allways synchronous */
Status = IofCallDriver(DeviceObject, Irp); Status = IofCallDriver(DeviceObject, Irp);
*UserIoStatusBlock = LocalIoStatusBlock;
ExFreePool(LocalLength); ExFreePool(LocalLength);
return Status; return Status;
fail:; fail:;
if (LocalLength)
ExFreePool(LocalLength);
if (LocalLength) ExFreePool(LocalLength); if (Irp)
if (Irp) IoFreeIrp(Irp); IoFreeIrp(Irp);
if (FileObject) ObDereferenceObject(FileObject);
if (FileObject)
ObDereferenceObject(FileObject);
return Status; return Status;
} }

View file

@ -1,4 +1,4 @@
/* $Id: rw.c,v 1.51 2003/11/30 19:59:41 gdalsnes Exp $ /* $Id: rw.c,v 1.52 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -50,6 +50,7 @@ NtReadFile (IN HANDLE FileHandle,
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
KPROCESSOR_MODE PreviousMode;
PKEVENT EventObject = NULL; PKEVENT EventObject = NULL;
DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, " DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
@ -59,10 +60,12 @@ NtReadFile (IN HANDLE FileHandle,
if (IoStatusBlock == NULL) if (IoStatusBlock == NULL)
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_READ_DATA, FILE_READ_DATA,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -88,7 +91,7 @@ NtReadFile (IN HANDLE FileHandle,
Status = ObReferenceObjectByHandle(Event, Status = ObReferenceObjectByHandle(Event,
SYNCHRONIZE, SYNCHRONIZE,
ExEventObjectType, ExEventObjectType,
UserMode, PreviousMode,
(PVOID*)&EventObject, (PVOID*)&EventObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -112,6 +115,8 @@ NtReadFile (IN HANDLE FileHandle,
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine; Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext; Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
@ -124,9 +129,10 @@ NtReadFile (IN HANDLE FileHandle,
{ {
Status = KeWaitForSingleObject (&FileObject->Event, Status = KeWaitForSingleObject (&FileObject->Event,
Executive, Executive,
UserMode, PreviousMode,
FileObject->Flags & FO_ALERTABLE_IO, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
if (Status != STATUS_WAIT_0) if (Status != STATUS_WAIT_0)
{ {
/* Wait failed. */ /* Wait failed. */
@ -169,6 +175,7 @@ NtWriteFile (IN HANDLE FileHandle,
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PIRP Irp; PIRP Irp;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
KPROCESSOR_MODE PreviousMode;
PKEVENT EventObject = NULL; PKEVENT EventObject = NULL;
DPRINT("NtWriteFile(FileHandle %x Buffer %x Length %x ByteOffset %x, " DPRINT("NtWriteFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
@ -178,10 +185,12 @@ NtWriteFile (IN HANDLE FileHandle,
if (IoStatusBlock == NULL) if (IoStatusBlock == NULL)
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_DATA, FILE_WRITE_DATA,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -207,7 +216,7 @@ NtWriteFile (IN HANDLE FileHandle,
Status = ObReferenceObjectByHandle(Event, Status = ObReferenceObjectByHandle(Event,
SYNCHRONIZE, SYNCHRONIZE,
ExEventObjectType, ExEventObjectType,
UserMode, PreviousMode,
(PVOID*)&EventObject, (PVOID*)&EventObject,
NULL); NULL);
@ -233,6 +242,8 @@ NtWriteFile (IN HANDLE FileHandle,
/* Trigger FileObject/Event dereferencing */ /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine; Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext; Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
@ -245,7 +256,7 @@ NtWriteFile (IN HANDLE FileHandle,
{ {
Status = KeWaitForSingleObject (&FileObject->Event, Status = KeWaitForSingleObject (&FileObject->Event,
Executive, Executive,
UserMode, PreviousMode,
FileObject->Flags & FO_ALERTABLE_IO, FileObject->Flags & FO_ALERTABLE_IO,
NULL); NULL);
if (Status != STATUS_WAIT_0) if (Status != STATUS_WAIT_0)

View file

@ -1,4 +1,4 @@
/* $Id: vpb.c,v 1.23 2003/10/12 17:05:45 hbirr Exp $ /* $Id: vpb.c,v 1.24 2003/12/13 14:36:42 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -65,16 +65,6 @@ IoAttachVpb(PDEVICE_OBJECT DeviceObject)
} }
/*
* @implemented
*/
NTSTATUS STDCALL
NtQueryVolumeInformationFile(IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FsInformation,
IN ULONG Length,
IN FS_INFORMATION_CLASS FsInformationClass)
/* /*
* FUNCTION: Queries the volume information * FUNCTION: Queries the volume information
* ARGUMENTS: * ARGUMENTS:
@ -96,7 +86,16 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
* FileFsMaximumInformation * FileFsMaximumInformation
* *
* RETURNS: Status * RETURNS: Status
*
* @implemented
*/ */
NTSTATUS STDCALL
NtQueryVolumeInformationFile(IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FsInformation,
IN ULONG Length,
IN FS_INFORMATION_CLASS FsInformationClass)
{ {
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT DeviceObject;
@ -104,17 +103,19 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
NTSTATUS Status; NTSTATUS Status;
PIO_STACK_LOCATION StackPtr; PIO_STACK_LOCATION StackPtr;
PVOID SystemBuffer; PVOID SystemBuffer;
IO_STATUS_BLOCK IoSB; KPROCESSOR_MODE PreviousMode;
assert(IoStatusBlock != NULL); assert(IoStatusBlock != NULL);
assert(FsInformation != NULL); assert(FsInformation != NULL);
DPRINT("FsInformation %p\n", FsInformation); DPRINT("FsInformation %p\n", FsInformation);
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_READ_ATTRIBUTES, FILE_READ_ATTRIBUTES,
IoFileObjectType, IoFileObjectType,
UserMode, PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -142,13 +143,14 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
return(STATUS_INSUFFICIENT_RESOURCES); return(STATUS_INSUFFICIENT_RESOURCES);
} }
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->AssociatedIrp.SystemBuffer = SystemBuffer; Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
KeResetEvent( &FileObject->Event ); KeResetEvent( &FileObject->Event );
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
Irp->UserIosb = &IoSB; Irp->UserIosb = IoStatusBlock;
Irp->Tail.Overlay.Thread = PsGetCurrentThread(); Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr = IoGetNextIrpStackLocation(Irp);
@ -168,10 +170,10 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
{ {
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
UserRequest, UserRequest,
KernelMode, PreviousMode,
FALSE, FALSE,
NULL); NULL);
Status = IoSB.Status; Status = IoStatusBlock->Status;
} }
DPRINT("Status %x\n", Status); DPRINT("Status %x\n", Status);
@ -180,12 +182,9 @@ NtQueryVolumeInformationFile(IN HANDLE FileHandle,
DPRINT("Information %lu\n", IoStatusBlock->Information); DPRINT("Information %lu\n", IoStatusBlock->Information);
MmSafeCopyToUser(FsInformation, MmSafeCopyToUser(FsInformation,
SystemBuffer, SystemBuffer,
IoSB.Information); IoStatusBlock->Information);
}
if (IoStatusBlock)
{
*IoStatusBlock = IoSB;
} }
ExFreePool(SystemBuffer); ExFreePool(SystemBuffer);
return(Status); return(Status);
@ -231,9 +230,9 @@ IoQueryVolumeInformation(IN PFILE_OBJECT FileObject,
return(STATUS_INSUFFICIENT_RESOURCES); return(STATUS_INSUFFICIENT_RESOURCES);
} }
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = KernelMode;
Irp->AssociatedIrp.SystemBuffer = FsInformation; Irp->AssociatedIrp.SystemBuffer = FsInformation;
KeResetEvent( &FileObject->Event ); KeResetEvent( &FileObject->Event );
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
@ -289,12 +288,17 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
NTSTATUS Status; NTSTATUS Status;
PEXTENDED_IO_STACK_LOCATION StackPtr; PEXTENDED_IO_STACK_LOCATION StackPtr;
PVOID SystemBuffer; PVOID SystemBuffer;
IO_STATUS_BLOCK IoSB; KPROCESSOR_MODE PreviousMode;
assert(IoStatusBlock != NULL);
assert(FsInformation != NULL);
PreviousMode = ExGetPreviousMode();
Status = ObReferenceObjectByHandle(FileHandle, Status = ObReferenceObjectByHandle(FileHandle,
FILE_WRITE_ATTRIBUTES, FILE_WRITE_ATTRIBUTES,
NULL, NULL,
UserMode, PreviousMode,
(PVOID*)&FileObject, (PVOID*)&FileObject,
NULL); NULL);
if (Status != STATUS_SUCCESS) if (Status != STATUS_SUCCESS)
@ -325,13 +329,13 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
FsInformation, FsInformation,
Length); Length);
//trigger FileObject/Event dereferencing /* Trigger FileObject/Event dereferencing */
Irp->Tail.Overlay.OriginalFileObject = FileObject; Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
Irp->AssociatedIrp.SystemBuffer = SystemBuffer; Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
KeResetEvent( &FileObject->Event ); KeResetEvent( &FileObject->Event );
Irp->UserEvent = &FileObject->Event; Irp->UserEvent = &FileObject->Event;
Irp->UserIosb = &IoSB; Irp->UserIosb = IoStatusBlock;
Irp->Tail.Overlay.Thread = PsGetCurrentThread(); Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = (PEXTENDED_IO_STACK_LOCATION) IoGetNextIrpStackLocation(Irp); StackPtr = (PEXTENDED_IO_STACK_LOCATION) IoGetNextIrpStackLocation(Irp);
@ -350,15 +354,12 @@ NtSetVolumeInformationFile(IN HANDLE FileHandle,
{ {
KeWaitForSingleObject(&FileObject->Event, KeWaitForSingleObject(&FileObject->Event,
UserRequest, UserRequest,
KernelMode, PreviousMode,
FALSE, FALSE,
NULL); NULL);
Status = IoSB.Status; Status = IoStatusBlock->Status;
}
if (IoStatusBlock)
{
*IoStatusBlock = IoSB;
} }
ExFreePool(SystemBuffer); ExFreePool(SystemBuffer);
return(Status); return(Status);