update for HEAD-2003091401
[reactos.git] / ntoskrnl / io / iomgr.c
index 2429b90..e0fb7bf 100644 (file)
@@ -58,11 +58,15 @@ IopCloseFile(PVOID ObjectBody,
      {
        return;
      }
-   
+
+#if 0
+//NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
    ObReferenceObjectByPointer(FileObject,
                              STANDARD_RIGHTS_REQUIRED,
                              IoFileObjectType,
                              UserMode);
+#endif
+
    KeResetEvent( &FileObject->Event );
   
    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
@@ -82,6 +86,7 @@ IopCloseFile(PVOID ObjectBody,
    }
 }
 
+
 VOID STDCALL
 IopDeleteFile(PVOID ObjectBody)
 {
@@ -94,11 +99,14 @@ IopDeleteFile(PVOID ObjectBody)
 
    if (FileObject->DeviceObject)
    {
+#if 0
+//NOTE: Allmost certain that the latest changes to I/O Mgr makes this redundant (OriginalFileObject case)
+     
      ObReferenceObjectByPointer(ObjectBody,
                                STANDARD_RIGHTS_REQUIRED,
                                IoFileObjectType,
                                UserMode);
-   
+#endif   
      KeResetEvent( &FileObject->Event );
      Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
                                        FileObject->DeviceObject,
@@ -125,6 +133,71 @@ IopDeleteFile(PVOID ObjectBody)
 }
 
 
+NTSTATUS STDCALL
+IopQueryNameFile(PVOID ObjectBody,
+                POBJECT_NAME_INFORMATION ObjectNameInfo,
+                ULONG Length,
+                PULONG ReturnLength)
+{
+  POBJECT_NAME_INFORMATION LocalInfo;
+  PFILE_NAME_INFORMATION FileNameInfo;
+  PFILE_OBJECT FileObject;
+  ULONG LocalReturnLength;
+  NTSTATUS Status;
+
+  DPRINT ("IopQueryNameFile() called\n");
+
+  FileObject = (PFILE_OBJECT)ObjectBody;
+
+  LocalInfo = ExAllocatePool (NonPagedPool,
+                             sizeof(OBJECT_NAME_INFORMATION) +
+                               MAX_PATH * sizeof(WCHAR));
+  if (LocalInfo == NULL)
+    return STATUS_INSUFFICIENT_RESOURCES;
+
+  Status = ObQueryNameString (FileObject->DeviceObject->Vpb->RealDevice,
+                             LocalInfo,
+                             MAX_PATH * sizeof(WCHAR),
+                             &LocalReturnLength);
+  if (!NT_SUCCESS (Status))
+    {
+      ExFreePool (LocalInfo);
+      return Status;
+    }
+  DPRINT ("Device path: %wZ\n", &LocalInfo->Name);
+
+  Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
+                                          &LocalInfo->Name);
+
+  ExFreePool (LocalInfo);
+
+  FileNameInfo = ExAllocatePool (NonPagedPool,
+                                MAX_PATH * sizeof(WCHAR) + sizeof(ULONG));
+  if (FileNameInfo == NULL)
+    return STATUS_INSUFFICIENT_RESOURCES;
+
+  Status = IoQueryFileInformation (FileObject,
+                                  FileNameInformation,
+                                  MAX_PATH * sizeof(WCHAR) + sizeof(ULONG),
+                                  FileNameInfo,
+                                  NULL);
+  if (Status != STATUS_SUCCESS)
+    {
+      ExFreePool (FileNameInfo);
+      return Status;
+    }
+
+  Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name,
+                                    FileNameInfo->FileName);
+
+  DPRINT ("Total path: %wZ\n", &ObjectNameInfo->Name);
+
+  ExFreePool (FileNameInfo);
+
+  return Status;
+}
+
+
 VOID IoInit (VOID)
 {
   OBJECT_ATTRIBUTES ObjectAttributes;
@@ -137,7 +210,7 @@ VOID IoInit (VOID)
   /*
    * Register iomgr types: DeviceObjectType
    */
-  IoDeviceObjectType = ExAllocatePool (NonPagedPool, 
+  IoDeviceObjectType = ExAllocatePool (NonPagedPool,
                                       sizeof (OBJECT_TYPE));
   
   IoDeviceObjectType->Tag = TAG_DEVICE_TYPE;
@@ -181,7 +254,7 @@ VOID IoInit (VOID)
   IoFileObjectType->Delete = IopDeleteFile;
   IoFileObjectType->Parse = NULL;
   IoFileObjectType->Security = NULL;
-  IoFileObjectType->QueryName = NULL;
+  IoFileObjectType->QueryName = IopQueryNameFile;
   IoFileObjectType->OkayToClose = NULL;
   IoFileObjectType->Create = IopCreateFile;
   IoFileObjectType->DuplicationNotify = NULL;
@@ -281,7 +354,39 @@ VOID IoInit (VOID)
   PnpInit();
 }
 
+VOID IoInit2(VOID)
+{
+  PDEVICE_NODE DeviceNode;
+  NTSTATUS Status;
+
+  /* Initialize raw filesystem driver */
+
+  /* Use IopRootDeviceNode for now */
+  Status = IopCreateDeviceNode(IopRootDeviceNode,
+    NULL,
+    &DeviceNode);
+  if (!NT_SUCCESS(Status))
+    {
+      CPRINT("IopCreateDeviceNode() failed with status (%x)\n", Status);
+      return;
+    }
 
+  Status = IopInitializeDriver(RawFsDriverEntry,
+    DeviceNode,
+    TRUE,
+    NULL,
+    0);
+  if (!NT_SUCCESS(Status))
+    {
+      IopFreeDeviceNode(DeviceNode);
+      CPRINT("IopInitializeDriver() failed with status (%x)\n", Status);
+      return;
+    }
+}
+
+/*
+ * @implemented
+ */
 PGENERIC_MAPPING STDCALL
 IoGetFileObjectGenericMapping(VOID)
 {