Открываем старую справку по функции GlobalMemoryStatus() и находим описание параметра lpBuffer:

Points to a MEMORYSTATUS structure in which information about current memory availability is returned. Before calling this function, the calling process should set the dwLength member of this structure.

Угу. А теперь находим на сайте Microsoft справку по той же функции и читаем описание параметра lpBuffer:

A pointer to a MEMORYSTATUS structure. The GlobalMemoryStatus function stores information about current memory availability into this structure.

https://learn.microsoft.com...e-globalmemorystatus
Про размер ничего не написано. Давайте посмотрим, что там написано про параметр dwLength в описании самой структуры!

The size of the MEMORYSTATUS data structure, in bytes. You do not need to set this member before calling the GlobalMemoryStatus function; the function sets it.

https://learn.microsoft.com...winbase-memorystatus
Молодцы!
Тут уже был как-то персонаж, которому GlobalMemoryStatusEx() при каждом запуске выдавала разный общий размер физической памяти. При чём цифры там шли на терабайты. Оказалось, что чувак а) не инициализировал структуру, б) не устанавливал обязательное поле (в новой документации написано, что поле dwLength для Ex версии устанавливать надо) и в) не проверял результат. Вот ему Цэ и выдавал мусор в структуру, функция ничего со структурой не делала, поскольку в dwLength было неправильное значение, а FALSE персонаж не видел. Вот и думал, что функция работает неправильно.
https://stackoverflow.com/q...memorystatusex-win32