检查我是否可以写入内存
Check if i can write to memory
我有一个访问特定内存并写入的代码
:
*addr = _data;
但有些情况下,addr
变量可以指向不可访问的内存,无法读取或写入(例如,nullptr
).在这种情况下,不应执行上面的代码。问题是,如何检查 addr
中的内存地址是否有效?我了解到我无法捕获 访问冲突异常 ,我也无法使用 IsBadReadPtr
WinAPI 函数,因为它基本上是无用的。我应该如何检查这种情况?
使用VirtualQuery获取页面保护,查看指针指向的区域是否可写。
但请注意,这不应该用来掩盖糟糕的设计。确保所有指针和引用在使用时都有效。
如果你想知道一个地址是否可写,写信给它。将代码包装在 SEH 处理程序中,然后从那里获取它。
您无法可靠地查询可写性(使用 VirtualQuery, for example), since your process' address space is in constant flux. Doing so introduces a TOCTOU race。
我有一个访问特定内存并写入的代码 :
*addr = _data;
但有些情况下,addr
变量可以指向不可访问的内存,无法读取或写入(例如,nullptr
).在这种情况下,不应执行上面的代码。问题是,如何检查 addr
中的内存地址是否有效?我了解到我无法捕获 访问冲突异常 ,我也无法使用 IsBadReadPtr
WinAPI 函数,因为它基本上是无用的。我应该如何检查这种情况?
使用VirtualQuery获取页面保护,查看指针指向的区域是否可写。
但请注意,这不应该用来掩盖糟糕的设计。确保所有指针和引用在使用时都有效。
如果你想知道一个地址是否可写,写信给它。将代码包装在 SEH 处理程序中,然后从那里获取它。
您无法可靠地查询可写性(使用 VirtualQuery, for example), since your process' address space is in constant flux. Doing so introduces a TOCTOU race。