SSE Incorrect length read

Kleiner Prinz

Ratsmitglied
Ich kämpfe immer noch mit dem "Incorrect length read" Problem.
Da ich mittlerweile eine Unmenge an esp, esl, esm Mods im Plugin-Verzeichnis habe, kann ich zwar mein Spiel speichern, aber das neu gespeicherte Savegame nicht laden, und lande per CTD auf dem Desktop.

Gelesen habe ich dazu:

Zitat:
"Standardmäßig können bis zu 512 Dateien gleichzeitig auf Stream-E / A-Ebene geöffnet sein" !

Es soll dazu aber eine Lösung geben !

So heißt es auch:
Zitat:
Das Limit von 512 geöffneten Dateien auf Stream-E / A-Ebene kann mithilfe der Funktion "_setmaxstdio" auf maximal 8.192 erhöht werden.

Quelle des Zitat:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setmaxstdio?view=msvc-160

Und:

Zitat:
Die maximale Anzahl von Dateihandles, die die C stdio-Ebene standardmäßig offen halten kann, beträgt 512.
Da SSE ein offenes Dateihandle für alle Ihre Plugins (einschließlich solcher, die nicht Teil Ihrer Ladereihenfolge sind) sowie einige andere wichtige Dateien beibehält.
Es ist möglich, diese Grenze bei einer Schwerlastreihenfolge zu erreichen.
Sobald Sie das Limit erreicht haben, schlagen alle Aufrufe von fopen_s fehl, was bedeutet, dass das Spiel keine neuen Dateien mehr lesen kann.
Dies führt unter anderem dazu, dass gespeicherte Spielelasten als beschädigt gemeldet werden, da das Spiel die gespeicherten Spieledateien nicht mehr lesen kann.
Dies ist ein Fehler, der als "falsche Speicherbeschädigung" bezeichnet wird.
Der Patch/Fix erhöht das Limit auf das Systemmaximum (2048), das für 99,9% der Anwendungsfälle mehr als ausreichend sein sollte.
Um es auf andere Weise zu lösen, müssten wichtige Teile der Datei-E / A von SSE neu geschrieben werden.

Quelle:
https://www.reddit.com/r/skyrimmods/comments/8muxmd/sse_engine_fixes_now_with_fix_for_false_save/

Leider finde ich dazu keinen Hinweis, in welcher ("ini"?) Datei man den Befehl "_setmaxstdio" findet, um den Wert zu erhöhen.

Leider kann "SSE Engine Fixes" dieses Problem nicht lösen, obwohl es heißt: "SSE Engine Fixes now updated with a fix for the false save corruption bug that appears after using many plugins".
Der Patch/Fix erhöht das Limit auf das Systemmaximum (2048), das für 99,9% der Anwendungsfälle mehr als ausreichend sein sollte.
Leider finde ich in der "ini" (bzw. jetzt ja "toml") kein "_setmaxstdio" , um den Wert weiter zu erhöhen. :(

# Engine Fixes for Skyrim Special Edition

[EngineFixes]
VerboseLogging = false # Add extra log messages
CleanSKSECosaves = false # Delete SKSE cosaves that have no matching save

[Patches]
DisableChargenPrecache = false # "Precache Killer", same patch that is already in RaceMenu
EnableAchievementsWithMods = true # Enables achievements with mods active
FormCaching = true # Attempts to speed up the global form table by caching recently used forms (SSE Fixes)
MaxStdio = true # Sets the maximum number of open file handles to 2048 (default 512), preventing the game from running out with large plugin counts (fixes false save corruption)
MemoryManager = true # Replaces Skyrim's global allocator
RegularQuicksaves = false # Makes quick saves into regular saves
SafeExit = true # Prevent the game from hanging while shutting down
SaveAddedSoundCategories = true # Save sound categories added by mods
ScaleformAllocator = true # Replaces the scaleform allocator
ScrollingDoesntSwitchPOV = false # Disables swapping between 1st/3rd person when using scroll to zoom, making it require manual swapping
SleepWaitTime = false # Modifies how long it takes an hour to pass when sleeping/waiting.
SleepWaitTimeModifier = 0.3 # 1.0 = default, smaller = faster, larger = slower
TreeLODReferenceCaching = true # Speeds up the slow Tree LOD function. Requires FormCaching to be active. (SSE Fixes)
WaterflowAnimation = true # Decouple water flow animation speed from in-game timescale and use our setting instead
WaterflowSpeed = 20.0 # 20.0 = default, smaller = slower, larger = faster

[Fixes]
ArcheryDownwardAiming = true # Fix a bug where arrows don't fire properly if you're aiming downward while crouching on a ridge
AnimationLoadSignedCrash = true # Fix a misplaced use of a signed value. Should allow to load more animations before CTD
BethesdaNetCrash = true # Fix the game crashing on startup if you live in a city or country with special characters in the name
BSLightingAmbientSpecular = true # Fix bug where lighting template Directional Ambient Specular & Fresnel Power are sent to BSLighting shader incorrectly
BSLightingShaderForceAlphaTest = true # Forces alpha test flag on when NiAlphaProperty/AlphaTest true. Fixes object LOD reflections.
BSLightingShaderParallaxBug = true # Fixes a bug causing the parallax technique to break if specular is not also set
BSTempEffectNiRTTI = true # Fixes a bug where the NiRTTI for this object is not set properly
CalendarSkipping = true # Fix a bug where the game calendar effectively skips a year if you fast travel too far between 20:00 and 23:99 in-game
CellInit = true # Fixes a rare crash where a form does not get converted from an id to a pointer
ConjurationEnchantAbsorbs = true # Fix bug where spell absorption triggers on enchanted items using conjuration summons
CreateArmorNodeNullptrCrash = true # Fix typo that may cause a crash somewhere in CreateArmorNode
DoublePerkApply = true # Fix NPC perks applying twice when you load a game
EquipShoutEventSpam = true # Fix a bug where the "equip shout" procedure will send a "shout equipped" event even if the shout fails to equip
GetKeywordItemCount = true # Fix the condition function "GetKeywordItemCount", which returns broken results in numerous cases
GHeapLeakDetectionCrash = true # Fix a crash where scaleform attempts to report a memory leak but the code doesnt exist in Skyrim's build
GlobalTime = true # Fixes game systems that are affected by game time instead of real time
LipSync = true # Fix a bug causing lip sync to desync. Same as LE bug fix.
MemoryAccessErrors = true # Fix a handful of out-of-bounds or use-after-free bugs. Required for experimental memory patches.
MO5STypo = true # Fix a typo preventing the game from loading MO5S (1st person female alternate texture set) entries in ARMA forms
NullProcessCrash = true # Fix a couple cases where the game can crash when checking the equipped weapons of an actor without an AI process
PerkFragmentIsRunning = true # Fix crash if the IsRunning function of a Perk Fragment is called on a non-Actor form
RemovedSpellBook = true # Fix a crash where learning a spell from a book that is later removed in another plugin causes a crash in inventory
SaveScreenshots = true # Fix black save screenshots when TAA is disabled
SlowTimeCameraMovement = true # Fix camera movement sensitivity during slow time
TorchLandscape = true # Fix a bug where torches sometimes don't light the landscape
TreeReflections = true # Fix tree LOD reflection alpha. ENB contains this fix, but there is no conflict.
VerticalLookSensitivity = true # Make vertical look sensitivity not tied to framerate
WeaponBlockScaling = true # Fix weapon blocking so it correctly scales off of the blocking actor's weapon

[Warnings]
DupeAddonNodes = false # Warns if there are two or more addon nodes (ADDN) with the same node index in your load order
RefHandleLimit = true # Warns when you are close to the reference handle limit at main menu and after loading a save
RefrMainMenuLimit = 800000 # Handle count to warn at on main menu
RefrLoadedGameLimit = 1000000 # Handle count to warn at after loading a save game

[Experimental]
SaveGameMaxSize = false # Expands the maximum uncompressed size of a save game from 64 MB to 128 MB# can fix "crash on save" issue in long-runnning saves

# DO NOT USE THIS IT IS FOR SPECIFIC TESTING ONLY
TreatAllModsAsMasters = false # Loads all mods as if they are masters.

Wer kennt sich aus, und kann mir sagen, in welcher ("ini"?) Datei man den Befehl "_setmaxstdio" findet ?
 
Zuletzt bearbeitet:
Leider finde ich dazu keinen Hinweis, in welcher ("ini"?) Datei man den Befehl "_setmaxstdio" findet, um den Wert zu erhöhen.
Den Wert findest du in der Enginefixes.dll So wie ich das sehe ist der Aufruf eine C++ Runtime Variable die man selten in Ini Dateien findet..
Die neuen Engine fixes sind auch zweiteilig und erfordern (die alten evtl. auch, ich habe kein SkyrimSE) noch die AdressLibrary die man hier findet
https://www.nexusmods.com/skyrimspecialedition/mods/32444
 
  • Like
Reaktionen: Kleiner Prinz
Engine fixes hat das Limit im Code fixed auf 2048 erhöht. Es gibt dazu (bisher) keine Möglichkeit, diesen Wert manuell/per ini weiter zu erhöhen. Dazu müsste man sich den Quellcode von github schnappen, die entsprechende codezeile editieren und dann die DLL neu compilieren.
Eventuell kommt aber mit einer Version eine weitere Erhöhung des Wertes bzw. er lässt sich dann per ini/toml editieren. Bis dahin ist mit engine fixes nichts weiter zu machen.
 
  • Like
Reaktionen: Kleiner Prinz
Den Wert findest du in der Enginefixes.dll

Die "Address Library for SKSE Plugins" sind bereits installiert, da sie von "Enginefixes" benötigt werden, (Requirements).

Dass der Wert (2048) in der "Enginefixes.dll" eingetragen ist, ist mir schon klar.
Nur hätte es ja sein können, dass die "dll" per "ini/toml" eine Änderung zulässt.
Dort ist aber leider nur [Patches] "MaxStdio=True/false" möglich.

So müsste man also die "Enginefixes.dll" editieren können.
Per Editor ist dies unmöglich, und hatte ich bereits versucht.
Laut Internet soll es mit "EclipseLink" möglich sein, aber damit komme ich nicht klar.

Es gibt dazu (bisher) keine Möglichkeit, diesen Wert manuell/per ini weiter zu erhöhen.
Dazu müsste man sich den Quellcode von github schnappen, die entsprechende codezeile editieren und dann die DLL neu compilieren.

Wenn ich wüsste, wie, würde ich dies machen.
Compiler finde ich dazu bei dem oben genannten "EclipseLink" !
https://www.eclipse.org/eclipselink/downloads/
Leider kenne ich mich damit zu wenig aus.

Jedenfalls scheint dies der einzige Weg zu sein, um das Problem mit den Savegames zu lösen.
 
Wie genau, weiß ich nun auch nicht, aber das hier: Klick mich
behandelt genau das Thema und liest sich so, dass es wirklich mit der nächsten Version von Engine Fixes implementiert wird. Dabei wird das Limit nicht direkt auf 8196 angehoben, sondern ist frei konfigurierbar.

Noch ein weiterer Link auf der GitHub-Seite: https://github.com/aers/EngineFixesSkyrim64/issues/24

Leider steht auf deren Seite nicht, was genau man braucht, um die .dll selbst zu compilieren, da müsste man sich dann wohl etwas tiefer mit der Materie auseinandersetzen. Also für den Fall, dass du es halt vorher selbst versuchen möchtest, bevor es den "offiziellen Weg" findet.
 
  • Like
Reaktionen: Kleiner Prinz
...dass es wirklich mit der nächsten Version von Engine Fixes implementiert wird.
Dabei wird das Limit nicht direkt auf 8196 angehoben, sondern ist frei konfigurierbar.

Das wäre ja super ! :)

Ich habe nun aber eine andere Lösung gefunden, ...hoffe ich jedenfalls ! :):):)

In der alten EngineFixes steht in der EngineFixes.ini noch folgendes:

[Experimental]
MemoryManager = false ; Disables Skyrim's memory manager in favor of standard allocation (Use OS Allocators), can help with ILS
UseTBBMalloc = false ; Uses TBBMalloc instead of standard allocators, only active if MemoryManager is true
SaveGameMaxSize = false ; Expands the maximum uncompressed size of a save game from 64 MB to 128 MB; can fix "crash on save" issue in long-runnning saves

Dort hatte ich es mal auf "true" gestellt, und es hatte nichts bewirkt. :(
Darum hatte ich in der EngineFixes.toml, der aktuellen EngineFixes nichts mehr geändert.
Dort findet man jetzt auch nur noch den Eintrag:

[Experimental]
SaveGameMaxSize = false # Expands the maximum uncompressed size of a save game from 64 MB to 128 MB# can fix "crash on save" issue in long-runnning saves

Jedenfalls bin ich jetzt doch noch mal hin, und habe diesen auf "true" gestellt.
Und zu meiner Freude, funktioniert das Laden von neuen Savegame wieder. :):):)

Ich hoffe, dass es auch dabei bleibt, sonst müsste ich mich doch mal mit dem Compilieren der "dll" auseinandersetzen.
Warum das jetzt plötzlich mit der neuen Version funktioniert, wenn man es auf "true" stellt, ist mir ein Rätsel, wenn die gleiche Änderung in der alten Version von EngineFixes nichts bewirkte. o_O:confused::)

Bis dahin also erst mal "Vielen Dank" ! :)