Personally the best way to start developing is by real-world exposure. Having this in mind I'd recomment this book
The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System
It should be enough to get you started to have some code running which does "something" then after you have the general picture you might dwell on topics such as - Difference between Buffered/Neither/Direct methods and the peculiarities associated with them.
"Programming the windows driver model, 2nd edition" is also a great help when you need details regarding some specific topics. But first I believe the most important thing is to put things into context and then build on that.