[device] Don't use a pointer for device operations
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 20 May 2010 13:41:29 +0000 (09:41 -0400)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 20 May 2010 13:41:29 +0000 (09:41 -0400)
Instead of pointing at some device operations structure,
we actually copy the operations' function pointers for
each device.

src/aoe/driver.c
src/include/device.h
src/include/disk.h
src/winvblock/bus/bus.c
src/winvblock/bus/pnp.c
src/winvblock/disk/disk.c
src/winvblock/disk/pnp.c
src/winvblock/filedisk.c
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c

index a40eb71..96feff3 100644 (file)
@@ -2185,7 +2185,7 @@ process_abft (
       aoe_disk.disk.BootDrive = TRUE;
       aoe_disk.disk.media = disk__media_hard;
       aoe_disk.disk.ops = &default_ops;
-      aoe_disk.disk.device.ops = disk__get_ops (  );
+      disk__put_dev_ops ( &aoe_disk.disk.device );
       aoe_disk.disk.device.size = sizeof ( aoe_disk_type );
       bus__add_child ( &aoe_disk.disk.device );
     }
@@ -2351,7 +2351,7 @@ irp__handler_decl (
   aoe_disk.disk.BootDrive = FALSE;
   aoe_disk.disk.media = disk__media_hard;
   aoe_disk.disk.ops = &default_ops;
-  aoe_disk.disk.device.ops = disk__get_ops (  );
+  disk__put_dev_ops ( &aoe_disk.disk.device );
   aoe_disk.disk.device.size = sizeof ( aoe_disk_type );
   bus__add_child ( &aoe_disk.disk.device );
   Irp->IoStatus.Information = 0;
index e5787bb..de60f9a 100644 (file)
@@ -144,7 +144,7 @@ struct _device__type
   device__state OldState;
   irp__handler_chain irp_handler_chain;
   device__type_ptr next_sibling_ptr;
-  device__ops_ptr ops;
+  device__ops ops;
   LIST_ENTRY tracking;
 };
 
index c46c070..5148a84 100644 (file)
@@ -204,8 +204,9 @@ struct _disk__type
 
 /* Device operations for disks */
 extern device__ops disk__dev_ops;
-extern winvblock__lib_func device__ops_ptr disk__get_ops (
-  void
+/* Copy default disk device operations into a device */
+winvblock__lib_func void disk__put_dev_ops (
+  device__type_ptr dev
  );
 
 /*
index 6ead81f..8fd2e3c 100644 (file)
@@ -89,7 +89,7 @@ bus__add_child (
   /*
    * Create the child device
    */
-  dev_obj_ptr = dev_ptr->ops->create_pdo ( dev_ptr );
+  dev_obj_ptr = dev_ptr->ops.create_pdo ( dev_ptr );
   if ( !dev_obj_ptr )
     {
       DBG ( "bus__add_child() failed!\n" );
@@ -107,7 +107,7 @@ bus__add_child (
    * Initialize the device.  For disks, this routine is responsible for
    * determining the disk's geometry appropriately for AoE/RAM/file disks
    */
-  dev_ptr->ops->init ( dev_ptr );
+  dev_ptr->ops.init ( dev_ptr );
   dev_obj_ptr->Flags &= ~DO_DEVICE_INITIALIZING;
   /*
    * Add the new device's extension to the bus' list of children
index f960676..72f6471 100644 (file)
@@ -97,7 +97,7 @@ irp__handler_decl ( bus_pnp__remove_dev )
   while ( walker != NULL )
     {
       next = ( device__type_ptr ) walker->next_sibling_ptr;
-      walker->ops->close ( walker );
+      walker->ops.close ( walker );
       IoDeleteDevice ( walker->Self );
       walker = next;
     }
index d7bf3a3..6ac5acf 100644 (file)
@@ -244,12 +244,13 @@ device__ops disk__dev_ops = {
   close
 };
 
-winvblock__lib_func device__ops_ptr
-disk__get_ops (
-  void
+/* Copy default disk device operations into a device */
+winvblock__lib_func void
+disk__put_dev_ops (
+  device__type_ptr dev
  )
 {
-  return &disk__dev_ops;
+  RtlCopyMemory ( &dev->ops, &disk__dev_ops, sizeof ( device__ops ) );
 }
 
 /* An MBR C/H/S address and ways to access its components */
index c4df19c..1e67acb 100644 (file)
@@ -358,7 +358,7 @@ irp__handler_decl ( disk_pnp__simple )
        DeviceExtension->State = NotStarted;
        if ( disk_ptr->Unmount )
          {
-           DeviceExtension->ops->close ( DeviceExtension );
+           DeviceExtension->ops.close ( DeviceExtension );
            IoDeleteDevice ( DeviceExtension->Self );
            status = STATUS_NO_SUCH_DEVICE;
          }
index f8f846a..0395b04 100644 (file)
@@ -201,7 +201,7 @@ irp__handler_decl ( filedisk__attach )
       filedisk.hash += *path_iterator++;
   }
   filedisk.disk.ops = &default_ops;
-  filedisk.disk.device.ops = &disk__dev_ops;
+  disk__put_dev_ops ( &filedisk.disk.device );
   filedisk.disk.device.size = sizeof ( filedisk__type );
   bus__add_child ( &filedisk.disk.device );
   return STATUS_SUCCESS;
index c2c3a02..5ac9725 100644 (file)
@@ -156,7 +156,7 @@ grub4dos__find (
                                         ramdisk.disk.Sectors );
          ramdisk.disk.BootDrive = TRUE;
          ramdisk.disk.ops = &ramdisk__default_ops;
-         ramdisk.disk.device.ops = &disk__dev_ops;
+         disk__put_dev_ops ( &ramdisk.disk.device );
          ramdisk.disk.device.size = sizeof ( ramdisk__type );
          FoundGrub4DosMapping = TRUE;
          bus__add_child ( &ramdisk.disk.device );
index 7615ea3..ebc7855 100644 (file)
@@ -105,7 +105,7 @@ check_mbft (
   ramdisk.disk.Sectors = mBFT->mdi.sectors;
   ramdisk.disk.BootDrive = TRUE;
   ramdisk.disk.ops = &ramdisk__default_ops;
-  ramdisk.disk.device.ops = &disk__dev_ops;
+  disk__put_dev_ops ( &ramdisk.disk.device );
   ramdisk.disk.device.size = sizeof ( ramdisk__type );
   bus__add_child ( &ramdisk.disk.device );
   AssociatedHook->Flags = 1;