IoCreateDevice(): Fixed missing initialization of 'CreatedDeviceObject->Vpb'
[reactos.git] / ntoskrnl / io / device.c
index 36b4a09..40551eb 100644 (file)
@@ -55,6 +55,7 @@ IoAttachDeviceByPointer(IN PDEVICE_OBJECT SourceDevice,
        return STATUS_SUCCESS;
 }
 
+#endif /* LIBCAPTIVE */
 
 VOID STDCALL
 IoDeleteDevice(PDEVICE_OBJECT DeviceObject)
@@ -67,13 +68,23 @@ IoDeleteDevice(PDEVICE_OBJECT DeviceObject)
        /* remove the timer if it exists */
        if (DeviceObject->Timer)
        {
+#ifndef LIBCAPTIVE
                IoStopTimer(DeviceObject);
                ExFreePool(DeviceObject->Timer);
+#else /* !LIBCAPTIVE */
+               KeBugCheck(0);
+#endif /* !LIBCAPTIVE */
        }
 
+#ifndef LIBCAPTIVE
+       /* W32 expects CreatedDeviceObject->DeviceExtension to follow *CreatedDeviceObject!
+        * Undocumented by W32!
+        * See also IoCreateDevice().
+        */
        /* free device extension */
        if (DeviceObject->DeviceObjectExtension)
                ExFreePool (DeviceObject->DeviceObjectExtension);
+#endif /* LIBCAPTIVE */
 
        /* remove device from driver device list */
        Previous = DeviceObject->DriverObject->DeviceObject;
@@ -91,6 +102,7 @@ IoDeleteDevice(PDEVICE_OBJECT DeviceObject)
        ObDereferenceObject (DeviceObject);
 }
 
+#ifndef LIBCAPTIVE
 
 PDEVICE_OBJECT
 STDCALL
@@ -162,6 +174,7 @@ IoDetachDevice(PDEVICE_OBJECT TargetDevice)
    DPRINT("IoDetachDevice(TargetDevice %x) - UNIMPLEMENTED\n", TargetDevice);
 }
 
+#endif /* LIBCAPTIVE */
 
 PDEVICE_OBJECT
 STDCALL
@@ -181,6 +194,8 @@ IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject)
    return(Current);
 }
 
+#ifndef LIBCAPTIVE
+
 PDEVICE_OBJECT
 STDCALL
 IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
@@ -563,6 +578,7 @@ IoAttachDevice(PDEVICE_OBJECT SourceDevice,
   UNIMPLEMENTED;
 }
 
+#endif /* LIBCAPTIVE */
 
 NTSTATUS STDCALL
 IopCreateDevice(PVOID ObjectBody,
@@ -582,8 +598,6 @@ IopCreateDevice(PVOID ObjectBody,
    return(STATUS_SUCCESS);
 }
 
-#endif /* LIBCAPTIVE */
-
 NTSTATUS STDCALL
 IoCreateDevice(PDRIVER_OBJECT DriverObject,
               ULONG DeviceExtensionSize,
@@ -618,6 +632,12 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
    
    assert_irql(PASSIVE_LEVEL);
    
+   assert(sizeof(CreatedDeviceObject->Queue.Wcb) == 40);
+   assert(sizeof(CreatedDeviceObject->DeviceQueue) == 20);
+   assert(sizeof(CreatedDeviceObject->Dpc) == 32);
+   assert(sizeof(CreatedDeviceObject->DeviceLock) == 16);
+   assert(sizeof(DEVICE_OBJECT) == 184);
+
    if (DeviceName != NULL)
      {
        DPRINT("IoCreateDevice(DriverObject %x, DeviceName %S)\n",DriverObject,
@@ -628,6 +648,15 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
        DPRINT("IoCreateDevice(DriverObject %x)\n",DriverObject);
      }
    
+#ifdef LIBCAPTIVE
+   /* W32 expects CreatedDeviceObject->DeviceExtension to follow *CreatedDeviceObject!
+    * Undocumented by W32!
+    * See also IoDeleteDevice().
+    */
+   /* TODO:thread */
+   IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT) + DeviceExtensionSize;
+#endif /* LIBCAPTIVE */
+
    if (DeviceName != NULL)
      {
        InitializeObjectAttributes(&ObjectAttributes,DeviceName,0,NULL,NULL);
@@ -646,6 +675,15 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
                                (PVOID*)&CreatedDeviceObject);
      }
    
+#ifdef LIBCAPTIVE
+   /* W32 expects CreatedDeviceObject->DeviceExtension to follow *CreatedDeviceObject!
+    * Undocumented by W32!
+    * See also IoDeleteDevice().
+    */
+   /* TODO:thread */
+   IoDeviceObjectType->NonpagedPoolCharge = sizeof (DEVICE_OBJECT);    /* restore */
+#endif /* LIBCAPTIVE */
+
    *DeviceObject = NULL;
    
    if (!NT_SUCCESS(Status))
@@ -666,13 +704,26 @@ IoCreateDevice(PDRIVER_OBJECT DriverObject,
      }
   
   CreatedDeviceObject->Type = DeviceType;
+  CreatedDeviceObject->Size = sizeof (*CreatedDeviceObject);
+  CreatedDeviceObject->ReferenceCount = 0;     /* or 1? it is floating unused this way */
   CreatedDeviceObject->DriverObject = DriverObject;
   CreatedDeviceObject->CurrentIrp = NULL;
   CreatedDeviceObject->Flags = 0;
+  CreatedDeviceObject->Characteristics = DeviceCharacteristics;
+  CreatedDeviceObject->Timer = NULL;
+  CreatedDeviceObject->Vpb = NULL;
 
+#ifndef LIBCAPTIVE
   CreatedDeviceObject->DeviceExtension = 
     ExAllocatePoolWithTag(NonPagedPool, DeviceExtensionSize,
                          TAG_DEVICE_EXTENSION);
+#else /* !LIBCAPTIVE */
+  /* W32 expects CreatedDeviceObject->DeviceExtension to follow *CreatedDeviceObject!
+   * Undocumented by W32!
+   * See also IoDeleteDevice().
+   */
+  CreatedDeviceObject->DeviceExtension = (void *)(CreatedDeviceObject+1);
+#endif /* LIBCAPTIVE */
   if (DeviceExtensionSize > 0 && CreatedDeviceObject->DeviceExtension == NULL)
     {
       ExFreePool(CreatedDeviceObject);