diff --git a/DDrawCompat/Win32/MemoryManagement.cpp b/DDrawCompat/Win32/MemoryManagement.cpp index ce53367..63cbb14 100644 --- a/DDrawCompat/Win32/MemoryManagement.cpp +++ b/DDrawCompat/Win32/MemoryManagement.cpp @@ -8,6 +8,49 @@ namespace { void limitTo2Gb(SIZE_T& mem); + BOOL WINAPI getDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) + { + LOG_FUNC("GetDiskFreeSpaceW", lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, + lpNumberOfFreeClusters, lpTotalNumberOfClusters); + + DWORD sectorsPerCluster = 0; + DWORD bytesPerSector = 0; + DWORD numberOfFreeClusters = 0; + DWORD totalNumberOfClusters = 0; + + if (!lpSectorsPerCluster) + { + lpSectorsPerCluster = §orsPerCluster; + } + if (!lpBytesPerSector) + { + lpBytesPerSector = &bytesPerSector; + } + if (!lpNumberOfFreeClusters) + { + lpNumberOfFreeClusters = &numberOfFreeClusters; + } + if (!lpTotalNumberOfClusters) + { + lpTotalNumberOfClusters = &totalNumberOfClusters; + } + + auto result = CALL_ORIG_FUNC(GetDiskFreeSpaceW)(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, + lpNumberOfFreeClusters, lpTotalNumberOfClusters); + if (result) + { + const DWORD bytesPerCluster = *lpSectorsPerCluster * *lpBytesPerSector; + if (0 != bytesPerCluster) + { + const DWORD maxClusters = INT_MAX / bytesPerCluster; + *lpNumberOfFreeClusters = std::min(*lpNumberOfFreeClusters, maxClusters); + *lpTotalNumberOfClusters = std::min(*lpTotalNumberOfClusters, maxClusters); + } + } + return LOG_RESULT(result); + } + void WINAPI globalMemoryStatus(LPMEMORYSTATUS lpBuffer) { LOG_FUNC("GlobalMemoryStatus", lpBuffer); @@ -35,6 +78,7 @@ namespace Win32 { void installHooks() { + HOOK_FUNCTION(kernel32, GetDiskFreeSpaceW, getDiskFreeSpaceW); HOOK_FUNCTION(kernel32, GlobalMemoryStatus, globalMemoryStatus); } }