[major] Re-work device structures and creation
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 23 May 2010 09:18:22 +0000 (05:18 -0400)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 23 May 2010 09:18:22 +0000 (05:18 -0400)
commitdafb0c3962355ada36b71501e890eb96dba873f5
tree7b632a25a600f6aaaeb3ecc61d1df039ce5173ef
parentee22e3f47b5745cbbd82bd4dbe61ae079b690082
[major] Re-work device structures and creation

This rather large commit affects a majority of the AoE and
WinVBlock modules.  It is unfortunately large in order to
ensure that after the series of changes were made, that a
system was still bootable from a WinVBlock disk.

What was involved:

A DEVICE_OBJECT's DeviceExtension member no longer points to
one of our device types.  All of our device types were
previously structures which included the structures they
derived functionality from as their first members.  So you
had something like a RAM disk with a disk as its first
member, a disk having a device as its first member.  So to
access any one of the structures, you could quite simply
cast a pointer.

Now a DeviceExtension points to a pointer to a device__type.
A device__type has an ext member which is a pointer to the
instance of the next-higher structure type, such as a
disk__type.  A disk__type also has an ext member, so that
AoE, RAM, and file-backed disks can extend it.

Each device class provides a global creation routine, which
tracks the device instance in a list of created devices for
that type.  The device class' creation routine should set
default parameters.  The creation routine can override the
device routines used by callers calling the routines of the
"base class" (the device type).  As an example, when you
create a RAM disk, you:
  - create a disk
    - which creates a device
    - which hook's a device routine for the device
  - hook some of the disk's routines
  - add the RAM disk to the global list

When deleting the RAM disk, you:
  - call the deletion routine you hooked for the disk
    - which calls the deletion rout. it hooked for the dev.
  - remove the RAM disk from the global list

Some copy'n'pasted comments were corrected.

Some code expecting the base-class-as-first-member-of-
derived-class was exposed and modified appropriately.

get_ptr() macros were changed.

DEVICE_OBJECT deletion paths were tied to device__free()
calls.

Some TODOs are left: More error-checking when calling
module initialization functions, watching NULL pointer
dereferences when walking sibling pointers.
23 files changed:
src/aoe/driver.c
src/include/bus.h
src/include/device.h
src/include/disk.h
src/include/driver.h
src/include/filedisk.h
src/include/irp.h
src/include/ramdisk.h
src/winvblock/bus/bus.c
src/winvblock/bus/dev_ctl.c
src/winvblock/bus/pnp.c
src/winvblock/debug.c
src/winvblock/device.c
src/winvblock/disk/dev_ctl.c
src/winvblock/disk/disk.c
src/winvblock/disk/pnp.c
src/winvblock/disk/scsi.c
src/winvblock/driver.c
src/winvblock/filedisk.c
src/winvblock/irp.c
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c
src/winvblock/ramdisk/ramdisk.c