The Windows device driver model (where it is well done) provides a different and interesting approach - splitting the drivers into a top layer, which is shared by several low-level drivers, and replaces the middle layer described in this article, and the low-level bottom layer drivers. Rather than evolve the middle layer to handle new usage cases, you can just write a new top layer driver to handle the new case if that makes sense.
It also lets you insert other drivers into the driver stack at a later point to expand on the existing functionality, but that is another story.