1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Limit free disk space to 2GB

Fixes startup issue in some games (e.g. Infinity Engine).
This commit is contained in:
narzoul 2023-11-05 18:50:43 +01:00
parent 439750e174
commit 7cf5d8e738

View File

@ -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 = &sectorsPerCluster;
}
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);
}
}