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:
parent
439750e174
commit
7cf5d8e738
@ -8,6 +8,49 @@ namespace
|
|||||||
{
|
{
|
||||||
void limitTo2Gb(SIZE_T& mem);
|
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)
|
void WINAPI globalMemoryStatus(LPMEMORYSTATUS lpBuffer)
|
||||||
{
|
{
|
||||||
LOG_FUNC("GlobalMemoryStatus", lpBuffer);
|
LOG_FUNC("GlobalMemoryStatus", lpBuffer);
|
||||||
@ -35,6 +78,7 @@ namespace Win32
|
|||||||
{
|
{
|
||||||
void installHooks()
|
void installHooks()
|
||||||
{
|
{
|
||||||
|
HOOK_FUNCTION(kernel32, GetDiskFreeSpaceW, getDiskFreeSpaceW);
|
||||||
HOOK_FUNCTION(kernel32, GlobalMemoryStatus, globalMemoryStatus);
|
HOOK_FUNCTION(kernel32, GlobalMemoryStatus, globalMemoryStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user