Under the previous-previous version of the operating system (the QNX 2 family), writing device drivers was an arcane black art. Under QNX 4, it was initially a mystery, but then eventually some samples appeared. Under QNX Neutrino, there are books and courses on the topic. As it turns out, the QNX Neutrino model and the QNX 4 model are, at the highest architectural level, reasonably similar. Whereas QNX 4 had somewhat muddled concepts of what needed to be done as a connect function, and what needed to be done as an I/O function, QNX Neutrino has a very clear separation. Also, under QNX 4, you (the device driver writer) were responsible for most of the work—you'd supply the main message handling loop, you'd have to associate context on each I/O message, and so on. QNX Neutrino has simplified this greatly with the resource manager library.