Microsoft KB Archive/199311

From BetaArchive Wiki

INFO: MmMapLockedPages Returns Actual Virtual Address In SP4

Q199311



The information in this article applies to:


  • Microsoft Win32 Device Driver Kit (DDK) for Windows NT, versions 3.5, 3.51, 4.0
  • Microsoft Win32 Device Driver Kit (DDK) for Windows 2000





SUMMARY

In the Windows NT 4.0 Service Pack 3 and earlier versions, MmMapLockedPages returns the base virtual address (a page-aligned address) that maps the locked pages for the range described by the MDL. However, this has been changed in Service Pack 4 and later versions to return the actual virtual address including the byte offset within a page of the buffer described by the MDL.



MORE INFORMATION

In Windows NT 4.0 Service Pack 3 and earlier versions, if the buffer described by the MDL is not page-aligned then you have to add the offset stored in the MDL with the base virtual address returned by the function to get the actual address as shown here:


VirtualAddress = (PVOID) (((ULONG) MmMapLockedPages(Mdl, Mode)) +  MmGetMdlByteOffset(Mdl)); 



In Service Pack 4 and later versions, this function has been altered to consider the byte offset stored in the MDL and returns the actual virtual address as shown here:


VirtualAddress = (PVOID) MmMapLockedPages(Mdl, Mode); 



To fix the above mentioned inconsistencies and make the code portable across all versions of Windows NT, use the following:


VirtualAddress = (PVOID) (((ULONG) MmMapLockedPages(Mdl, Mode)) | MmGetMdlByteOffset(Mdl)); 



or


VirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl, Mode))) + MmGetMdlByteOffset(Mdl)); 



Microsoft has confirmed the pre-Service Pack 4 behavior of this function to be a bug and has fixed it in order to resolve memory addressing issues on future releases of Windows NT; Windows NT 64-bit in particular.




REFERENCES

Q189327

Additional query words: kbDSupport

Keywords : kbDDK kbKMode kbOSWinNT400 kbOSWinNT400fix kbOSWin2000
Issue type : kbinfo
Technology : kbAudDeveloper kbWinDDKSearch kbWin32sSearch kbWin32DDKSearch kbWin32DDKNT350 kbWin32DDKNT351 kbWin32DDKNT400 kbWin32DDKNTSearch


Last Reviewed: December 21, 1999
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.