lovehunterboy
驱动小牛
驱动小牛
  • 注册日期2008-05-29
  • 最后登录2010-04-16
  • 粉丝2
  • 关注0
  • 积分67分
  • 威望463点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1199回复:1

请问这里为什么要这样做?

楼主#
更多 发布于:2008-10-16 18:33
以前看监控注册表的驱动,在下钩时只是找到函数服务地址把自己的函数赋给他就行了,而现在看NDIS钩住NdisDeregisterProtocol等这些函数却要这样(没看懂下面的一段,请指点一下):
addr是在NDIS模块存放要钩住函数偏移量的地址,value为自己的函数地址相对于NDIS基指的偏移量
为什么不能直接把value这个值直接赋给addr所在地址(或者直接把NDIS基指+*addr=我的函数地址)???而要像下面这样?
BOOLEAN
replace_value_safe(ULONG *addr, ULONG value)//在这里下钩
{
    MDL *mdl;
    ULONG *virt_addr;

    mdl = IoAllocateMdl(addr, sizeof(value), FALSE, FALSE, NULL);
    if (mdl == NULL)
        return FALSE;

    __try {
    
        MmProbeAndLockPages(mdl, KernelMode, IoModifyAccess);//在内存中锁定MDL描述的页

    } __except(EXCEPTION_EXECUTE_HANDLER) {
        KdPrint(("[ndis_hk] replace_value_safe: MmProbeAndLockPages!\n"));
        return FALSE;
    }
    
    //将锁定的物理页映射到系统空间
    virt_addr = (ULONG *)MmGetSystemAddressForMdlSafe(mdl,NormalPagePriority);

    *(ULONG *)virt_addr = value;

    MmUnlockPages(mdl);
    IoFreeMdl(mdl);
    return TRUE;
}
smilebear
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2010-06-24
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望38点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-10-20 14:55
个人猜想,你要放钩子的协议驱动程序有没有可能被卸载(网络协议不同于其它有些常驻内存的内核驱动,是有可能被用户卸载的)。
感觉这段code是为了保证更加安全的处理方式,MmProbeAndLockPages(),找到地址所在的物理页并将其锁定,即在进行地址替换的时候,该地址所在页不可能由于被交换出物理页面而变得无效。
游客

返回顶部