+IoGetFileObjectGenericMapping()
[reactos.git] / ntoskrnl / io / iomgr.c
index d35ce20..40afb04 100644 (file)
@@ -45,8 +45,6 @@ static GENERIC_MAPPING IopFileMapping = {FILE_GENERIC_READ,
 
 /* FUNCTIONS ****************************************************************/
 
-#ifndef LIBCAPTIVE
-
 VOID STDCALL
 IopCloseFile(PVOID ObjectBody,
             ULONG HandleCount)
@@ -58,7 +56,7 @@ IopCloseFile(PVOID ObjectBody,
    
    DPRINT("IopCloseFile()\n");
    
-   if (HandleCount > 0)
+   if (HandleCount > 0 || FileObject->DeviceObject == NULL)
      {
        return;
      }
@@ -67,7 +65,8 @@ IopCloseFile(PVOID ObjectBody,
                              STANDARD_RIGHTS_REQUIRED,
                              IoFileObjectType,
                              UserMode);
-   
+   KeResetEvent( &FileObject->Event );
+  
    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLEANUP,
                                      FileObject->DeviceObject,
                                      NULL,
@@ -79,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
@@ -90,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);
-   
-   Irp = IoBuildSynchronousFsdRequest(IRP_MJ_CLOSE,
-                                     FileObject->DeviceObject,
-                                     NULL,
-                                     0,
-                                     NULL,
-                                     NULL,
-                                     NULL);
-   StackPtr = IoGetNextIrpStackLocation(Irp);
-   StackPtr->FileObject = FileObject;
+     KeResetEvent( &FileObject->Event );
+     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)
      {
@@ -115,16 +126,17 @@ IopDeleteFile(PVOID ObjectBody)
      }
 }
 
-#endif /* LIBCAPTIVE */
 
 VOID IoInit (VOID)
 {
-#ifndef LIBCAPTIVE
   OBJECT_ATTRIBUTES ObjectAttributes;
   UNICODE_STRING DirName;
+#ifndef LIBCAPTIVE
   UNICODE_STRING LinkName;
+#endif /* LIBCAPTIVE */
   HANDLE Handle;
 
+#ifndef LIBCAPTIVE
   IopInitDriverImplementation();
 #endif /* LIBCAPTIVE */
   
@@ -150,11 +162,7 @@ VOID IoInit (VOID)
   IoDeviceObjectType->Security = NULL;
   IoDeviceObjectType->QueryName = NULL;
   IoDeviceObjectType->OkayToClose = NULL;
-#ifndef LIBCAPTIVE
   IoDeviceObjectType->Create = IopCreateDevice;
-#else /* !LIBCAPTIVE */
-  IoDeviceObjectType->Create = NULL;
-#endif /* !LIBCAPTIVE */
   IoDeviceObjectType->DuplicationNotify = NULL;
   
   RtlInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, REACTOS_UCS2(L"Device"));
@@ -175,31 +183,21 @@ VOID IoInit (VOID)
   IoFileObjectType->Mapping = &IopFileMapping;
   IoFileObjectType->Dump = NULL;
   IoFileObjectType->Open = NULL;
-#ifndef LIBCAPTIVE
   IoFileObjectType->Close = IopCloseFile;
   IoFileObjectType->Delete = IopDeleteFile;
-#else /* !LIBCAPTIVE */
-  IoFileObjectType->Close = NULL;
-  IoFileObjectType->Delete = NULL;
-#endif /* !LIBCAPTIVE */
   IoFileObjectType->Parse = NULL;
   IoFileObjectType->Security = NULL;
   IoFileObjectType->QueryName = NULL;
   IoFileObjectType->OkayToClose = NULL;
-#ifndef LIBCAPTIVE
   IoFileObjectType->Create = IopCreateFile;
-#else /* !LIBCAPTIVE */
-  IoFileObjectType->Create = NULL;
-#endif /* !LIBCAPTIVE */
   IoFileObjectType->DuplicationNotify = NULL;
   
   RtlInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, REACTOS_UCS2(L"File"));
 
-#ifndef LIBCAPTIVE
   /*
    * Create the '\Driver' object directory
    */
-  RtlInitUnicodeStringFromLiteral(&DirName, L"\\Driver");
+  RtlInitUnicodeStringFromLiteral(&DirName, REACTOS_UCS2(L"\\Driver"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -213,7 +211,7 @@ VOID IoInit (VOID)
    * Create the '\FileSystem' object directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\FileSystem");
+                      REACTOS_UCS2(L"\\FileSystem"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -227,7 +225,7 @@ VOID IoInit (VOID)
    * Create the '\Device' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\Device");
+                      REACTOS_UCS2(L"\\Device"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -237,11 +235,12 @@ VOID IoInit (VOID)
                          0,
                          &ObjectAttributes);
 
+#ifndef LIBCAPTIVE
   /*
    * Create the '\??' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\??");
+                      REACTOS_UCS2(L"\\??"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -255,7 +254,7 @@ VOID IoInit (VOID)
    * Create the '\ArcName' directory
    */
   RtlInitUnicodeStringFromLiteral(&DirName,
-                      L"\\ArcName");
+                      REACTOS_UCS2(L"\\ArcName"));
   InitializeObjectAttributes(&ObjectAttributes,
                             &DirName,
                             0,
@@ -293,7 +292,6 @@ VOID IoInit (VOID)
 #endif /* LIBCAPTIVE */
 }
 
-#ifndef LIBCAPTIVE
 
 PGENERIC_MAPPING STDCALL
 IoGetFileObjectGenericMapping(VOID)
@@ -301,6 +299,4 @@ IoGetFileObjectGenericMapping(VOID)
   return(&IopFileMapping);
 }
 
-#endif /* LIBCAPTIVE */
-
 /* EOF */