您的位置:首页 > 其它

ProbeForRead(),ProbeForWrite()

2013-10-28 14:11 871 查看
ProbeForRead(),ProbeForWrite()函数

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()

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息