skyrim custommemoryblocktotalsizemb=64 [Patch] ; Info: Completely disable Skyrim's memory allocator and use regular C malloc. That means memory blocks will not exist anymore ; and game will not crash at some arbitrary limit. Theoretically it should also be faster (especially loading screens) ; and eliminate most ILS or freezing issues. ; IMPORTANT!!: You NEED custom plugin loader to run this so CrashFixPlugin.dll gets loaded before the game initializes! ; Here is the link to "SKSE Plugin Preloader": http://www.nexusmods.com/skyrim/mods/75795/? ; When this is enabled then Safety Load and SSME/SKSE memory patch are not needed, but they don't cause any trouble if you do have them. UseOSAllocators=1 ; Info: When the game crashes unexpectedly then write the relevant information from crash to Data/SKSE/Plugins/CrashLog/crash_time.txt skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; If game crashes when running out of memory or has other issues it's possible for the file to not appear or become empty! ; If the game crashes in SKSE dll or a SKSE plugin dll then it's possible for the crash information to not appear. ; This setting's value is treated as flags where: ; 1 - enabled (TL;DR set this for normal enable) ; 2 - don't write timestamp into file name but instead always write to crash_last.txt (overwritten by default) ; 4 - don't ignore already known crashes, usually ones that display a message box are ignored ; 8 - append file if it already exists instead of replacing ; 16 - when the game crashes CTD without a message box about game stopped responding RecordCrashInfo=1 skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Write messages that appear in error box also to file in "Data/SKSE/Plugins/CrashFixPluginLog.txt" LogMessageToFile=1 ; Info: Warn user on startup if ENB settings are incorrect. WarnBadENB=1 ; Info: Crash happens unknown constructor (TESObjectLAND::unk_24 object), movaps instruction is used ; but heap allocate did not allocate this object to have 16 align. Crash happens more frequently ; with high Ugrids because more cells are loaded and greater chance to misalign. ; Solution: Could align only this object or align all objects. Trying with all to see what happens since skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; same error could be elsewhere as well and I think I have seen it elsewhere. ; Result: Fixes these type of crashes. Some people report longer loading times and higher memory usage with this enabled! ; Update: Disabled by default since it's incompatible with some ENB settings, higher memory usage and longer loading times. ; It's safe and probably good to enable if you are ok with those downsides. I have not personally experienced ; any incompatibility with ENB, some people say it messes up their game that's why I wrote it here. AlignHeapAllocate=0 ; Info: Game crashes when strcmp is passed NULL char* ; Address: D573A8 ; Cause: Most frequently happens in TthkbClipGenerator::activate (0xBF2FB3), skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; tracked issue to skeleton was deleted in another thread while ; this function is attempting to use it. Have seen in other places ; too. ; Solution: Unknown. This doesn't really fix it for BF2FB3 because it just pops up in foot IK. ; If patched in foot IK it pops up in hand IK, the problem is larger than just this. ; Still enabled because it may fix crashes in other places too this is a very common function. ; There's really no reason not to have it since the game would crash certainly with this off. ; Enable one. NoTry may be slightly faster but catches less crashes. StrCmp=1 ;StrCmpNoTry=1 skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Info: Game crashes when strlen is used on NULL char* ; Address: 46EDF0 ; Cause: NiNode names are compared, one of the NiNode's name is NULL. ; Code: ; NiNode ** v72 = NiNode::children.data - this is iterated until count ; NiNode * v69 = ... ; const char * v56 = v69->name; ; if ( v56 ) ; { skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 ; const char * v57 = v72[v49]->name; // <- v57 name is not checked for NULL for some reason ? ; _strnicmp(v56, v57, strlen(v57)); <- strlen on NULL, also result is not even used anywhere! ; } ; Solution: Unknown, temporarily bypass whole strcmp since it's unused. ; Result: Seems to have stopped the crash for me. StrLen=1 ; Info: Unknown, reported as loading save game. ; Address: 8B437C - vtable seems to be 0 or wrong pointer is used. ; Solution: Skip since this is the last part of the function and already has a check anyway skyrim custommemoryblocktotalsizemb=64 How to get it? skyrim custommemoryblocktotalsizemb=64 UnkUniqueId=1 ; Info: Unknown, reported as loading save game. Possibly related to rendering. First ; argument is gNiDX9Renderer->unk_650 which is a pointer. ; Address: CEC5EC - null pointer is passed as second argument to function, this function does not expect it ; Solution: Bypass using argument if it's null. Maybe doesn't fix. Render650=1 ; Info: Unknown, no info was provided. // char __thiscall TESObjectREFR::unk_4D4EB0(TESObjectREFR *this) ; Address: 4D4EB9 - vtable of base form is 0 skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Solution: Bypass and pretend that base form is 0 since the function does this check itself already UnkObjRef4D4EB0=1 ; Info: Game is saving location's seen data to save game. The data is NULL. ; Address: 4C6031 ; Cause: Game doesn't check for null pointer ; Code: ; TESObjectCELL * v3 = ... ; v5 = BaseExtraList::GetSeenData_40D980(&v3->extraData); ; result = (void *)(*((int (__thiscall **)(_DWORD, _DWORD))*v5 + 1))(v5, v2); // <-- v5 can be null! but not checked skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; v5 is IntSeenData, size is known. ; Solution: Only solution seems to be temporarily creating an empty IntSeenData and writing this to stream instead. NullSeenData=1 ; Info: BSFixedString::Set is called with NULL argument. ; Address: A51285 ; Solution: Ignore call when NULL argument. Not really a solution :P probably better than crashing though. StringRefSetNull=1 ; Info: This crash happens because StrLen crash was prevented. skyrim custommemoryblocktotalsizemb=64 How to get it? skyrim custommemoryblocktotalsizemb=64 ; Address: 46EE1D ; Solution: Skip over it. ; Result: See StrLen. SkipStrLenCrash=1 ; Info: This crash happens because unknown reasons during loading. Something to do with behavior graph. ; One of the more common crashes I get. ; Address: C27A8F ; Solution: Don't know, trying to let game think the value is 0 and see what happens. ; Result: Haven't had this crash since. skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 bhvGraphUpdateLoad=1 ; Info: Crash happens during loading, no idea. Might be related to rendering. ; Address: D822D8 ; Solution: Tried patch something but it probably doesn't work. Unk11=1 ; Info: Incompatible skeleton, but could be something else too. ; Address: 46ECF5 - NiNode children access ; Solution: No solution from here, but since it's going to crash anyway we could at least skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 ; warn user about possible incompatible skeleton and let them fix it. Shows messagebox MissingNode=1 ; Info: Crash, it's function array and index goes out of bounds which causes it to call invalid address. ; Address: 6F3A31 ; Solution: Check index before calling. ; Result: Haven't had this crash since. IndexError1=1 ; Info: Crash happens in "MovementPlannerAgentWarp" function, unknown what it does. LookupFormById returns skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; NULL and game does not check or expect this to happen. ; Address: 76E358 ; Solution: Game has a check for if returned isn't actor it sets 0 as value, we will do same if NULL is returned. MovementPlannerAgentWarp=1 ; Info: Crash happens in DDB0A0, seems to be used in some havok animated object's vtables. ; Normally these crashes are fixed by aligning allocated memory with 16 bytes. But ; this one isn't because it can be used on static memory locations which aren't using ; Skyrim's allocator at all, this means that memory isn't guaranteed to be 16 byte aligned. ; Address: DDB0B2 skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 ; Solution: Use movups instruction instead of movaps. UnallocatedMovaps=1 ; Info: Weird crash with NULL ptr in TESWorldSpace::GetCellByCoordMask_4375D0, don't know why it happens. ; Address: 437604 ; Solution: return 0 if this crash would happen. ; Result: Haven't had this crash since, but it's rare anyway so it could be coincidence. CellNullCrash=1 ; Info: Crash when trying to do: v14 = MagicItem::unk_406C70(a3)->properties.projectile; skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; This 406C70 function is something like "GetMainMagicEffect". Sometimes though it may return ; NULL and in 90% of places the game expects this and checks for NULL result, this patch will ; fix the remaining locations. ; Address: 7E39EC, 657677, 6577D5, 65FEEC, 8127CF ; Solution: Check for NULL and skip (depends on location) if it is. GetMainMagicEffect=1 ; Info: Crash when game searches node "NPC COM [COM ]" on actor but the node was not found. This is unexpected ; for game because it uses the result without checking for NULL. This whole thing has something to do ; with mounting. The function that does this whole thing is present in "StopMountCameraHandler" and skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 ; "MountInteraction" vtable. Also it seems that this has something to do with updating position. ; More info: Was reported that this could happen if non-humanoid tries to mount a horse. This is a rather specific ; error with a mod. Instead we will show error message to user when this happens so they can ; fix or uninstall that mod. ; Address: 6E7F85 ; Solution: Check for NULL and if it is NULL then use base node of actor instead of this. It's fine because ; we only take X and Y position from it. ; Solution2: Show error message and crash after. MountNodeCrash=0 MountNodeWarn=1 skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; Info: Crash when game is trying to setup foot IK but there's a problem. Real cause is unknown but for me. ; So we will display a message box when this crash happens. Seems related to the ; StrCmp crash in BF2FB3, maybe. Try reducing the amount of installed animations. ; Address: BFECC1 ; Solution: No solution from here, display warning with helpful tips. IKCrashWarn=1 ; Info: Crash happens when rendering and saving. I think this is when it renders the save game image. ; if ( v8 ) // <- not null skyrim custommemoryblocktotalsizemb=64 How to use it? skyrim custommemoryblocktotalsizemb=64 ; { ; if ( v8 ) ; v9 = *(v8 + 8); // <- *(v8 + 8) is null ; else ; v9 = 0; ; v10 = *(v9 + 140) * *(a2 + 4) // <- crash because null ; + *(v9 + 136) * *a2 ; + *(v9 + 144) * *(a2 + 8); ; v21 = v10 - *(*(v8 + 8) + 148) * a3; ; } skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; Address: CB051A ; Solution: We will skip this if block when *(v8 + 8) is null, as if v8 was null. RenderSave=1 ; Info: Crash was reported as casting spell. Only happens sometimes. Happens in movement controller. ; Seems like vtable is NULL. ; Address: 76636B ; Solution: This happens in a for loop and it happens in if clause. We can skip if this crash would happen. MoveControllerCast=1 skyrim custommemoryblocktotalsizemb=64 How to use it? skyrim custommemoryblocktotalsizemb=64 ; Info: Crash when saving game and trying to render (possibly save game image again?). It's trying to get ; vtable of NULL pointer which will crash. ; if ((*a2 + 76)(a2, a1)) // a2 is null ; { ; *(0x1BA9344) = a1; ; *(0x1BA9340) = a2; ; } ; else ; { ; *(0x1BA9340) = 0; skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; *(0x1BA9344) = 0; ; } ; Address: CAF9F7 ; Solution: Skip function call and set return value to false so we don't have to use the NULL value. SaveRenderCrash=1 ; Info: Crash when game tries to get loaded node but it is set to NULL. Only ever seen this on two people. ; It is most likely actually related to corrupted mesh being unable to be loaded and game does not expect it. ; NiNode * node = a->GetLoadedStateNiNode(); ; v2 = node->(*(vtable+0x14))(); // <- node is NULL skyrim custommemoryblocktotalsizemb=64 How to use it? skyrim custommemoryblocktotalsizemb=64 ; if(v2) { *((int*)(v2 + 212)) = 0; } // <- we can skip this part since it has a check anyway ; Address: 4C119E ; Solution: Real solution would be to find the broken mesh and remove it. So lets notify user instead of ignoring this part. ; Enable one of the following, ignore problem and try to continue or show message box with object reference form ID and form Type. NullLoadedNodeIgnore=0 NullLoadedNodeNotify=1 ; Info: Crash in GarbageCollector::Add when actor argument's base form is NULL. Game does not check this, when in ; some other places it does check for this possibility. ; Address: 690A69 skyrim custommemoryblocktotalsizemb=64 How to get it? skyrim custommemoryblocktotalsizemb=64 NullActorBaseForm=1 ; Info: Crash when modifying actor value but the pointer is bad, possibly due to actor being invalid. This happens often ; when script engine is lagged and spells want to modify actor values a lot. ; Address: 6E07C6 AVSetCrash=1 ; Info: If your scripts use more than 65535 different strings then the save game will be corrupt and not possible to load. ; This fixes it by changing the save file format slightly if string count is higher than 65520. That means if you ; have this option enabled and your save game would have become corrupt it changes format instead and vanilla game skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; or save game tools will not be able to open it! Opposite is true as well, if the count goes below 65520 after ; and you save again then the format reverts to vanilla. ; TLDR: Fix for https://forums.nexusmods.com/index.php?/topic/3924850-corrupt-saves-strcount-0xffff-ctd-on-load/ ; Address: Around 30 different parts of code had to be patched. StringCount32=1 ; Info: Warn if SKSE memory patch is not active. This checks if default heap size is 256 or less and warns if you try to ; click New, Continue or Load in main menu. Still lets you play the game, just shows a warning. WarnSKSEMemoryPatch=1 skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Info: If AlignHeapAllocate is disabled by user then fix that one movaps crash manually. There's no downside to having this enabled. ; Address: 4BD832 FixMovApsManuallyIfAlignedAllocateIsDisabled=1 ; Info: Overwrite array allocator directly when UseOSAllocators is set to 1. Don't understand the code enough yet to ; say if it's safe or not. At this point it's just here for testing. OverwriteArrayAllocator=0 ; Info: Player's NiNode (not necessarily same as loaded node) is NULL while drawing world. ; Address: 69B84B skyrim custommemoryblocktotalsizemb=64 How to get it for free? skyrim custommemoryblocktotalsizemb=64 NullPlayerNode=1 ; Info: Function TESObjectREFR::CanBeMoved_4D9CF0 is called on an object reference that has NULL base form. This is not expected ; and will crash. We will instead return false from that function if that's the case. The problem is most likely larger than ; just this, if you prefer to crash instead disable it. ; Address: 4D9D09 NullBaseFormMove=1 ; Info: Game tries to iterate child nodes of a NiAVObject but it's possible that the target is not a NiNode and can't have child nodes. ; This ends up in a NULL pointer crash. skyrim custommemoryblocktotalsizemb=64 How to get it? skyrim custommemoryblocktotalsizemb=64 ; v26 = v22->vtable->sub_5EADD0(v22); // Returns "this" if v22 is a NiNode and returns "NULL" if not. ; for ( i = 0; i < v26->children.emptyRunStart; ++i ) // crash because v26 is NULL. ; Address: 46CA06 NullRefNode=1 ; Info: Something is done with outfit of NPC, but one or more entry is NULL and game crashes. ; Address: 561FF7 NullOutfitEntry=1 ; Info: Actor is being deleted and base form is NULL. skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Address: 6BAC9A ActorDeleteNullBase=1 ; Info: Does two things: ; 1. Tracks the last X files opened by game. ; 2. If the game crashes while reading binary data stream (e.g. NIF file but could be others too) then show message box listing ; those files. ; This can be helpful to track down a corrupted NIF file. DebugStream=1 skyrim custommemoryblocktotalsizemb=64 How to get it? skyrim custommemoryblocktotalsizemb=64 ; Info: When the game fails to create texture in memory should we display a warning and exit game? Recommended yes because you will ; see purple textures couple of seconds and then the game will crash anyway since it's not expected for this to be a NULL value. WarnTextureFailure=1 ; Info: Something is done with face gen animation on BSFaceGenNiNode but the parent node is NULL which is unexpected. ; Address: 5A8808 NullParentNode=1 ; Info: For debugging purposes, on game startup run allocator benchmark and write results to "AllocatorBenchmark.txt" in Skyrim root ; directory. This compares vanilla, aligned vanilla, malloc, aligned_malloc and custom memory block implementation. When you reach skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; main menu the game will start the test, wait for a message box to say the test is completed, then close game and disable this option. RunAllocatorBenchmark=0 ; Info: How many objects to allocate and free for each size (8, 12 and 16). CountAllocatorBenchmark=1000000 ; Info: How many times to run each test. TimesAllocatorBenchmark=2 ; Info: How many threads to run concurrently. Most accurate is only running one thread, although you can also try 2 to see the performance ; of thread-safe code. ThreadsAllocatorBenchmark=1 skyrim custommemoryblocktotalsizemb=64 PasteShr skyrim custommemoryblocktotalsizemb=64 ; Info: Enable custom block allocator for small sizes. May help with memory fragmentation problem. This option does nothing if UseOSAllocators ; is not enabled. CustomMemoryBlock=0 ; Info: Set total megabytes allocated for the custom block allocators. This amount is sensibly divided between each block. ; Has no effect if CustomMemoryBlock is not enabled. The more you allocate here the less memory you have for other stuff! CustomMemoryBlockTotalSizeMb=64 ; Info: Show usage of each memory block in per cent when you open console. Has no effect if CustomMemoryBlock is not enabled. ; This can help you tweak the CustomMemoryBlockTotalSizeMb value. skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 MemoryInfoConsole=1 ; Info: Fixes two crashes specific to Enderal mod. Seems like something to do with havok. ; Address: EBC0A6 and ECD92E EnderalSpecific=1 ; Info: Active effect list of actors is not thread safe but accessed and modified from multiple threads, this will add mutex to each actor's ; effect list. FixUnsafeEffectList=1 skyrim custommemoryblocktotalsizemb=64 How to dowload it? skyrim custommemoryblocktotalsizemb=64 ; Info: Game crashes when actor's combat style form is NULL for some reason. Warn the user and try to display the actor's reference and base ID. ; Address: 8368B1 WarnNullCombatStyle=1 ; Info: Set OS update frequency to 1 millisecond (regular is around 16) and replace GetTickCount with timeGetTime. This is for debug only! Don't use. ; May reduce performance. HighFrequencyOSTimer=0 ; Info: Make game's update timer more accurate. This is for debug only! Don't use. HighFrequencyGameTimer=0 skyrim custommemoryblocktotalsizemb=64 How to use it? skyrim custommemoryblocktotalsizemb=64 skyrim custommemoryblocktotalsizemb=64