zoukankan      html  css  js  c++  java
  • [Windows 驱动开发] 驱动判断地址是否有效


    驱动判断 R0 层

    BOOLEAN MmIsAddressValid(
      PVOID VirtualAddress
    );
    

    即使 MmIsAddressValid 返回 TRUE,访问地址也可能导致页错误,除非内存已锁定或地址是有效的非分页池地址。 因为它只判断地址字节的第一个地址.只要你的地址在这个分页.那么可以. 但是就怕分页.后面分页不对就会出错.


    驱动判断 R3 层

    void ProbeForRead(
      const volatile VOID *Address,
      SIZE_T              Length,
      ULONG               Alignment
    );
    
    void ProbeForWrite(
      volatile VOID *Address,
      SIZE_T        Length,
      ULONG         Alignment
    );
    

    如果指定的内存范围不在用户模式地址范围内,会引发 STATUS_ACCESS_VIOLATION 异常。如果地址范围的开头没有在对齐所指定的字节边界上对齐, 会引发 STATUS_DATATYPE_MISALIGNMENT 异常。

    所以一定要配合 SEH 使用:

    (例子)

    __try
    {
    	ProbeForRead(DbgDir, sizeof(IMAGE_DEBUG_DIRECTORY), 1);
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
    	KdPrint(("EXCEPTION_EXECUTE_HANDLER\n"));
    }
    
    
  • 相关阅读:
    Java1:Chapter2
    Java1:Chapter1
    Java1:Chapter11
    Java1:Chapter8
    Java1:Chapter6
    Android day 03
    Android day02
    Android day01
    二进制文件的读写
    字符流
  • 原文地址:https://www.cnblogs.com/csnd/p/15613338.html
Copyright © 2011-2022 走看看