/*\r
* @implemented\r
*/\r
-NTSTATUS STDCALL\r
+NTSTATUS\r
+NTAPI\r
IoQueryVolumeInformation(IN PFILE_OBJECT FileObject,\r
- IN FS_INFORMATION_CLASS FsInformationClass,\r
- IN ULONG Length,\r
- OUT PVOID FsInformation,\r
- OUT PULONG ReturnedLength)\r
+ IN FS_INFORMATION_CLASS FsInformationClass,\r
+ IN ULONG Length,\r
+ OUT PVOID FsInformation,\r
+ OUT PULONG ReturnedLength)\r
{\r
- IO_STATUS_BLOCK IoStatusBlock;\r
- PIO_STACK_LOCATION StackPtr;\r
- PDEVICE_OBJECT DeviceObject;\r
- PIRP Irp;\r
- NTSTATUS Status;\r
-\r
- ASSERT(FsInformation != NULL);\r
-\r
- DPRINT("FsInformation %p\n", FsInformation);\r
-\r
- Status = ObReferenceObjectByPointer(FileObject,\r
- FILE_READ_ATTRIBUTES,\r
- IoFileObjectType,\r
- KernelMode);\r
- if (!NT_SUCCESS(Status))\r
- {\r
- return(Status);\r
- }\r
+ IO_STATUS_BLOCK IoStatusBlock;\r
+ PIO_STACK_LOCATION StackPtr;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ PIRP Irp;\r
+ NTSTATUS Status;\r
\r
- DeviceObject = FileObject->DeviceObject;\r
+ Status = ObReferenceObjectByPointer(FileObject,\r
+ FILE_READ_ATTRIBUTES,\r
+ IoFileObjectType,\r
+ KernelMode);\r
+ if (!NT_SUCCESS(Status)) return(Status);\r
\r
- Irp = IoAllocateIrp(DeviceObject->StackSize,\r
- TRUE);\r
- if (Irp == NULL)\r
- {\r
- ObDereferenceObject(FileObject);\r
- return(STATUS_INSUFFICIENT_RESOURCES);\r
- }\r
+ DeviceObject = FileObject->DeviceObject;\r
\r
- /* Trigger FileObject/Event dereferencing */\r
- Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
- Irp->RequestorMode = KernelMode;\r
- Irp->AssociatedIrp.SystemBuffer = FsInformation;\r
- KeResetEvent( &FileObject->Event );\r
- Irp->UserEvent = &FileObject->Event;\r
- Irp->UserIosb = &IoStatusBlock;\r
- Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
-\r
- StackPtr = IoGetNextIrpStackLocation(Irp);\r
- StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;\r
- StackPtr->MinorFunction = 0;\r
- StackPtr->Flags = 0;\r
- StackPtr->Control = 0;\r
- StackPtr->DeviceObject = DeviceObject;\r
- StackPtr->FileObject = FileObject;\r
- StackPtr->Parameters.QueryVolume.Length = Length;\r
- StackPtr->Parameters.QueryVolume.FsInformationClass =\r
- FsInformationClass;\r
-\r
- Status = IoCallDriver(DeviceObject,\r
- Irp);\r
- if (Status == STATUS_PENDING)\r
- {\r
- KeWaitForSingleObject(&FileObject->Event,\r
- UserRequest,\r
- KernelMode,\r
- FALSE,\r
- NULL);\r
- Status = IoStatusBlock.Status;\r
- }\r
- DPRINT("Status %x\n", Status);\r
+ Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);\r
+ if (!Irp)\r
+ {\r
+ ObDereferenceObject(FileObject);\r
+ return(STATUS_INSUFFICIENT_RESOURCES);\r
+ }\r
\r
- if (ReturnedLength != NULL)\r
- {\r
- *ReturnedLength = IoStatusBlock.Information;\r
- }\r
+ /* Trigger FileObject/Event dereferencing */\r
+ Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
+ Irp->RequestorMode = KernelMode;\r
+ Irp->AssociatedIrp.SystemBuffer = FsInformation;\r
+ KeResetEvent( &FileObject->Event );\r
+ Irp->UserEvent = &FileObject->Event;\r
+ Irp->UserIosb = &IoStatusBlock;\r
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
+\r
+ StackPtr = IoGetNextIrpStackLocation(Irp);\r
+ StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;\r
+ StackPtr->MinorFunction = 0;\r
+ StackPtr->Flags = 0;\r
+ StackPtr->Control = 0;\r
+ StackPtr->DeviceObject = DeviceObject;\r
+ StackPtr->FileObject = FileObject;\r
+ StackPtr->Parameters.QueryVolume.Length = Length;\r
+ StackPtr->Parameters.QueryVolume.FsInformationClass =\r
+ FsInformationClass;\r
\r
- return(Status);\r
+ Status = IoCallDriver(DeviceObject, Irp);\r
+ if (Status == STATUS_PENDING)\r
+ {\r
+ KeWaitForSingleObject(&FileObject->Event,\r
+ UserRequest,\r
+ KernelMode,\r
+ FALSE,\r
+ NULL);\r
+ Status = IoStatusBlock.Status;\r
+ }\r
+\r
+ if (ReturnedLength) *ReturnedLength = IoStatusBlock.Information;\r
+ return Status;\r
}\r
\r
/*\r
* @unimplemented\r
*/\r
-NTSTATUS STDCALL\r
+NTSTATUS\r
+NTAPI\r
IoSetInformation(IN PFILE_OBJECT FileObject,\r
- IN FILE_INFORMATION_CLASS FileInformationClass,\r
- IN ULONG Length,\r
- IN PVOID FileInformation)\r
+ IN FILE_INFORMATION_CLASS FileInformationClass,\r
+ IN ULONG Length,\r
+ IN PVOID FileInformation)\r
{\r
- IO_STATUS_BLOCK IoStatusBlock;\r
- PIRP Irp;\r
- PDEVICE_OBJECT DeviceObject;\r
- PIO_STACK_LOCATION StackPtr;\r
- NTSTATUS Status;\r
-\r
- ASSERT(FileInformation != NULL);\r
-\r
- if (FileInformationClass == FileCompletionInformation)\r
- {\r
- return STATUS_NOT_IMPLEMENTED;\r
- }\r
-\r
-\r
-\r
- Status = ObReferenceObjectByPointer(FileObject,\r
- 0, /* FIXME - depends on the information class */\r
- IoFileObjectType,\r
- KernelMode);\r
- if (!NT_SUCCESS(Status))\r
- {\r
- return(Status);\r
- }\r
-\r
- DPRINT("FileObject 0x%p\n", FileObject);\r
-\r
- DeviceObject = FileObject->DeviceObject;\r
-\r
- Irp = IoAllocateIrp(DeviceObject->StackSize,\r
- TRUE);\r
- if (Irp == NULL)\r
- {\r
- ObDereferenceObject(FileObject);\r
- return STATUS_INSUFFICIENT_RESOURCES;\r
- }\r
-\r
- /* Trigger FileObject/Event dereferencing */\r
- Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
- Irp->RequestorMode = KernelMode;\r
- Irp->AssociatedIrp.SystemBuffer = FileInformation;\r
- Irp->UserIosb = &IoStatusBlock;\r
- Irp->UserEvent = &FileObject->Event;\r
- Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
- KeResetEvent( &FileObject->Event );\r
-\r
- StackPtr = IoGetNextIrpStackLocation(Irp);\r
- StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;\r
- StackPtr->MinorFunction = 0;\r
- StackPtr->Flags = 0;\r
- StackPtr->Control = 0;\r
- StackPtr->DeviceObject = DeviceObject;\r
- StackPtr->FileObject = FileObject;\r
- StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;\r
- StackPtr->Parameters.SetFile.Length = Length;\r
-\r
- Status = IoCallDriver(FileObject->DeviceObject, Irp);\r
- if (Status==STATUS_PENDING)\r
- {\r
- KeWaitForSingleObject(&FileObject->Event,\r
- Executive,\r
- KernelMode,\r
- FileObject->Flags & FO_ALERTABLE_IO,\r
- NULL);\r
- Status = IoStatusBlock.Status;\r
- }\r
-\r
- return Status;\r
+ IO_STATUS_BLOCK IoStatusBlock;\r
+ PIRP Irp;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ PIO_STACK_LOCATION StackPtr;\r
+ NTSTATUS Status;\r
+\r
+ if (FileInformationClass == FileCompletionInformation)\r
+ {\r
+ return STATUS_NOT_IMPLEMENTED;\r
+ }\r
+\r
+ Status = ObReferenceObjectByPointer(FileObject,\r
+ 0, /* FIXME - depends on the information class */\r
+ IoFileObjectType,\r
+ KernelMode);\r
+ if (!NT_SUCCESS(Status)) return(Status);\r
+\r
+\r
+ DeviceObject = FileObject->DeviceObject;\r
+\r
+ Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);\r
+ if (!Irp)\r
+ {\r
+ ObDereferenceObject(FileObject);\r
+ return STATUS_INSUFFICIENT_RESOURCES;\r
+ }\r
+\r
+ /* Trigger FileObject/Event dereferencing */\r
+ Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
+ Irp->RequestorMode = KernelMode;\r
+ Irp->AssociatedIrp.SystemBuffer = FileInformation;\r
+ Irp->UserIosb = &IoStatusBlock;\r
+ Irp->UserEvent = &FileObject->Event;\r
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
+ KeResetEvent( &FileObject->Event );\r
+\r
+ StackPtr = IoGetNextIrpStackLocation(Irp);\r
+ StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;\r
+ StackPtr->MinorFunction = 0;\r
+ StackPtr->Flags = 0;\r
+ StackPtr->Control = 0;\r
+ StackPtr->DeviceObject = DeviceObject;\r
+ StackPtr->FileObject = FileObject;\r
+ StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;\r
+ StackPtr->Parameters.SetFile.Length = Length;\r
+\r
+ Status = IoCallDriver(FileObject->DeviceObject, Irp);\r
+ if (Status==STATUS_PENDING)\r
+ {\r
+ KeWaitForSingleObject(&FileObject->Event,\r
+ Executive,\r
+ KernelMode,\r
+ FileObject->Flags & FO_ALERTABLE_IO,\r
+ NULL);\r
+ Status = IoStatusBlock.Status;\r
+ }\r
+\r
+ return Status;\r
}\r
\r
/* NATIVE SERVICES ***********************************************************/\r
}\r
}\r
\r
-\r
return Status;\r
\r
Cleanup:\r
IN PULONG Key OPTIONAL)\r
{\r
UNIMPLEMENTED;\r
- return(STATUS_NOT_IMPLEMENTED);\r
+ return STATUS_NOT_IMPLEMENTED;\r
}\r
\r
/*\r
*/\r
NTSTATUS\r
NTAPI\r
-NtWriteFile (IN HANDLE FileHandle,\r
- IN HANDLE Event OPTIONAL,\r
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\r
- IN PVOID ApcContext OPTIONAL,\r
- OUT PIO_STATUS_BLOCK IoStatusBlock,\r
- IN PVOID Buffer,\r
- IN ULONG Length,\r
- IN PLARGE_INTEGER ByteOffset OPTIONAL,\r
- IN PULONG Key OPTIONAL)\r
+NtWriteFile(IN HANDLE FileHandle,\r
+ IN HANDLE Event OPTIONAL,\r
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,\r
+ IN PVOID ApcContext OPTIONAL,\r
+ OUT PIO_STATUS_BLOCK IoStatusBlock,\r
+ IN PVOID Buffer,\r
+ IN ULONG Length,\r
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,\r
+ IN PULONG Key OPTIONAL)\r
{\r
OBJECT_HANDLE_INFORMATION ObjectHandleInfo;\r
NTSTATUS Status = STATUS_SUCCESS;\r
DesiredAccess |= FILE_APPEND_DATA;\r
\r
/* Validate User-Mode Buffers */\r
- if(PreviousMode != KernelMode)\r
+ if (PreviousMode != KernelMode)\r
{\r
/* check if the handle has either FILE_WRITE_DATA or FILE_APPEND_DATA was\r
granted. */\r
OUT PIO_STATUS_BLOCK UserIoStatusBlock,\r
IN FILE_SEGMENT_ELEMENT BufferDescription [],\r
IN ULONG BufferLength,\r
- IN PLARGE_INTEGER ByteOffset,\r
+ IN PLARGE_INTEGER ByteOffset,\r
IN PULONG Key OPTIONAL)\r
{\r
UNIMPLEMENTED;\r
- return(STATUS_NOT_IMPLEMENTED);\r
+ return STATUS_NOT_IMPLEMENTED;\r
}\r
\r
/*\r
- * FUNCTION: Queries the volume information\r
- * ARGUMENTS:\r
- * FileHandle = Handle to a file object on the target volume\r
- * ReturnLength = DataWritten\r
- * FsInformation = Caller should supply storage for the information\r
- * structure.\r
- * Length = Size of the information structure\r
- * FsInformationClass = Index to a information structure\r
- *\r
- * FileFsVolumeInformation FILE_FS_VOLUME_INFORMATION\r
- * FileFsLabelInformation FILE_FS_LABEL_INFORMATION\r
- * FileFsSizeInformation FILE_FS_SIZE_INFORMATION\r
- * FileFsDeviceInformation FILE_FS_DEVICE_INFORMATION\r
- * FileFsAttributeInformation FILE_FS_ATTRIBUTE_INFORMATION\r
- * FileFsControlInformation\r
- * FileFsQuotaQueryInformation --\r
- * FileFsQuotaSetInformation --\r
- * FileFsMaximumInformation\r
- *\r
- * RETURNS: Status\r
- *\r
* @implemented\r
*/\r
-\r
-NTSTATUS STDCALL\r
+NTSTATUS\r
+NTAPI\r
NtQueryVolumeInformationFile(IN HANDLE FileHandle,\r
- OUT PIO_STATUS_BLOCK IoStatusBlock,\r
- OUT PVOID FsInformation,\r
- IN ULONG Length,\r
- IN FS_INFORMATION_CLASS FsInformationClass)\r
+ OUT PIO_STATUS_BLOCK IoStatusBlock,\r
+ OUT PVOID FsInformation,\r
+ IN ULONG Length,\r
+ IN FS_INFORMATION_CLASS FsInformationClass)\r
{\r
- PFILE_OBJECT FileObject;\r
- PDEVICE_OBJECT DeviceObject;\r
- PIRP Irp;\r
- NTSTATUS Status = STATUS_SUCCESS;\r
- PIO_STACK_LOCATION StackPtr;\r
- PVOID SystemBuffer;\r
- KPROCESSOR_MODE PreviousMode;\r
-\r
- DPRINT("FsInformation %p\n", FsInformation);\r
-\r
- PreviousMode = ExGetPreviousMode();\r
- \r
- if (PreviousMode != KernelMode)\r
- {\r
+ PFILE_OBJECT FileObject;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ PIRP Irp;\r
+ NTSTATUS Status = STATUS_SUCCESS;\r
+ PIO_STACK_LOCATION StackPtr;\r
+ PVOID SystemBuffer;\r
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();\r
+\r
+ if (PreviousMode != KernelMode)\r
+ {\r
_SEH_TRY\r
{\r
- if (IoStatusBlock != NULL)\r
+ if (IoStatusBlock)\r
{\r
ProbeForWrite(IoStatusBlock,\r
sizeof(IO_STATUS_BLOCK),\r
sizeof(ULONG));\r
}\r
\r
- if (Length != 0)\r
- {\r
- ProbeForWrite(FsInformation,\r
- Length,\r
- 1);\r
- }\r
+ if (Length) ProbeForWrite(FsInformation, Length, 1);\r
}\r
_SEH_HANDLE\r
{\r
{\r
return Status;\r
}\r
- }\r
- else\r
- {\r
- ASSERT(IoStatusBlock != NULL);\r
- ASSERT(FsInformation != NULL);\r
- }\r
-\r
- Status = ObReferenceObjectByHandle(FileHandle,\r
- 0, /* FIXME - depends on the information class! */\r
- IoFileObjectType,\r
- PreviousMode,\r
- (PVOID*)&FileObject,\r
- NULL);\r
- if (!NT_SUCCESS(Status))\r
- {\r
- return(Status);\r
- }\r
+ }\r
\r
- DeviceObject = FileObject->DeviceObject;\r
+ Status = ObReferenceObjectByHandle(FileHandle,\r
+ 0, /* FIXME - depends on the information class! */\r
+ IoFileObjectType,\r
+ PreviousMode,\r
+ (PVOID*)&FileObject,\r
+ NULL);\r
+ if (!NT_SUCCESS(Status)) return Status;\r
\r
- Irp = IoAllocateIrp(DeviceObject->StackSize,\r
- TRUE);\r
- if (Irp == NULL)\r
- {\r
- ObDereferenceObject(FileObject);\r
- return(STATUS_INSUFFICIENT_RESOURCES);\r
- }\r
+ DeviceObject = FileObject->DeviceObject;\r
\r
- SystemBuffer = ExAllocatePoolWithTag(NonPagedPool,\r
- Length,\r
- TAG_SYSB);\r
- if (SystemBuffer == NULL)\r
- {\r
- IoFreeIrp(Irp);\r
- ObDereferenceObject(FileObject);\r
- return(STATUS_INSUFFICIENT_RESOURCES);\r
- }\r
+ Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);\r
+ if (!Irp)\r
+ {\r
+ ObDereferenceObject(FileObject);\r
+ return STATUS_INSUFFICIENT_RESOURCES;\r
+ }\r
+\r
+ SystemBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, TAG_SYSB);\r
+ if (!SystemBuffer)\r
+ {\r
+ IoFreeIrp(Irp);\r
+ ObDereferenceObject(FileObject);\r
+ return STATUS_INSUFFICIENT_RESOURCES;\r
+ }\r
+\r
+ /* Trigger FileObject/Event dereferencing */\r
+ Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
+\r
+ Irp->RequestorMode = PreviousMode;\r
+ Irp->AssociatedIrp.SystemBuffer = SystemBuffer;\r
+ KeResetEvent( &FileObject->Event );\r
+ Irp->UserEvent = &FileObject->Event;\r
+ Irp->UserIosb = IoStatusBlock;\r
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
+\r
+ StackPtr = IoGetNextIrpStackLocation(Irp);\r
+ StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;\r
+ StackPtr->MinorFunction = 0;\r
+ StackPtr->Flags = 0;\r
+ StackPtr->Control = 0;\r
+ StackPtr->DeviceObject = DeviceObject;\r
+ StackPtr->FileObject = FileObject;\r
+ StackPtr->Parameters.QueryVolume.Length = Length;\r
+ StackPtr->Parameters.QueryVolume.FsInformationClass =\r
+ FsInformationClass;\r
\r
- /* Trigger FileObject/Event dereferencing */\r
- Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
-\r
- Irp->RequestorMode = PreviousMode;\r
- Irp->AssociatedIrp.SystemBuffer = SystemBuffer;\r
- KeResetEvent( &FileObject->Event );\r
- Irp->UserEvent = &FileObject->Event;\r
- Irp->UserIosb = IoStatusBlock;\r
- Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
-\r
- StackPtr = IoGetNextIrpStackLocation(Irp);\r
- StackPtr->MajorFunction = IRP_MJ_QUERY_VOLUME_INFORMATION;\r
- StackPtr->MinorFunction = 0;\r
- StackPtr->Flags = 0;\r
- StackPtr->Control = 0;\r
- StackPtr->DeviceObject = DeviceObject;\r
- StackPtr->FileObject = FileObject;\r
- StackPtr->Parameters.QueryVolume.Length = Length;\r
- StackPtr->Parameters.QueryVolume.FsInformationClass =\r
- FsInformationClass;\r
-\r
- Status = IoCallDriver(DeviceObject,\r
- Irp);\r
- if (Status == STATUS_PENDING)\r
- {\r
- KeWaitForSingleObject(&FileObject->Event,\r
- UserRequest,\r
- PreviousMode,\r
- FALSE,\r
- NULL);\r
- Status = IoStatusBlock->Status;\r
+ Status = IoCallDriver(DeviceObject, Irp);\r
+ if (Status == STATUS_PENDING)\r
+ {\r
+ KeWaitForSingleObject(&FileObject->Event,\r
+ UserRequest,\r
+ PreviousMode,\r
+ FALSE,\r
+ NULL);\r
+ Status = IoStatusBlock->Status;\r
}\r
- DPRINT("Status %x\n", Status);\r
\r
- if (NT_SUCCESS(Status))\r
- {\r
+ if (NT_SUCCESS(Status))\r
+ {\r
_SEH_TRY\r
{\r
- DPRINT("Information %lu\n", IoStatusBlock->Information);\r
RtlCopyMemory(FsInformation,\r
SystemBuffer,\r
IoStatusBlock->Information);\r
- }\r
- _SEH_HANDLE\r
- {\r
+ }\r
+ _SEH_HANDLE\r
+ {\r
Status = _SEH_GetExceptionCode();\r
- }\r
+ }\r
_SEH_END;\r
}\r
\r
- ExFreePool(SystemBuffer);\r
-\r
- return(Status);\r
+ ExFreePool(SystemBuffer);\r
+ return Status;\r
}\r
\r
/*\r
* @implemented\r
*/\r
-NTSTATUS STDCALL\r
+NTSTATUS\r
+NTAPI\r
NtSetVolumeInformationFile(IN HANDLE FileHandle,\r
- OUT PIO_STATUS_BLOCK IoStatusBlock,\r
- IN PVOID FsInformation,\r
- IN ULONG Length,\r
- IN FS_INFORMATION_CLASS FsInformationClass)\r
+ OUT PIO_STATUS_BLOCK IoStatusBlock,\r
+ IN PVOID FsInformation,\r
+ IN ULONG Length,\r
+ IN FS_INFORMATION_CLASS FsInformationClass)\r
{\r
- PFILE_OBJECT FileObject;\r
- PDEVICE_OBJECT DeviceObject;\r
- PIRP Irp;\r
- NTSTATUS Status;\r
- PIO_STACK_LOCATION StackPtr;\r
- PVOID SystemBuffer;\r
- KPROCESSOR_MODE PreviousMode;\r
-\r
- PreviousMode = ExGetPreviousMode();\r
- \r
- if (PreviousMode != KernelMode)\r
- {\r
- Status = STATUS_SUCCESS;\r
- _SEH_TRY\r
- {\r
- if (IoStatusBlock != NULL)\r
- {\r
- ProbeForWrite(IoStatusBlock,\r
- sizeof(IO_STATUS_BLOCK),\r
- sizeof(ULONG));\r
- }\r
-\r
- if (Length != 0)\r
- {\r
- ProbeForRead(FsInformation,\r
- Length,\r
- 1);\r
- }\r
- }\r
- _SEH_HANDLE\r
- {\r
- Status = _SEH_GetExceptionCode();\r
- }\r
- _SEH_END;\r
-\r
- if (!NT_SUCCESS(Status))\r
- {\r
- return Status;\r
- }\r
- }\r
- else\r
- {\r
- ASSERT(IoStatusBlock != NULL);\r
- ASSERT(FsInformation != NULL);\r
- }\r
-\r
- Status = ObReferenceObjectByHandle(FileHandle,\r
- FILE_WRITE_ATTRIBUTES,\r
- NULL,\r
- PreviousMode,\r
- (PVOID*)&FileObject,\r
- NULL);\r
- if (Status != STATUS_SUCCESS)\r
- {\r
- return(Status);\r
- }\r
+ PFILE_OBJECT FileObject;\r
+ PDEVICE_OBJECT DeviceObject;\r
+ PIRP Irp;\r
+ NTSTATUS Status = STATUS_SUCCESS;\r
+ PIO_STACK_LOCATION StackPtr;\r
+ PVOID SystemBuffer;\r
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();\r
\r
- DeviceObject = FileObject->DeviceObject;\r
+ if (PreviousMode != KernelMode)\r
+ {\r
+ _SEH_TRY\r
+ {\r
+ if (IoStatusBlock)\r
+ {\r
+ ProbeForWrite(IoStatusBlock,\r
+ sizeof(IO_STATUS_BLOCK),\r
+ sizeof(ULONG));\r
+ }\r
\r
- Irp = IoAllocateIrp(DeviceObject->StackSize,TRUE);\r
- if (Irp == NULL)\r
- {\r
- ObDereferenceObject(FileObject);\r
- return(STATUS_INSUFFICIENT_RESOURCES);\r
- }\r
+ if (Length) ProbeForRead(FsInformation, Length, 1);\r
+ }\r
+ _SEH_HANDLE\r
+ {\r
+ Status = _SEH_GetExceptionCode();\r
+ }\r
+ _SEH_END;\r
\r
- SystemBuffer = ExAllocatePoolWithTag(NonPagedPool,\r
- Length,\r
- TAG_SYSB);\r
- if (SystemBuffer == NULL)\r
- {\r
+ if (!NT_SUCCESS(Status)) return Status;\r
+ }\r
+\r
+ Status = ObReferenceObjectByHandle(FileHandle,\r
+ FILE_WRITE_ATTRIBUTES,\r
+ NULL,\r
+ PreviousMode,\r
+ (PVOID*)&FileObject,\r
+ NULL);\r
+ if (Status != STATUS_SUCCESS) return Status;\r
+\r
+ DeviceObject = FileObject->DeviceObject;\r
+\r
+ Irp = IoAllocateIrp(DeviceObject->StackSize,TRUE);\r
+ if (!Irp)\r
+ {\r
+ ObDereferenceObject(FileObject);\r
+ return STATUS_INSUFFICIENT_RESOURCES;\r
+ }\r
+\r
+ SystemBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, TAG_SYSB);\r
+ if (!SystemBuffer)\r
+ {\r
Status = STATUS_INSUFFICIENT_RESOURCES;\r
goto failfreeirp;\r
- }\r
+ }\r
\r
- if (PreviousMode != KernelMode)\r
- {\r
- _SEH_TRY\r
- {\r
- /* no need to probe again */\r
- RtlCopyMemory(SystemBuffer,\r
- FsInformation,\r
- Length);\r
- }\r
- _SEH_HANDLE\r
- {\r
- Status = _SEH_GetExceptionCode();\r
- }\r
- _SEH_END;\r
-\r
- if (!NT_SUCCESS(Status))\r
- {\r
- ExFreePoolWithTag(SystemBuffer,\r
- TAG_SYSB);\r
-failfreeirp:\r
- IoFreeIrp(Irp);\r
- ObDereferenceObject(FileObject);\r
- return Status;\r
- }\r
- }\r
- else\r
- {\r
- RtlCopyMemory(SystemBuffer,\r
- FsInformation,\r
- Length);\r
- }\r
-\r
- /* Trigger FileObject/Event dereferencing */\r
- Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
- Irp->RequestorMode = PreviousMode;\r
- Irp->AssociatedIrp.SystemBuffer = SystemBuffer;\r
- KeResetEvent( &FileObject->Event );\r
- Irp->UserEvent = &FileObject->Event;\r
- Irp->UserIosb = IoStatusBlock;\r
- Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
-\r
- StackPtr = IoGetNextIrpStackLocation(Irp);\r
- StackPtr->MajorFunction = IRP_MJ_SET_VOLUME_INFORMATION;\r
- StackPtr->MinorFunction = 0;\r
- StackPtr->Flags = 0;\r
- StackPtr->Control = 0;\r
- StackPtr->DeviceObject = DeviceObject;\r
- StackPtr->FileObject = FileObject;\r
- StackPtr->Parameters.SetVolume.Length = Length;\r
- StackPtr->Parameters.SetVolume.FsInformationClass =\r
- FsInformationClass;\r
-\r
- Status = IoCallDriver(DeviceObject,Irp);\r
- if (Status == STATUS_PENDING)\r
- {\r
- KeWaitForSingleObject(&FileObject->Event,\r
- UserRequest,\r
- PreviousMode,\r
- FALSE,\r
- NULL);\r
+ if (PreviousMode != KernelMode)\r
+ {\r
_SEH_TRY\r
{\r
- Status = IoStatusBlock->Status;\r
+ /* no need to probe again */\r
+ RtlCopyMemory(SystemBuffer, FsInformation, Length);\r
}\r
_SEH_HANDLE\r
{\r
Status = _SEH_GetExceptionCode();\r
}\r
_SEH_END;\r
- }\r
\r
- ExFreePool(SystemBuffer);\r
+ if (!NT_SUCCESS(Status))\r
+ {\r
+ ExFreePoolWithTag(SystemBuffer, TAG_SYSB);\r
+failfreeirp:\r
+ IoFreeIrp(Irp);\r
+ ObDereferenceObject(FileObject);\r
+ return Status;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ RtlCopyMemory(SystemBuffer, FsInformation, Length);\r
+ }\r
+\r
+ /* Trigger FileObject/Event dereferencing */\r
+ Irp->Tail.Overlay.OriginalFileObject = FileObject;\r
+ Irp->RequestorMode = PreviousMode;\r
+ Irp->AssociatedIrp.SystemBuffer = SystemBuffer;\r
+ KeResetEvent( &FileObject->Event );\r
+ Irp->UserEvent = &FileObject->Event;\r
+ Irp->UserIosb = IoStatusBlock;\r
+ Irp->Tail.Overlay.Thread = PsGetCurrentThread();\r
+\r
+ StackPtr = IoGetNextIrpStackLocation(Irp);\r
+ StackPtr->MajorFunction = IRP_MJ_SET_VOLUME_INFORMATION;\r
+ StackPtr->MinorFunction = 0;\r
+ StackPtr->Flags = 0;\r
+ StackPtr->Control = 0;\r
+ StackPtr->DeviceObject = DeviceObject;\r
+ StackPtr->FileObject = FileObject;\r
+ StackPtr->Parameters.SetVolume.Length = Length;\r
+ StackPtr->Parameters.SetVolume.FsInformationClass =\r
+ FsInformationClass;\r
\r
- return(Status);\r
+ Status = IoCallDriver(DeviceObject,Irp);\r
+ if (Status == STATUS_PENDING)\r
+ {\r
+ KeWaitForSingleObject(&FileObject->Event,\r
+ UserRequest,\r
+ PreviousMode,\r
+ FALSE,\r
+ NULL);\r
+ _SEH_TRY\r
+ {\r
+ Status = IoStatusBlock->Status;\r
+ }\r
+ _SEH_HANDLE\r
+ {\r
+ Status = _SEH_GetExceptionCode();\r
+ }\r
+ _SEH_END;\r
+ }\r
+\r
+ ExFreePool(SystemBuffer);\r
+ return Status;\r
}\r