我正在尝试制作一个反仿真器 分配一个大内存区域并强制内核通过向内存填充值来将页面提交到物理内存,因为模拟器无法分配太多内存 但我不知道如何用该区域的值填充内存 这是我到目前为止所做的
System :: Call“kernel32 :: LocalAlloc(i 0,i 143978374)p .r0”;分配143 978 374字节并在$ 0中写指针
;我需要在这里用值填充内存
System ::调用“kernel32 :: LocalFree(p r0)”
答案 0 :(得分:1)
如果使用LocalAlloc
标志调用LMEM_ZEROINIT
,Windows可能会为您写入缓冲区。从技术上讲,这可能是一个实现细节,理论上未来的系统可以支持硬件中的这种功能。你的仿真事物,无论是什么,都可能会忽略它。
您可以使用系统插件结构语法写入内存:
!define PAGESIZE 4096
!define BLOBSIZE 143978374
!include Util.nsh
!ifndef IntPtrOp ; NSIS 2 compatibility
!define IntPtrOp IntOp
!endif
!ifndef IntPtrCmpU
!define IntCmpU
!endif
System::Alloc ${BLOBSIZE} ; This calls GlobalAlloc(GPTR, ...)
Pop $0
${IntPtrCmpU} $0 0 done "" "" ; Failure to allocate memory?
StrCpy $1 $0 ; Start
${IntPtrOp} $2 $1 + ${BLOBSIZE} ; End
loop:
System::Call '*$1(&i1 42)' ; Set the first byte in the page to 42
${IntPtrOp} $1 $1 + ${PAGESIZE}
${IntPtrCmpU} $1 $2 "" loop ""
System::Free $0
done:
系统插件不是非常快,因此需要一段时间来填充大型内存块。