Mjones--
1) Cool idea, the white board is quite clear in reality. The camera capture might need to tweaked.
2) Right the notion of synchronous and asynchronous here might be confusing, but of highly important value and so I will clarify here:
When porting your drivers to CE 6, if the driver is going to access the caller's buffer on the caller's thread, then it falls under the synchronous access arena and you dont have to do any marshalling since the kernel driver can access the caller's buffer directly. That is to say that the kernel guarantees that the caller's process is mapped when the caller's thread is running and hence the kernel driver can be sure that it is accessing the correct buffer when doing so on the caller's thread.
If on the other hand the driver is going to access the caller's buffer on a thread that belongs to some other process, say the kernel, then it falls under asynchronous arena and the driver has to marshall the buffer using the marshalling APIs so that the kernel driver has a local copy of the buffer that can be accessed when needed on any thread
The marshalling need here arises from the fact that you cannot be sure of the user process mapped when accessing the caller buffer on some other thread. And so, you have to marshal the buffer initially on the caller's thread to get a local copy for future use. The local buffer can then be accessed by any other driver thread and upon completion needs to call the right API to free up the local buffer and to copy back the buffer to the caller's process.
Let me know if this helps - else I will put up some diagrams to illustrate this clearly
3) Thank you for your kind words. And thank you for your patience in listening and understanding these complex concepts.
4)
