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

来源:互联网 发布:千寻位置网络 编辑:程序博客网 时间:2024/05/16 03:50
typedef struct _REPROTECT_CONTEXT{    PMDL   Mdl;    PUCHAR LockedVa;} REPROTECT_CONTEXT, * PREPROTECT_CONTEXT; NTSTATUSMmLockVaForWrite(    __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;}NTSTATUSMmUnlockVaForWrite(    __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;}

0 0
原创粉丝点击