diff --git a/import/OpenXDK/include/xboxkrnl/xbox.h b/import/OpenXDK/include/xboxkrnl/xbox.h index 322b7a6cb..56f868277 100644 --- a/import/OpenXDK/include/xboxkrnl/xbox.h +++ b/import/OpenXDK/include/xboxkrnl/xbox.h @@ -73,6 +73,8 @@ #define AV_OPTION_CGMS 18 #define AV_OPTION_WIDESCREEN 19 +VOID InitializeFscCacheEvent(); + // ****************************************************************** // * 0x0001 - AvGetSavedDataAddress() // ****************************************************************** diff --git a/src/core/kernel/exports/EmuKrnlFs.cpp b/src/core/kernel/exports/EmuKrnlFs.cpp index 5ec1d9938..4365a2596 100644 --- a/src/core/kernel/exports/EmuKrnlFs.cpp +++ b/src/core/kernel/exports/EmuKrnlFs.cpp @@ -70,6 +70,13 @@ XBSYSAPI EXPORTNUM(36) xboxkrnl::VOID NTAPI xboxkrnl::FscInvalidateIdleBlocks() LOG_UNIMPLEMENTED(); } +static xboxkrnl::KEVENT g_FscCacheEvent; + +xboxkrnl::VOID xboxkrnl::InitializeFscCacheEvent() +{ + KeInitializeEvent(&g_FscCacheEvent, SynchronizationEvent, TRUE); +} + // ****************************************************************** // * 0x0025 - FscSetCacheSize() // ****************************************************************** @@ -81,17 +88,27 @@ XBSYSAPI EXPORTNUM(37) xboxkrnl::NTSTATUS NTAPI xboxkrnl::FscSetCacheSize LOG_FUNC_ONE_ARG(NumberOfCachePages); NTSTATUS ret = STATUS_SUCCESS; + KeWaitForSingleObject(&g_FscCacheEvent, Executive, 0, 0, 0); + UCHAR orig_irql = KeRaiseIrqlToDpcLevel(); - if (NumberOfCachePages > FSCACHE_MAXIMUM_NUMBER_OF_CACHE_PAGES) + if (NumberOfCachePages > FSCACHE_MAXIMUM_NUMBER_OF_CACHE_PAGES) { ret = STATUS_INVALID_PARAMETER; - else - { - // TODO : Actually allocate file system cache pages, for example do something like this : - // if (NumberOfCachePages < g_FscNumberOfCachePages) FscShrinkCacheSize(NumberOfCachePages) - // if (NumberOfCachePages > g_FscNumberOfCachePages) FscGrowCacheSize(NumberOfCachePages), possibly return STATUS_INSUFFICIENT_RESOURCES + } + else { + // TODO : Actually allocate file system cache pages. +#if 0 + if (NumberOfCachePages > g_FscNumberOfCachePages) { + ret = FscGrowCacheSize(NumberOfCachePages); + } + else if (NumberOfCachePages < g_FscNumberOfCachePages) { + ret = FscShrinkCacheSize(NumberOfCachePages); + } +#endif g_FscNumberOfCachePages = NumberOfCachePages; } + KfLowerIrql(orig_irql); + KeSetEvent(&g_FscCacheEvent, 0, 0); RETURN(ret); } diff --git a/src/core/kernel/init/CxbxKrnl.cpp b/src/core/kernel/init/CxbxKrnl.cpp index ce669da36..27c5fc560 100644 --- a/src/core/kernel/init/CxbxKrnl.cpp +++ b/src/core/kernel/init/CxbxKrnl.cpp @@ -1285,6 +1285,8 @@ __declspec(noreturn) void CxbxKrnlInit // But with this, we can replace some busy loops with sleeps. timeBeginPeriod(1); + xboxkrnl::InitializeFscCacheEvent(); + // update caches CxbxKrnl_TLS = pTLS; CxbxKrnl_TLSData = pTLSData;