branch update for HEAD-2003050101
[reactos.git] / ntoskrnl / io / file.c
index 5888a62..b8f311a 100644 (file)
@@ -244,7 +244,43 @@ NtSetInformationFile(HANDLE FileHandle,
      }
    
    DPRINT("FileObject %x\n", FileObject);
-   
+
+   //io completion port?
+   if (FileInformationClass == FileCompletionInformation)
+   {
+#ifdef LIBCAPTIVE
+      KeBugCheck(0);
+#else /* !LIBCAPTIVE */
+      PKQUEUE Queue;
+
+      if (Length < sizeof(FILE_COMPLETION_INFORMATION))
+      {
+         Status = STATUS_INFO_LENGTH_MISMATCH;
+      }
+      else
+      {
+         Status = ObReferenceObjectByHandle(((PFILE_COMPLETION_INFORMATION)FileInformation)->IoCompletionHandle,
+                                            IO_COMPLETION_MODIFY_STATE,//???
+                                            ExIoCompletionType,
+                                            UserMode,
+                                            (PVOID*)&Queue,
+                                            NULL);
+         if (NT_SUCCESS(Status))
+         {   
+            //FIXME: maybe use lookaside list
+            FileObject->CompletionContext = ExAllocatePool(NonPagedPool, sizeof(IO_COMPLETION_CONTEXT));
+            FileObject->CompletionContext->Key = ((PFILE_COMPLETION_INFORMATION)FileInformation)->CompletionKey;
+            FileObject->CompletionContext->Port = Queue;
+
+            ObDereferenceObject(Queue);
+         }
+      }
+
+      ObDereferenceObject(FileObject);
+      return Status;
+#endif /* LIBCAPTIVE */
+   }
+
    DeviceObject = FileObject->DeviceObject;
    
    Irp = IoAllocateIrp(DeviceObject->StackSize,
@@ -382,8 +418,36 @@ NTSTATUS STDCALL
 NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
                      OUT PFILE_BASIC_INFORMATION FileInformation)
 {
-   UNIMPLEMENTED;
-   return STATUS_NOT_IMPLEMENTED;
+  IO_STATUS_BLOCK IoStatusBlock;
+  HANDLE FileHandle;
+  NTSTATUS Status;
+
+  /* Open the file */
+  Status = NtOpenFile (&FileHandle,
+                      SYNCHRONIZE | FILE_READ_ATTRIBUTES,
+                      ObjectAttributes,
+                      &IoStatusBlock,
+                      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                      FILE_SYNCHRONOUS_IO_NONALERT);
+  if (!NT_SUCCESS (Status))
+    {
+      DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
+      return Status;
+    }
+
+  /* Get file attributes */
+  Status = NtQueryInformationFile (FileHandle,
+                                  &IoStatusBlock,
+                                  FileInformation,
+                                  sizeof(FILE_BASIC_INFORMATION),
+                                  FileBasicInformation);
+  NtClose (FileHandle);
+  if (!NT_SUCCESS (Status))
+    {
+      DPRINT ("NtQueryInformationFile() failed (Status %lx)\n", Status);
+    }
+
+  return Status;
 }
 
 
@@ -391,8 +455,36 @@ NTSTATUS STDCALL
 NtQueryFullAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
                          OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation)
 {
-   UNIMPLEMENTED;
-   return STATUS_NOT_IMPLEMENTED;
+  IO_STATUS_BLOCK IoStatusBlock;
+  HANDLE FileHandle;
+  NTSTATUS Status;
+
+  /* Open the file */
+  Status = NtOpenFile (&FileHandle,
+                      SYNCHRONIZE | FILE_READ_ATTRIBUTES,
+                      ObjectAttributes,
+                      &IoStatusBlock,
+                      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                      FILE_SYNCHRONOUS_IO_NONALERT);
+  if (!NT_SUCCESS (Status))
+    {
+      DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
+      return Status;
+    }
+
+  /* Get file attributes */
+  Status = NtQueryInformationFile (FileHandle,
+                                  &IoStatusBlock,
+                                  FileInformation,
+                                  sizeof(FILE_NETWORK_OPEN_INFORMATION),
+                                  FileNetworkOpenInformation);
+  NtClose (FileHandle);
+  if (!NT_SUCCESS (Status))
+    {
+      DPRINT ("NtQueryInformationFile() failed (Status %lx)\n", Status);
+    }
+
+  return Status;
 }