- Partial implementation of IoSetInformation.
Modified: trunk/reactos/ntoskrnl/io/share.c

Modified: trunk/reactos/ntoskrnl/io/share.c
--- trunk/reactos/ntoskrnl/io/share.c	2005-02-13 17:09:10 UTC (rev 13527)
+++ trunk/reactos/ntoskrnl/io/share.c	2005-02-13 17:10:59 UTC (rev 13528)
@@ -327,8 +327,73 @@
 		 IN ULONG Length,
 		 OUT PVOID FileInformation)
 {
-  UNIMPLEMENTED;
-  return(STATUS_NOT_IMPLEMENTED);
+   IO_STATUS_BLOCK IoStatusBlock;
+   PIRP Irp;
+   PDEVICE_OBJECT DeviceObject;
+   PIO_STACK_LOCATION StackPtr;
+   NTSTATUS Status;
+
+   ASSERT(FileInformation != NULL);
+
+   if (FileInformationClass == FileCompletionInformation)
+   {
+      return STATUS_NOT_IMPLEMENTED;
+   }
+
+
+
+   Status = ObReferenceObjectByPointer(FileObject,
+				       FILE_WRITE_ATTRIBUTES,
+				       IoFileObjectType,
+				       KernelMode);
+   if (!NT_SUCCESS(Status))
+   {
+      return(Status);
+   }
+
+   DPRINT("FileObject %x\n", FileObject);
+   
+   DeviceObject = FileObject->DeviceObject;
+
+   Irp = IoAllocateIrp(DeviceObject->StackSize,
+		       TRUE);
+   if (Irp == NULL)
+   {
+      ObDereferenceObject(FileObject);
+      return STATUS_INSUFFICIENT_RESOURCES;
+   }
+
+   /* Trigger FileObject/Event dereferencing */
+   Irp->Tail.Overlay.OriginalFileObject = FileObject;
+   Irp->RequestorMode = KernelMode;
+   Irp->AssociatedIrp.SystemBuffer = FileInformation;
+   Irp->UserIosb = &IoStatusBlock;
+   Irp->UserEvent = &FileObject->Event;
+   Irp->Tail.Overlay.Thread = PsGetCurrentThread();
+   KeResetEvent( &FileObject->Event );
+
+   StackPtr = IoGetNextIrpStackLocation(Irp);
+   StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;
+   StackPtr->MinorFunction = 0;
+   StackPtr->Flags = 0;
+   StackPtr->Control = 0;
+   StackPtr->DeviceObject = DeviceObject;
+   StackPtr->FileObject = FileObject;
+   StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
+   StackPtr->Parameters.SetFile.Length = Length;
+
+   Status = IoCallDriver(FileObject->DeviceObject, Irp);
+   if (Status==STATUS_PENDING)
+   {
+      KeWaitForSingleObject(&FileObject->Event,
+			    Executive,
+			    KernelMode,
+			    FileObject->Flags & FO_ALERTABLE_IO,
+			    NULL);
+      Status = IoStatusBlock.Status;
+   }
+   
+   return Status;
 }