Detect Free RAM?
How can we detect free RAM in the end-user machine? 🤪
18 posts
System::Alloc 32
Pop $1
System::Call "Kernel32::GlobalMemoryStatus(i) v (r1)"
System::Call "*$1(&i4 .r2, &i4 .r3, &i4 .r4, \
&i4 .r5, &i4 .r6, &i4.r7, &i4 .r8, &i4 .r9)"
System::Free $1
DetailPrint "Structure size (useless): $2 Bytes"
DetailPrint "Memory load: $3%"
DetailPrint "Total physical memory: $4 Bytes"
DetailPrint "Free physical memory: $5 Bytes"
DetailPrint "Total page file: $6 Bytes"
DetailPrint "Free page file: $7 Bytes"
DetailPrint "Total virtual: $8 Bytes"
DetailPrint "Free virtual: $9 Bytes" I thought this might save someone some time.
## allocate
System::Alloc 64
Pop $0
## set
# GlobalMemoryStatusEx requires structure size to set in
# MEMORYSTATUSEX instance passed in as argument
System::Call "*$0(i 64, i 0, l 0, l 0, l 0, l 0, l 0, l 0, l 0)"
## call
System::Call "Kernel32::GlobalMemoryStatusEx(i r0)"
## get
System::Call "*$0(i.r1, i.r2, l.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9)"
## free
System::Free $0
DetailPrint "Structure size: $1 bytes"
DetailPrint "Memory load: $2%"
DetailPrint "Total physical memory: $3 bytes"
DetailPrint "Free physical memory: $4 bytes"
DetailPrint "Total page file: $5 bytes"
DetailPrint "Free page file: $6 bytes"
DetailPrint "Total virtual: $7 bytes"
DetailPrint "Free virtual: $8 bytes"
DetailPrint "Free extended virtual: $9 bytes"
the system plugin has Int64OpExcellent! Math::Script seemed a little too heavy weight for my needs...
System::Alloc 32
Pop $1
System::Call "Kernel32::GlobalMemoryStatus(i) v (r1)"
System::Call "*$1(&i4 .r2, &i4 .r3, &i4 .r4, &i4 .r5, \
&i4 .r6, &i4.r7, &i4 .r8, &i4 .r9)"
System::Free $1
; $5 => Free RAM
; $4 => Total RAM
IntOp $R5 $5 / 1048576 ; 1048576 = 1024*1024, or MegaX
IntOp $R4 $4 / 1048576 ; 1048576 = 1024*1024, or MegaX
MessageBox MB_OK "R5: $R5 5: $5 R4: $R4 4: $4" gives this (also picture attached):System::Alloc 64
Pop $0
## set
# GlobalMemoryStatusEx requires structure size to set in
# MEMORYSTATUSEX instance passed in as argument
System::Call "*$0(i 64, i 0, l 0, l 0, l 0, l 0, l 0, l 0, l 0)"
## call
System::Call "Kernel32::GlobalMemoryStatusEx(i r0)"
## get
System::Call "*$0(i.r1, i.r2, l.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9)"
## free
System::Free $0
MessageBox MB_OK "TotalRAM: $3 FreeRAM: $4"
IntOp $vTotalRAMtemp $3 * 1
IntOp $vTotalRAM $vTotalRAMtemp / 1
MessageBox MB_OK "TotalRAM: $vTotalRAM"
; $4 => Free RAM
; $3 => Total RAM
IntOp $vTotalRAM $3 / 1048576 ; 1048576 = 1024*1024, or MegaX
IntOp $vFreeRAM $4 / 1048576 ; 1048576 = 1024*1024, or MegaX
MessageBox MB_OK "vTotalRAM: $vTotalRAM" on a 64 bit machine I get: -262776
System::Alloc 64
Pop $0
System::Call "*$0(i 64)"
System::Call "Kernel32::GlobalMemoryStatusEx(i r0)"
System::Call "*$0(i, i, l.r1, l, l, l, l, l, l)"
System::Free $0
; convert bytes to megabytes
System::Int64Op $1 / 1048576
Pop $1