gpt4 book ai didi

c++ - 如何判断虚拟内存页是否已被锁定?

转载 作者:可可西里 更新时间:2023-11-01 11:24:30 25 4
gpt4 key购买 nike

比如说,如果在某个时候我的进程中的某个范围的虚拟内存被这样锁定:

//Memory was reserved & committed as such
void* pMem = ::VirtualAlloc(NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

//...

//And then
::VirtualLock(pMem, 4096);

所以在我的进程的虚拟内存中有一个页面的任意地址,我可以判断它是否是 locked

最佳答案

使用 win32 api 这是不可能的。但如果使用 ZwQueryVirtualMemory未记录 MEMORY_INFORMATION_CLASS值(value)观——这是可能的。对于数据结构定义 - 请参阅 ntmmapi.h

我们需要使用MemoryWorkingSetExInformationMEMORY_WORKING_SET_EX_BLOCK并使用 ULONG_PTR Locked : 1; 成员

演示测试:

NTSTATUS IsPageLocked(PVOID BaseAddress, BOOLEAN& Locked)
{
MEMORY_WORKING_SET_EX_INFORMATION mwsei = { BaseAddress };

NTSTATUS status = ZwQueryVirtualMemory(NtCurrentProcess(), 0, MemoryWorkingSetExInformation, &mwsei, sizeof(mwsei), 0);

if (0 <= status)
{
if (mwsei.VirtualAttributes.Valid)
{
Locked = mwsei.VirtualAttributes.Locked;
}
else
{
status = STATUS_INVALID_ADDRESS;
}
}

return status;
}

NTSTATUS IsPageLockedEx(PVOID BaseAddress, BOOLEAN& Locked)
{
NTSTATUS status = IsPageLocked(BaseAddress, Locked);
if (0 > status)
{
DbgPrint("IsPageLocked - error %x\n", status);
}
else
{
DbgPrint("IsPageLocked = %x\n", Locked);
}
return status;
}

void CheckVA()
{
if (PVOID pv = VirtualAlloc(NULL, PAGE_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE))
{
BOOLEAN Locked;
NTSTATUS status = IsPageLockedEx(pv, Locked);

if (status == STATUS_INVALID_ADDRESS)
{
// at this point physical memory for pv not yet committed. reference memory for commit physical page
if (*(PBYTE)pv) __nop();

status = IsPageLockedEx(pv, Locked);
}

if (VirtualLock(pv, PAGE_SIZE))
{
IsPageLockedEx(pv, Locked);

if (VirtualUnlock(pv, PAGE_SIZE))
{
IsPageLockedEx(pv, Locked);
}
else
{
__debugbreak();
}
}

VirtualFree(pv, 0, MEM_RELEASE);
}
}

DbgPrint输出

IsPageLocked - error c0000141
IsPageLocked = 0
IsPageLocked = 1
IsPageLocked = 0

关于c++ - 如何判断虚拟内存页是否已被锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43995893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com