If your driver supports virtual memory (you can use the kdgVMOptions Driver Gestalt selector to indicate this), you must be careful to avoid fatal page faults when fielding private control calls. Specifically, your driver must not cause a page fault while it is fielding a queued (that is, synchronous or asynchronous) request.
The Virtual Memory Manager holds the entire ParamBlockRec passed to all queued _Read, _Write, _Control, and _Status calls. In addition, VM holds the I/O buffer (pointed to by ioBuffer, for length ioReqCount ). Therefore your driver can safely access this memory without causing a fatal page fault.
The problem comes when you define a private control call whose ParamBlockRec contains a pointer to another piece of memory. If your driver accesses that memory, it may cause a page fault. If your driver supports virtual memory, that page fault will be fatal (because a page fault while any paging device is busy is fatal).
There are a number of ways to avoid this problem.
If you make a Control or Status call to a device driver which supports paging and the parameter block contains pointers to other data structures, you should hold those data structures, just to be sure.
For more background about how the Mac OS Virtual Memory Manager prevents fatal page faults, see DTS Technote 1094, "Virtual Memory Application Compatibility."