/
main.go
72 lines (61 loc) · 1.64 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"flag"
"fmt"
human "github.com/dustin/go-humanize"
"syscall"
"unsafe"
)
var MAX = flag.Uint64("max", 2048, "-max=2048 value is in MB")
var MIN = flag.Uint64("min", 0, "-min=2048 value is in MB")
const (
FILE_CACHE_MAX_HARD_ENABLE = 0x1
FILE_CACHE_MIN_HARD_ENABLE = 0x4
)
func abort(funcname string, err error) {
panic(fmt.Sprintf("%s failed: %v", funcname, err))
}
func GetSizes() string {
kernel32, err := syscall.LoadDLL("kernel32.dll")
if nil != err {
abort("loadLibrary", err)
}
defer kernel32.Release()
get, err := kernel32.FindProc("GetSystemFileCacheSize")
if nil != err {
abort("GetProcAddress", err)
}
var minFileCache uint64
var maxFileCache uint64
var lpFlags uint32
res, _, err := get.Call(uintptr(unsafe.Pointer(&minFileCache)), uintptr(unsafe.Pointer(&maxFileCache)), uintptr(unsafe.Pointer(&lpFlags)))
if res == 0 {
abort("getSystemFileCacheSize", err)
}
return fmt.Sprintf("Min: %v Max: %v Flags: %v", human.Bytes(minFileCache), human.Bytes(maxFileCache), lpFlags)
}
func setSizes() {
kernel32, err := syscall.LoadDLL("kernel32.dll")
if nil != err {
abort("loadLibrary", err)
}
defer kernel32.Release()
set, err := kernel32.FindProc("SetSystemFileCacheSize")
if nil != err {
abort("GetProcAddress", err)
}
var lpFlags uint32
lpFlags = FILE_CACHE_MAX_HARD_ENABLE
max := *MAX * uint64(1000) * uint64(1000)
min := *MIN * uint64(1000) * uint64(1000)
res, _, err := set.Call(uintptr(min), uintptr(max), uintptr(lpFlags))
if res == 0 {
abort("SetSystemFileCacheSize", err)
}
}
func main() {
flag.Parse()
fmt.Println("BEFORE: ", GetSizes())
setSizes()
fmt.Println("AFTER: ", GetSizes())
}