ProbeForRead(),ProbeForWrite()
2013-10-28 14:11
871 查看
ProbeForRead(),ProbeForWrite()函数
转自:http://bbs.pediy.com/showthread.php?p=1121442
ProbeForRead MSDN解释 http://msdn.microsoft.com/en-us/library/windows/hardware/ff559876%28v=vs.85%29.aspx ProbeForWrite MSDN解释 http://msdn.microsoft.com/en-us/library/windows/hardware/ff559879%28v=vs.85%29.aspx ProbeForWrite ( __inout_bcount(Length) PVOID Address, __in SIZE_T Length, __in ULONG Alignment ) /*++ Routine Description: This function probes a structure for write accessibility and ensures correct alignment of the structure. If the structure is not accessible or has incorrect alignment, then an exception is raised. Arguments: Address - Supplies a pointer to the structure to be probed. Length - Supplies the length of the structure. Alignment - Supplies the required alignment of the structure expressed as the number of bytes in the primitive datatype (e.g., 1 for char, 2 for short, 4 for long, and 8 for quad). Return Value: None. --*/ { ULONG_PTR EndAddress; ULONG_PTR StartAddress; #define PageSize PAGE_SIZE // // If the structure has zero length, then do not probe the structure for // write accessibility or alignment. // if (Length != 0) { // // If the structure is not properly aligned, then raise a data // misalignment exception. // ASSERT((Alignment == 1) || (Alignment == 2) || (Alignment == 4) || (Alignment == 8) || (Alignment == 16)); //如果对齐值为其中的一个,则不产生断言 StartAddress = (ULONG_PTR)Address; if ((StartAddress & (Alignment - 1)) == 0) { //判断StartAddress是否为0地址打头(根据字节对齐指定多少位0) // // Compute the ending address of the structure and probe for // write accessibility. // EndAddress = StartAddress + Length - 1; //获得缓冲区的最后一个字节地址 if ((StartAddress <= EndAddress) && (EndAddress < MM_USER_PROBE_ADDRESS)) { //如果是合法用户地址 // // N.B. Only the contents of the buffer may be probed. // Therefore the starting byte is probed for the // first page, and then the first byte in the page // for each succeeding page. // // If this is a Wow64 process, then the native page is 4K, which // could be smaller than the native page size/ // EndAddress = (EndAddress & ~(PageSize - 1)) + PageSize; //这个的意思是内存对齐,(如果 EndAddress大小为1个字节, PageSize为512字节,这样对齐以后,EndAddress 就等于512了) do { *(volatile CHAR *)StartAddress = *(volatile CHAR *)StartAddress; StartAddress = (StartAddress & ~(PageSize - 1)) + PageSize; } while (StartAddress != EndAddress); return; } else { ExRaiseAccessViolation(); } } else { ExRaiseDatatypeMisalignment(); } } return; }
转自:http://bbs.pediy.com/showthread.php?p=1121442
ProbeForRead()和MmIsAddressValid()
相关文章推荐
- ProbeForRead()和MmIsAddressValid()
- 驱动漏洞中的__try和ProbeForRead
- 关于IOCTL_HID_GET_STRING和ProbeForWrite
- XML——StAX Streaming API for XML(read+write)
- C language : write/read for file
- Archive for required library xx cannot be read or is not a valid ZIP file
- JsonSerde - a read/write SerDe for JSON Data
- AjaxPro.HttpSessionStateRequirement.ReadWrite
- Opening Files for Read and Write
- How to use Kess V2 5.017 for BMW F series read/write
- Archive for required library: proxool/proxool/0.9.0RC3/proxool-0.9.0RC3.jar' cannot be read or is no
- ORA-16433: The database must be opened in read/write mode
- eclipse导入项目Archive for required library cannot be read or is not a valid ZIP file
- nnoDB: ./ib_logfile0 can't be opened in read-write mode
- eclipse maven error: Archive for required library in project cannot be read or is not a valid ZIP 问题
- read/write support for NTFS drives in Snow Leopard
- 作品[RFileRead/WriteStream 练习] for s60 fp2
- java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for read
- GEM5: Different cache latency for read and write access 设置不同的读写latency
- Archive for required library: "xxxx" in project '*' cannot be read or is not a valid ZIP file