+IoGetFileObjectGenericMapping()
[reactos.git] / ntoskrnl / io / iomgr.c
index e7629c4..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);
+     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)
      {
@@ -115,7 +126,6 @@ IopDeleteFile(PVOID ObjectBody)
      }
 }
 
-#endif /* LIBCAPTIVE */
 
 VOID IoInit (VOID)
 {
@@ -173,13 +183,8 @@ 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;
@@ -287,7 +292,6 @@ VOID IoInit (VOID)
 #endif /* LIBCAPTIVE */
 }
 
-#ifndef LIBCAPTIVE
 
 PGENERIC_MAPPING STDCALL
 IoGetFileObjectGenericMapping(VOID)
@@ -295,6 +299,4 @@ IoGetFileObjectGenericMapping(VOID)
   return(&IopFileMapping);
 }
 
-#endif /* LIBCAPTIVE */
-
 /* EOF */