+IoGetFileObjectGenericMapping()
[reactos.git] / ntoskrnl / io / iomgr.c
index 4c5a358..40afb04 100644 (file)
 
 POBJECT_TYPE EXPORTED IoDeviceObjectType = NULL;
 POBJECT_TYPE EXPORTED IoFileObjectType = NULL;
+#ifndef LIBCAPTIVE
 ULONG        EXPORTED IoReadOperationCount = 0;        /* FIXME: unknown type */
 ULONG        EXPORTED IoReadTransferCount = 0; /* FIXME: unknown type */
 ULONG        EXPORTED IoWriteOperationCount = 0; /* FIXME: unknown type */
 ULONG        EXPORTED IoWriteTransferCount = 0;        /* FIXME: unknown type */
 ULONG        EXPORTED IoStatisticsLock = 0;    /* FIXME: unknown type */
+#endif /* LIBCAPTIVE */
 
 static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
                                         FILE_GENERIC_WRITE,
@@ -54,7 +56,7 @@ IopCloseFile(PVOID ObjectBody,
    
    DPRINT("IopCloseFile()\n");
    
-   if (HandleCount > 0)
+   if (HandleCount > 0 || FileObject->DeviceObject == NULL)
      {
        return;
      }
@@ -63,7 +65,8 @@ IopCloseFile(PVOID ObjectBody,
                              STANDARD_RIGHTS_REQUIRED,
                              IoFileObjectType,
                              UserMode);
-   
+   KeResetEvent( &FileObject->Event );
+  
    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
                                      FileObject->DeviceObject,
                                      NULL,
@@ -75,6 +78,10 @@ IopCloseFile(PVOID ObjectBody,
    StackPtr->FileObject = FileObject;
    
    Status = IoCallDriver(FileObject->DeviceObject, Irp);
+   if (Status == STATUS_PENDING)
+   {
+      KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
+   }
 }
 
 VOID STDCALL
@@ -86,23 +93,31 @@ IopDeleteFile(PVOID ObjectBody)
    NTSTATUS Status;
    
    DPRINT("IopDeleteFile()\n");
+
+   if (FileObject->DeviceObject)
+   {
+     ObReferenceObjectByPointer(ObjectBody,
+                               STANDARD_RIGHTS_REQUIRED,
+                               IoFileObjectType,
+                               UserMode);
    
-   ObReferenceObjectByPointer(ObjectBody,
-                             STANDARD_RIGHTS_REQUIRED,
-                             IoFileObjectType,
-                             UserMode);
+     KeResetEvent( &FileObject->Event );
+     Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
+                                       FileObject->DeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       NULL,
+                                       NULL);
+     StackPtr = IoGetNextIrpStackLocation(Irp);
+     StackPtr->FileObject = FileObject;
    
-   Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
-                                     FileObject->DeviceObject,
-                                     NULL,
-                                     0,
-                                     NULL,
-                                     NULL,
-                                     NULL);
-   StackPtr = IoGetNextIrpStackLocation(Irp);
-   StackPtr->FileObject = FileObject;
-   
-   Status = IoCallDriver(FileObject->DeviceObject, Irp);
+     Status = IoCallDriver(FileObject->DeviceObject, Irp);
+     if (Status == STATUS_PENDING)
+     {
+        KeWaitForSingleObject(&FileObject->Event, Executive, KernelMode, FALSE, NULL);
+     }
+   }
    
    if (FileObject->FileName.Buffer != NULL)
      {
@@ -116,10 +131,14 @@ VOID IoInit (VOID)
 {
   OBJECT_ATTRIBUTES ObjectAttributes;
   UNICODE_STRING DirName;
+#ifndef LIBCAPTIVE
   UNICODE_STRING LinkName;
+#endif /* LIBCAPTIVE */
   HANDLE Handle;
 
+#ifndef LIBCAPTIVE
   IopInitDriverImplementation();
+#endif /* LIBCAPTIVE */
   
   /*
    * Register iomgr types: DeviceObjectType
@@ -146,7 +165,7 @@ VOID IoInit (VOID)
   IoDeviceObjectType->Create = IopCreateDevice;
   IoDeviceObjectType->DuplicationNotify = NULL;
   
-  RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
+  RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
 
   /*
    * Register iomgr types: FileObjectType
@@ -173,12 +192,12 @@ VOID IoInit (VOID)
   IoFileObjectType->Create = IopCreateFile;
   IoFileObjectType->DuplicationNotify = NULL;
   
-  RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
+  RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
 
   /*
    * Create the '\Driver' object directory
    */
-  RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
+  RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -192,7 +211,7 @@ VOID IoInit (VOID)
    * Create the '\FileSystem' object directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\FileSystem");
+                      REACTOS_UCS2(L"\\FileSystem"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -206,7 +225,7 @@ VOID IoInit (VOID)
    * Create the '\Device' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\Device");
+                      REACTOS_UCS2(L"\\Device"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -216,11 +235,12 @@ VOID IoInit (VOID)
                          0,
                          &ObjectAttributes);
 
+#ifndef LIBCAPTIVE
   /*
    * Create the '\??' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\??");
+                      REACTOS_UCS2(L"\\??"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -234,7 +254,7 @@ VOID IoInit (VOID)
    * Create the '\ArcName' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\ArcName");
+                      REACTOS_UCS2(L"\\ArcName"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -249,6 +269,7 @@ VOID IoInit (VOID)
    */
   IoInitCancelHandling();
   IoInitSymbolicLinkImplementation();
+#endif /* LIBCAPTIVE */
   IoInitFileSystemImplementation();
   IoInitVpbImplementation();
   IoInitShutdownNotification();
@@ -256,6 +277,7 @@ VOID IoInit (VOID)
   /*
    * Create link from '\DosDevices' to '\??' directory
    */
+#ifndef LIBCAPTIVE
   RtlInitUnicodeStringFromLiteral(&LinkName,
                       L"\\DosDevices");
   RtlInitUnicodeStringFromLiteral(&DirName,
@@ -267,6 +289,7 @@ VOID IoInit (VOID)
    * Initialize PnP manager
    */
   PnpInit();
+#endif /* LIBCAPTIVE */
 }