标准MDL方法修改Page、NonPage内存的属性

typedef struct _REPROTECT_CONTEXT
{
    PMDL   Mdl;
    PUCHAR LockedVa;
} REPROTECT_CONTEXT, * PREPROTECT_CONTEXT;
 
NTSTATUS
MmLockVaForWrite(
    __in PVOID Va,
    __in ULONG Length,
    __out PREPROTECT_CONTEXT ReprotectContext
    )
{
    NTSTATUS Status;

    Status = STATUS_SUCCESS;

    ReprotectContext->Mdl      = 0;
    ReprotectContext->LockedVa = 0;

    ReprotectContext->Mdl = IoAllocateMdl(
        Va,
        Length,
        FALSE,
        FALSE,
        0
        );

    if (!ReprotectContext->Mdl)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    // Retrieve a locked VA mapping.
    //

    __try
    {
        MmProbeAndLockPages(
            ReprotectContext->Mdl,
            KernelMode,
            IoModifyAccess
            );
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
       return GetExceptionCode();
    }

    ReprotectContext->LockedVa = (PUCHAR)MmMapLockedPagesSpecifyCache(
        ReprotectContext->Mdl,
        KernelMode,
        MmCached,
        0,
        FALSE,
        NormalPagePriority
        );

    if (!ReprotectContext->LockedVa)
    {
       

        IoFreeMdl(
            ReprotectContext->Mdl
            );

        ReprotectContext->Mdl = 0;

        return STATUS_ACCESS_VIOLATION;
    }

    //
    // Reprotect.
    //

    Status = MmProtectMdlSystemAddress(
        ReprotectContext->Mdl,
        PAGE_EXECUTE_READWRITE
        );

    if (!NT_SUCCESS(Status))
    {


        MmUnmapLockedPages(
            ReprotectContext->LockedVa,
            ReprotectContext->Mdl
            );
        MmUnlockPages(
            ReprotectContext->Mdl
            );
        IoFreeMdl(
            ReprotectContext->Mdl
            );

        ReprotectContext->LockedVa = 0;
        ReprotectContext->Mdl      = 0;
    }

    return Status;
}

NTSTATUS
MmUnlockVaForWrite(
    __in PREPROTECT_CONTEXT ReprotectContext
    )
{
    if (ReprotectContext->LockedVa)
    {
        MmUnmapLockedPages(
            ReprotectContext->LockedVa,
            ReprotectContext->Mdl
            );
        MmUnlockPages(
            ReprotectContext->Mdl
            );
        IoFreeMdl(
            ReprotectContext->Mdl
            );

        ReprotectContext->LockedVa = 0;
        ReprotectContext->Mdl      = 0;
    }

    return STATUS_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值