1.	Introduction
The NT 5.1 storage driver architecture includes support for writable media, as well as restricted-rewritable media.  Backwards-compatibility will existing drivers is of paramount importance.  Unfortunately, the current implementation of the storage stack inextricably links media type with the driver.  This implementation will hope to break this connectrion by allowing devices which support MORPHING to change function pointers based upon the current media type inserted into the device.
2.	Morphing
Morphing is the process of redirecting the interface keys that exist on the front panel of a storage device to messages to the operating system.  The first phase of this process simply disables the keys upon the front of the storage device, the second phase is poll the unit (as is done currently with a TEST_UNIT_READY) to determine if the user has pressed a button, and react based upon that key press event.  There are also other possibilities allowed by morphing, such as power state changes, that may be implemented in a future release.  In this document, the term morphing will refer to only that feature which deals with media change notifications.
3.	Driver Initialization
When the driver’s DriverEntry routine is called, a default set of function pointers is passed to the classpnp library’s ClassInitialize() routine.  This structure will be expanded to allow an array of function pointers to be passed that describe the preferred routine for a given type of medium.  All fields will be identical to those required in ClassInitialize(), and follow the same rules for non-existent entry points (class driver default behavior or failure to load).  In this way, if the device does not support morphing, the device will get default (legacy) behavior.
4.	Media Change Handling
During a media change notification from the morphing-capable polling, the driver will stop all current i/o on the device, query for the current  profile / media type, and modify the function pointers according to the data passed in during the initialization phase.  At this time, stopping all IO is guaranteed simply by being within the StartIo() routine.  When all existing IO is stopped/paused, the MediaChangeNotification event will be signaled, and IO shall resume to the new media type using the new function pointers.
Unsupported or unknown profiles will use the default function pointers.  Therefore it is highly suggested that the default function pointers provide only READ access to the storage device (legacy cdrom behavior).