From ab1c8d93e64b754a3bc7505cef0306098f5d64a4 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Tue, 15 May 2018 20:44:34 +0200 Subject: [PATCH] Fix wrong calculation of check_swap windows plugin This fixes the wrong calculation of the check_swap windows plugin. --- plugins/check_swap.cpp | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index d405a094f..4c317dbac 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -21,7 +21,8 @@ #include #include #include -#include +#include +#include #define VERSION 1.0 @@ -37,8 +38,26 @@ struct printInfoStruct Bunit unit = BunitMB; }; +struct pageFileInfo +{ + SIZE_T totalSwap; + SIZE_T availableSpwap; +}; + static bool l_Debug; +BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCTSTR lpFilename) { + std::vector* pageFile = static_cast*>(pContext); + SYSTEM_INFO systemInfo; + + GetSystemInfo(&systemInfo); + + // pPageFileInfo output is in pages, we need to multiply it by the page size + pageFile->push_back({ pPageFileInfo->TotalSize * systemInfo.dwPageSize, (pPageFileInfo->TotalSize - pPageFileInfo->TotalInUse) * systemInfo.dwPageSize }); + + return TRUE; +} + static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoStruct& printInfo) { WCHAR namePath[MAX_PATH]; @@ -187,17 +206,20 @@ static int printOutput(printInfoStruct& printInfo) static int check_swap(printInfoStruct& printInfo) { - MEMORYSTATUSEX MemBuf; - MemBuf.dwLength = sizeof(MemBuf); + PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc; + std::vector pageFiles; - if (!GlobalMemoryStatusEx(&MemBuf)) { + if(!EnumPageFiles(pageFileCallback, &pageFiles)) { printErrorInfo(); return 3; } - printInfo.tSwap = round(MemBuf.ullTotalPageFile / pow(1024.0, printInfo.unit)); - printInfo.aSwap = round(MemBuf.ullAvailPageFile / pow(1024.0, printInfo.unit)); - printInfo.percentFree = 100.0 * MemBuf.ullAvailPageFile / MemBuf.ullTotalPageFile; + for (int i = 0; i < pageFiles.size(); i++) { + printInfo.tSwap += round(pageFiles.at(i).totalSwap / pow(1024.0, printInfo.unit)); + printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit)); + } + + printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; return -1; } -- 2.40.0