ACM drivers are made up of three parts: hardware, a VxD, and a DLL. The VxD provides access to the driver's hardware and communicates with the driver DLL. The driver DLL processes messages from the ACM and communicates with the VxD for all hardware access. Most of the software logic of the driver should be contained in the VxD, which runs in the processor's ring 0. The DLL primarily provides the ring 3 interface between the ACM (which is also composed of ring 3 DLLs) and the driver VxD.
Drivers that utilize hardware should be designed as Plug and Play drivers. Furthermore, if appropriate hardware capabilities exist, the driver should be an asynchronous driver.