关于MDL:具体见http://msdn2.microsoft.com/en-us/library/aa489506.aspx
A contiguous virtual memory address range can be spread over several physical pages, and these
pages can be discontiguous. The system uses a memory descriptor list (MDL) structure to
represent the physical page layout for a virtual memory buffer.
You can allocate an MDL with the IoAllocateMdl routine.
For a buffer that is allocated from nonpaged pool, use MmBuildMdlForNonPagedPool to initialize
the page number array.
For pagable memory, the correspondence between virtual and physical memory is temporary, so the
page number array is valid only under certain circumstances. Call MmProbeAndLockPages to lock
the pagable memory into place and initialize the page number array for the current layout. The
memory will not be paged out until the caller uses the MmUnlockPages routine, at which point
the contents of the page number array are no longer valid.