mrkrcl 发表于 2012-2-3 12:56:38

转载一段代码,MDL修改page,nonpag内存属性的代码

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;
}

页: [1]
查看完整版本: 转载一段代码,MDL修改page,nonpag内存属性的代码