Jump to content

Eagle114th

+CHOICE MEMBER
  • Content count

    1,026
  • Joined

  • Last visited

  • Days Won

    19

Eagle114th last won the day on August 15

Eagle114th had the most liked content!

Community Reputation

1,058 +1000 Reputation

About Eagle114th

Recent Profile Visitors

10,499 profile views
  1. Hello everyone! Sorry for being absence for almost two weeks. It have been quite hectic weeks! Real life caught me, so I had to put projects down for time being. Aat the same time, i needed a short break, a fresh breath and many ideas for bothSF - CAP and Advanced modding (DLL editing). There is one video that shocked me, let me show you: X-wing: Tie fighter, got modernized through reverse engineering, which bought improved graphic, VR suports and other amazing feats! And please note, this sim is from 1993! This shows me that it is definely possible. However, what I have realized is that, as stated, by using Ghidra to reverse engineer and looking at the pseudocodes, there is one extra challenges: As stated, the SF2 engine is natively written in C++, not C. So therefore, by editing the C Pseudocodes, we nbeed to carefully codes while remain in the loop of SF2 with the calls and imports, so it will rrun well in SF2. But atleast, C and C++ are somehwere close toe ach other. C++ is deviated from C, so we have to use extra C codes that work the same way what C++ codes intended to doin SF2. Nextw eek I am going back working on SF2 - CAP and further exploring advanced modding. I will post an additional i nforamtion on what tools I use and how I managed to extract the codes out, so you can view it and edit it as well. I use the tool known as Ghidra 11.4 and scripts to help me extracting the codes. Cheers!
  2. Hello everyone, the new version of modder resource library v1.1 is uploaded, it is posted on the 2nd post above. Eagle114th
  3. Hello my friend! Excellent questions, and this is steps I am working on: 1) Finish working on compiling the text files with list of Class and function associated with them. 2) Analyze and make the list of already available codes for full reference of usage for each tyipes of .ini for cockpits and avionics related 3) Start experimenting modifying the DLL files and see if it works on SF2. I do not have the team. I hope, eventually someone will start the team. Eagle114th
  4. HOLY MOLY!!! I made another breakthrough as I learn more about the tools with Ghidra, as well creating new script python for output (text files) What I recently used is known as RTTI, which stands for Run-Time Type Information. It helps recovering the class names, shows inheritance and virtual function tables (vtables), and making it possible to link function ack to the classes they belong to! For example, from Looks like I will be doing the same for each DLLs and will update the Modder Resource Library. This is another huge steps, which helps us big times!
  5. I have spent the week learning how to use Ghidrea, contemplating on how to find the right information, in order, to make sense out of what is shown as disassembled / decompiled functions and variables. WIth AI help, I am able to come up with an idea: 1) Find the class name that is called by associated functions 2) Find the function with associate strings for possible keywords As first step of building the modder resource library. In the link below, you will see vast number of folder with three types of .txt files: _CLASS_FUNCTION_LIST.txt _STRING_LIST - 1.txt _STRING_LIST - 2.txt And inside each folders, for example: FLIGHT -> AVIONICS 60, you will see the files: AVIONICS60_CLASS_FUNCTION_LIST.txt AVIONICS60_STRING_LIST - 1.txt AVIONICS60_STRING_LIST - 2.txt These files give modders a big head start by helping pinpoint the location of relevant functions, and that's the step one. For next steps, it is up to anyone here. I am here to provide what I can product from the ghidra tools. I will continue to update the resource library as I grow the understanding of Ghidra tools and codes shown in it. MODDER RESOURCE LIBRARY v1.1 SF2 -Resource Library v1.1.zip NOTE about v1.1: I have added two folders, you will see in each folders: REFERENCES RTTI References are the one that I used pyton script to extract the name of class called by functions, as well the strings from the functions. RTTI, in other hand, contains the list of class and the assoicated functions, along with the function names restored. However, please note that, there are two or three of DLL that does not have RTTI, I still ran the script to create the list of class with assoicated functions. Hoowever, I am working an interesting next projects: I just recently realized, after seeing how Ghidra symbolized the native C++ into C Pseudocodes and is working on Name Demangling (Converting C++ mangled symbols back to readable C++ codes). Here is an example: ?MyFunc@@YAHH@Z -> int MyFunc(int)) For now, here is notes that AI generated with me while studying various codes: (NOTE: the note below is incomplete. Will be updated eventualy.) CODES NAME DEMANGLING NOTES.txt Cheers!
  6. Welcome to the Strike Fighter 2 (SF2) Advanced Modding thread! A quick reminder: We mod ethically, honoring ThirdWire’s life passion in creating SF2. All projects here are strictly freeware, transparent, and require a legit copy of SF2 to use any modified DLL files. This thread also serve as the modder resource library that can assist us finding what we seek for advanced modding. Hello everyone! This thread is dedicated to advanced modding, focusing on DLL file editing using tools like Ghidra and other debugging/reverse engineering tools. We have the rules here: - All projects must remain freeware. Payware is a hard NO! - No links or discussion about pirated SF2, period! - We encourage everyone to share knowledge, collaborate, and keep the community spirit alive! We have the great desires to expand the engine beyond the current limitation, from custom HUDs to radar behaviors, etc... This post will be updated through time with more information. Let's have a happy modding!
  7. Hello everyone! I’ve been grinding for hours to make sense of these massive codebases, and I have an idea! I’m building a huge resource library with lists of class references and the functions handling strings. These will help us zero in on specific functions in Ghidra. Check out the examples: Avionics 60 Class List Avionics String List I’m working through each DLL, generating text files for all of them. It will take some time, but once done, I’ll start a new thread called "Advanced Modding" with the resource library. Eagle114th
  8. I recommend you starting small, like making LCOS (HUD) not going beyond ViewportTopLeft and ViewportBottomRight, or anything very simple. That way we can take notes and map the funcitons / variables and what they do. From there, we can build more information from there to do bigger things. Next week, along with you guys, I plan on exploring the Ghidra and another tools to play with the DLL files. Eagle114th
  9. Hello everyone! In discord that I am part of where we chill, talk about sims, share our modding projects, etc... In SF2 section, someone asked me good questions and I think it is good to share here too. I am going to post someone's questions and the responses / comments to it: Question #1 Response: Excellent questions! When it comes to the copyright, the serious issues would be if someone tried to sell the modified DLLs or any files related to the game engines. That is big, hard NO, period. We are ethical freeware modders. Everything we create is shared for free, and we respect TK's life work and passions of SF2. That is why we make sure that, to enjoy any of our mods, especially the modified DLLs, is that users must already own a legit, working copy of SF2. Question #2: Response: Yes, looks like it. but in limited ways. Having an access to disassembled and decompiled codes is always limiting compared to having an access to the full source codes. What I understand is that, DLL files is part of the game engine, not whole of it. While digging through the DLLs, what I realized is that, SF2 manages different aspects of the game engine through various DLLs files and they are all inter connected. So it is possible that, it is not just Campaign dll files, it is possible that we also have to look into different DLLs that manages the campaign as well. We can explore and analyze the DLLs files by using the tools like Ghidra, which is what I use. It lets you view assembly and C-style pseudocodes, along with the Python scripting. By using the scripts, you can automate the searches through public and private functions for keywords like: "Campaign" "Mission" "Waypopints" etc ... If anyone knows an alternative and great tools, especially if it have AI assistance included, that would be great too! However, the challenge is that, to modify, remove, or add the C Pseudocode requires careful coding, to ensure the computability with the original languages that DLL are written in, which I believe is C++ languages. Addiitonal comments: I want to add one more things about modifying the DLLs files: What was said, it’s true that with the disassembled and decompiled codes, we can modify, remove, and add codes to SF2 in limited ways. HOWEVER< the real there is one thing I aalso realized: There’s huge potential, and many new possibilities that can be done. The reason it appears limiting right now is because of the slow, manual process of analyzing and understanding the codes. The functions and variables we see in decompiled DLLs have generic names, for example: FUN_1001abc0 With no helpful labels, It is what makes it hard for us to understand what they actually do. BUT, with the rapid rise of AI, that’s changing right now. This is how I found the codes with key words (private functions and variables) using Ghidra. AI can now analyze large blocks of code, detect patterns, especially suggest meaningful names for unknown functions and variables. This gives us a better sense of the intentions (Purposes) of the codes. This is why I am determined to find out what we can do right now with an existing tools and various AI. Finally, from various discussion about TK situations, I would like to comment about this part too: Eagle114th
  10. Hello everyone! Recently completed the works on Columbia's Mirage 5COA / 5COAM / 5CODM, as well IAI Nesher S and T. I am currently working on IAI Kfir series, especially Yakarov79's excellent Kfir over Israel mod pack. The Kfir C.7, appear to have more advanced HUD compared to earlier series. Here is pictures of, what I believe to be IAI Kfir C.7's HUD. The picture is not exactly clear, it can't be helped. Based on the images, here is crafted optical sight and unique looking range bar: In-game screenshot of IAI Kfir C.7 cockpit and HUD Eagle114th
  11. Hello everyone! It have been quite lot of work on the Chilean Mirage 5s / Mirage 50s. I am surprised with the numerous of the customization and upgrades they have gone through. I find them most unique out of the Mirage series, besides Swiss Mirage IIIS. At the same time, going through tons of Chilean Mirage 5s / Mirage 50s download in CombatAce Download sections, there are many versions. Took me a while to go through them, clean up the files, and find the latest one. The one I am using is Dennisolveira's Chilean Mirage 5s / Mirage 50s pack. Here is screenshot of the Mirage 5MA / 5MD / 5R "Elkan" Mirage 50FC Mirage 50C and 50 CN are most intersting, they both hvae different equipment. Mirage 50C, from what I have learned, uses Agave radar. IT is quite difficult to find the pictures or diagram of the radar. so with no resources to find information on radar diagram or how they look ilke when appearing in MDF, I amusing placeholder. This is based on war thunder radar diagrams. The HUD is also based on the Dennisoliveira's Super Extendard. The HUD is also modified and upgraded to match what I found from researches. NOTE: Due to the lacks of pictures or videos of Mirage 50C's radar display as well the HUD, I amusing Super Etendard since both uses same radar. Mirage 50C Next, here is Mirage 50CN and 50 DCN Eagle114th
  12. Hello everyone! With the disassembled and decompiled codes, being revealed as of an assemble language and C pseudocode at the same time it display the functions and classes that are being functioned as intended, along with public and private variables. Please note that SF2, along with DLL files, are written in C++ languages, according to CFF explorer. However, what makes disassembled / decompiled codes challenging, unlike Source codes is that, there is no named classes, functions, and variables as the coders would do in the source codes. Therefore, we would have to study the codes to understand the targeted or intentions of the codes, based on each DLLs it is written inside. That means, by understanding what the codes does, we can theorize what each functions do. The beauty of the Ghidra is that, it allows us to rename any functions and variables, making it understandable when we look at them. At the same time, if we want to modify, remove, or add, we can only write them in C codes, while maintaining the computability with the original C++ codes of SF2 DLL files. This is another challenges. Finally, one more thing, another challenges is to find the functions that handles what we seek for, such as .lini files handling, as well SF2 engine. Because there are public and private classes / variables. So for public, they can be directly found by using search for the key words. For private functions / variables, they won't be found. So to find them, we would must manually find them. There are various ways to do it. But good news is that, with python scripts, it can automatically search for the key words for you if you can make the scripts! I was lucky enough to land the goldmine (key words of functions and variables). AI have taught me that, when looking in to DLL, start by looking at initDLL, which means initialization DLL. From there, functions can be traced toward where the specific class is likely to be found. I am studying on how to use python script to let Ghidra find for me instead, saving tons of unnecessary time consuming tasks. To conclude this post, I believe that, by finding the disassembled / decompiled is a small, yet big leaps toward modding DLL files. For now, I am taking a break from intense researches and exploring the dll files using ghidra. I still want to focus on SF - CAP (Avionics overhaul) mod projects too! So I decide to do SF - CAP for a week, then do Ghidra and DLL exploring / experimenting for a week, back and fort. What I would like to do before doing anything to the DLL Files is to extract the information from each DLL, such as avionics radar / hud / tv display, cockpit (gunsight), and other aspect of SF2 names list. That way we can have full reference list for .ini modding. Eagle114th
  13. Hello everyone! I have put togehter chains of the classes and functions from Avionics70.DLL. It have taken me a while to dig through the DLL file. WHew! ============================================================================ ------------------------------- FUN_10013f90 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013f90(void *this,void *param_1,wchar_t *param_2) { FUN_10013940(this,param_1,param_2); *(undefined ***)this = RadarTargetRangeTextClass::vftable; return (undefined4 *)this; } ============================================================================ ------------------------------- FUN_1001d750 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013940(void *this,void *param_1,wchar_t *param_2) { undefined4 uVar1; wchar_t *pwVar2; uint uVar3; int iVar4; float10 fVar5; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea16; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarTextClass::vftable; FUN_100204d0(param_1,param_2,L"Text",L"",(wchar_t *)((int)this + 0x18),0x40,0); FUN_10023470((uint *)((int)this + 0x98),param_1,param_2); local_8 = 1; *(undefined ***)this = RadarTargetTextClass::vftable; *(undefined4 *)((int)this + 0x1a4) = 0; pwVar2 = FUN_100208c0(param_1,param_2,L"TextFormat",0); *(wchar_t **)((int)this + 0x1a4) = pwVar2; FUN_100204d0(param_1,param_2,L"NoTargetText",L"",(wchar_t *)((int)this + 0xa4),0x40,0); FUN_100204d0(param_1,param_2,L"DisplayUnit",L"",local_21c,0x104,0); fVar5 = FUN_10021aa0(local_21c); *(float *)((int)this + 0x9c) = (float)((float10)1 / fVar5); *(undefined4 *)((int)this + 0xa0) = 0x3f800000; uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyTens",0); if (uVar3 == 0) { uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyHundreds",0); if (uVar3 == 0) { uVar3 = FUN_10020590(param_1,param_2,L"ShowOnlyThousands",0); if (uVar3 == 0) goto LAB_10013a9e; *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x400000; uVar1 = 0x3a83126f; } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x200000; uVar1 = 0x3c23d70a; } } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x100000; uVar1 = 0x3dcccccd; } *(undefined4 *)((int)this + 0xa0) = uVar1; LAB_10013a9e: iVar4 = FUN_1001ed70(param_1,param_2,L"ThousandsSeparator"); if (iVar4 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x800000; FUN_100204d0(param_1,param_2,L"ThousandsSeparator",L"",(wchar_t *)((int)this + 0x124),0x40,0); } ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_100135f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_100135f0(void *this,void *param_1,wchar_t *param_2) { float *pfVar1; uint uVar2; float local_c [2]; *(undefined ***)this = RadarElementClass::vftable; *(undefined4 *)((int)this + 4) = 0; pfVar1 = FUN_10021520(local_c,param_1,param_2,L"Position"); *(float *)((int)this + 8) = *pfVar1; *(float *)((int)this + 0xc) = pfVar1[1]; *(float *)((int)this + 0x10) = *pfVar1; *(float *)((int)this + 0x14) = pfVar1[1]; uVar2 = FUN_10020590(param_1,param_2,L"XOffsetTarget",0); if (uVar2 == 0) { uVar2 = FUN_10020590(param_1,param_2,L"XOffsetAzimuth",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 2; } } else { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 1; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetTarget",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x10; return (undefined4 *)this; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetRange",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x20; return (undefined4 *)this; } uVar2 = FUN_10020590(param_1,param_2,L"YOffsetElevation",0); if (uVar2 != 0) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x40; } return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10021520 ------------------------------- ---------------------------------------------------------------------------- float * __cdecl FUN_10021520(float *param_1,void *param_2,wchar_t *param_3,wchar_t *param_4) { wchar_t *pwVar1; float10 fVar2; wchar_t local_20c [260]; *param_1 = 0.0; param_1[1] = 0.0; FUN_100204d0(param_2,param_3,param_4,L"",local_20c,0x104,0); pwVar1 = _wcschr(local_20c,L','); if (pwVar1 != (wchar_t *)0x0) { *pwVar1 = L'\0'; fVar2 = (float10)FUN_1002bef0(local_20c,(int *)0x0); *param_1 = (float)fVar2; fVar2 = (float10)FUN_1002bef0(pwVar1 + 1,(int *)0x0); param_1[1] = (float)fVar2; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020590 ------------------------------- ---------------------------------------------------------------------------- uint __thiscall FUN_10020590(void *this,wchar_t *param_1,wchar_t *param_2,uint param_3) { bool bVar1; int iVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; wchar_t *pwVar4; wchar_t local_20c [260]; iVar2 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar2 != 0) { iVar2 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar3 = FUN_10020740((void *)(iVar2 + 4),param_2); if (iVar3 != 0) { iVar2 = *(int *)(*(int *)(iVar2 + 4) + 8); goto LAB_100205d4; } } iVar2 = 0; LAB_100205d4: if (iVar2 != 0) { *(undefined4 *)(iVar2 + 4) = 0; FUN_1001e680(local_20c,*(wchar_t **)(iVar2 + 8),0x104); bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x238),0); if (CONCAT31(extraout_var,bVar1) != 0) { return 1; } bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x23c),0); if (CONCAT31(extraout_var_00,bVar1) != 0) { return 0; } *(undefined4 *)(iVar2 + 4) = 1; param_3 = (uint)(*(int *)(iVar2 + 0xc) != 0); } if (*(int *)((int)this + 0x22c) != 0) { if (param_3 == 0) { pwVar4 = *(wchar_t **)((int)this + 0x23c); } else { pwVar4 = *(wchar_t **)((int)this + 0x238); } FUN_1001ff80(this,param_1,param_2,pwVar4); } return param_3; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020740 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10020740(void *this,wchar_t *param_1) { int iVar1; bool bVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; if ((0 < *(int *)((int)this + 0xc)) && (iVar3 = FUN_1001e490(param_1), iVar3 == 0)) { /* WARNING: Load size is inaccurate */ if (*this == 0) { *(undefined4 *)this = *(undefined4 *)((int)this + 4); *(undefined4 *)((int)this + 0x10) = 0; } /* WARNING: Load size is inaccurate */ iVar1 = *this; iVar3 = *(int *)((int)this + 0x10); while (iVar1 != 0) { /* WARNING: Load size is inaccurate */ if ((*(undefined4 **)(*this + 8) != (undefined4 *)0x0) && (bVar2 = FUN_1001e560((wchar_t *)**(undefined4 **)(*this + 8),param_1,0), CONCAT31(extraout_var,bVar2) != 0)) { return 1; } /* WARNING: Load size is inaccurate */ *(int *)((int)this + 0x10) = *(int *)((int)this + 0x10) + 1; iVar1 = **this; *(int *)this = iVar1; } *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)this = *(undefined4 *)((int)this + 4); if (0 < iVar3) { do { /* WARNING: Load size is inaccurate */ if ((*(undefined4 **)(*this + 8) != (undefined4 *)0x0) && (bVar2 = FUN_1001e560((wchar_t *)**(undefined4 **)(*this + 8),param_1,0), CONCAT31(extraout_var_00,bVar2) != 0)) { return 1; } /* WARNING: Load size is inaccurate */ *(int *)((int)this + 0x10) = *(int *)((int)this + 0x10) + 1; *(undefined4 *)this = **this; } while (*(int *)((int)this + 0x10) < iVar3); } *(undefined4 *)this = 0; *(undefined4 *)((int)this + 0x10) = 0xffffffff; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e490 ------------------------------- ---------------------------------------------------------------------------- undefined4 __cdecl FUN_1001e490(short *param_1) { if ((param_1 != (short *)0x0) && (*param_1 != 0)) { return 0; } return 1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e560 ------------------------------- ---------------------------------------------------------------------------- bool __cdecl FUN_1001e560(wchar_t *param_1,wchar_t *param_2,int param_3) { wchar_t wVar1; bool bVar2; int iVar3; bool bVar4; if ((param_1 == (wchar_t *)0x0) || (*param_1 == L'\0')) { bVar4 = true; } else { bVar4 = false; } if ((param_2 == (wchar_t *)0x0) || (*param_2 == L'\0')) { bVar2 = true; } else { bVar2 = false; } if (bVar4) { if (bVar2) { return true; } } else if (!bVar2) { if (param_3 == 0) { iVar3 = __wcsicmp(param_1,param_2); return (bool)('\x01' - (iVar3 != 0)); } while( true ) { wVar1 = *param_1; bVar4 = (ushort)wVar1 < (ushort)*param_2; if (wVar1 != *param_2) break; if (wVar1 == L'\0') { return true; } wVar1 = param_1[1]; bVar4 = (ushort)wVar1 < (ushort)param_2[1]; if (wVar1 != param_2[1]) break; param_1 = param_1 + 2; param_2 = param_2 + 2; if (wVar1 == L'\0') { return true; } } return 1 - bVar4 == (uint)(bVar4 != 0); } return false; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e680 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_1001e680(wchar_t *param_1,wchar_t *param_2,rsize_t param_3) { if (param_1 != (wchar_t *)0x0) { if ((param_2 != (wchar_t *)0x0) && (*param_2 != L'\0')) { _wcsncpy_s(param_1,param_3,param_2,0xffffffff); param_1[param_3 - 1] = L'\0'; return param_1; } *param_1 = L'\0'; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ff80 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001ff80(void *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3) { int iVar1; int iVar2; wint_t *pwVar3; void *this_00; undefined4 *puVar4; undefined4 uVar5; wchar_t *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ee1d; local_10 = ExceptionList; local_14 = *(wchar_t **)((int)this + 0x234); ExceptionList = &local_10; iVar1 = FUN_1001e490(param_3); if (iVar1 == 0) { iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_3); if (iVar1 == 0) goto LAB_100200a9; local_14 = (wchar_t *)FUN_10025790((int)this + 0x21c); } iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 0; *(wchar_t **)(iVar1 + 8) = local_14; ExceptionList = local_10; return 1; } } iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_2); if (iVar1 != 0) { pwVar3 = (wint_t *)FUN_10025790((int)this + 0x21c); this_00 = (void *)FUN_1001ddc0(0x14); local_8 = 0; if (this_00 == (void *)0x0) { puVar4 = (undefined4 *)0x0; } else { puVar4 = FUN_1001e9a0(this_00,pwVar3,local_14); } local_8 = 0xffffffff; uVar5 = FUN_1001f5f0(this,param_1,puVar4); ExceptionList = local_10; return uVar5; } LAB_100200a9: FUN_1001df00(); ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_10025810 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10025810(void *this,wchar_t *param_1) { rsize_t _SizeInWords; wchar_t wVar1; wchar_t *pwVar2; pwVar2 = param_1; do { wVar1 = *pwVar2; pwVar2 = pwVar2 + 1; } while (wVar1 != L'\0'); _SizeInWords = ((int)pwVar2 - (int)(param_1 + 1) >> 1) + 1; pwVar2 = *(wchar_t **)((int)this + 4); /* WARNING: Load size is inaccurate */ if ((int)(((int)pwVar2 - *this >> 1) + _SizeInWords) <= *(int *)((int)this + 0xc)) { *(wchar_t **)((int)this + 8) = pwVar2; _wcscpy_s(pwVar2,_SizeInWords,param_1); *(int *)((int)this + 4) = *(int *)((int)this + 4) + _SizeInWords * 2; return 1; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_10025790 ------------------------------- ---------------------------------------------------------------------------- undefined4 __fastcall FUN_10025790(int param_1) { return *(undefined4 *)(param_1 + 8); } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ddc0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001ddc0(size_t param_1) { if (DAT_1005b548 != (undefined4 *)0x0) { (**(code **)*DAT_1005b548)(param_1,0,0,DAT_1005b524); return; } _malloc(param_1); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e9a0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_1001e9a0(void *this,wint_t *param_1,wchar_t *param_2) { int iVar1; long lVar2; float10 fVar3; *(wint_t **)this = param_1; *(undefined4 *)((int)this + 4) = 0; FUN_1001e8f0(param_1); iVar1 = FUN_1001e490(param_2); if (iVar1 == 0) { *(wchar_t **)((int)this + 8) = param_2; lVar2 = __wtol(param_2); *(long *)((int)this + 0xc) = lVar2; fVar3 = (float10)FUN_1002bef0(param_2,(int *)0x0); *(float *)((int)this + 0x10) = (float)fVar3; FUN_1001e8f0(*(wint_t **)((int)this + 8)); return (undefined4 *)this; } *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)((int)this + 8) = 0; *(undefined4 *)((int)this + 0xc) = 0; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e8f0 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e8f0(wint_t *param_1) { if ((param_1 != (wint_t *)0x0) && (*param_1 != 0)) { FUN_1001e820(param_1); FUN_1001e890(param_1); } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e820 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e820(wint_t *param_1) { wint_t wVar1; int iVar2; wint_t *pwVar3; _locale_t unaff_ESI; wint_t *pwVar4; if ((param_1 == (wint_t *)0x0) || (pwVar4 = param_1, *param_1 == 0)) { return param_1; } do { iVar2 = FID_conflict:__iswspace_l(*pwVar4,unaff_ESI); if (iVar2 == 0) break; pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); if (pwVar4 != param_1) { pwVar3 = param_1; do { wVar1 = *pwVar3; pwVar3 = pwVar3 + 1; } while (wVar1 != 0); iVar2 = (((int)pwVar3 - (int)(param_1 + 1) >> 1) - ((int)pwVar4 - (int)param_1 >> 1)) + 1; pwVar3 = param_1; if (0 < iVar2) { do { *pwVar3 = *(wint_t *)(((int)pwVar4 - (int)param_1) + (int)pwVar3); pwVar3 = pwVar3 + 1; iVar2 = iVar2 + -1; } while (iVar2 != 0); } } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e890 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e890(wint_t *param_1) { int iVar1; wint_t *pwVar2; _locale_t unaff_ESI; wint_t *pwVar3; if ((param_1 != (wint_t *)0x0) && (*param_1 != 0)) { pwVar2 = (wint_t *)0x0; pwVar3 = param_1; if (*param_1 != 0) { do { iVar1 = FID_conflict:__iswspace_l(*pwVar3,unaff_ESI); if (iVar1 == 0) { pwVar2 = pwVar3; } pwVar3 = pwVar3 + 1; } while (*pwVar3 != 0); if (pwVar2 != (wint_t *)0x0) { pwVar2[1] = 0; return param_1; } } *param_1 = 0; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002bef0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1002bef0(wchar_t *param_1,int *param_2) { FUN_1002bde8(param_1,param_2,(localeinfo_struct *)0x0); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002bde8 ------------------------------- ---------------------------------------------------------------------------- /* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ void __cdecl FUN_1002bde8(wchar_t *param_1,int *param_2,localeinfo_struct *param_3) { wchar_t _C; uint uVar1; int *piVar2; int iVar3; FLT p_Var4; wchar_t *_Str; localeinfo_struct local_38; int local_30; char local_2c; double local_28; _flt local_20; uint local_8; local_8 = DAT_10057e04 ^ (uint)&stack0xfffffffc; _LocaleUpdate::_LocaleUpdate((_LocaleUpdate *)&local_38,param_3); if (param_2 != (int *)0x0) { *param_2 = (int)param_1; } if (param_1 == (wchar_t *)0x0) { piVar2 = __errno(); *piVar2 = 0x16; FUN_1002fef0(); if (local_2c != '\0') { *(uint *)(local_30 + 0x70) = *(uint *)(local_30 + 0x70) & 0xfffffffd; } goto LAB_1002bee1; } _C = *param_1; _Str = param_1; while (iVar3 = _iswctype(_C,8), iVar3 != 0) { _Str = _Str + 1; _C = *_Str; } p_Var4 = __wfltin2(&local_20,_Str,&local_38); if (param_2 != (int *)0x0) { *param_2 = (int)(_Str + p_Var4->nbytes); } uVar1 = p_Var4->flags; if ((uVar1 & 0x240) == 0) { if ((uVar1 & 0x81) == 0) { if (((uVar1 & 0x100) == 0) || (local_28 = 0.0, NAN(p_Var4->dval) == (p_Var4->dval == 0.0))) { local_28 = p_Var4->dval; goto LAB_1002bed1; } } else { local_28 = _DAT_100585d0; if (*_Str == L'-') { local_28 = -_DAT_100585d0; } } piVar2 = __errno(); *piVar2 = 0x22; } else { local_28 = 0.0; if (param_2 != (int *)0x0) { *param_2 = (int)param_1; } } LAB_1002bed1: if (local_2c != '\0') { *(uint *)(local_30 + 0x70) = *(uint *)(local_30 + 0x70) & 0xfffffffd; } LAB_1002bee1: @__security_check_cookie@4(local_8 ^ (uint)&stack0xfffffffc); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002fef0 ------------------------------- ---------------------------------------------------------------------------- void FUN_1002fef0(void) { __invalid_parameter((wchar_t *)0x0,(wchar_t *)0x0,(wchar_t *)0x0,0,0); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f5f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001f5f0(void *this,wchar_t *param_1,undefined4 *param_2) { int *this_00; int iVar1; undefined4 uVar2; void *this_01; undefined4 *puVar3; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ed6a; local_10 = ExceptionList; if (param_2 != (undefined4 *)0x0) { this_00 = (int *)((int)this + 0x208); ExceptionList = &local_10; iVar1 = FUN_10020740(this_00,param_1); if (iVar1 == 0) { iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_1); if (iVar1 == 0) { FUN_1001df00(); ExceptionList = local_10; return 0; } uVar2 = FUN_10025790((int)this + 0x21c); this_01 = (void *)FUN_1001ddc0(0x18); local_8 = 0; if (this_01 == (void *)0x0) { puVar3 = (undefined4 *)0x0; } else { puVar3 = FUN_1001f4f0(this_01,uVar2); } local_8 = 0xffffffff; iVar1 = FUN_10020860(this_00,puVar3); if (iVar1 == 0) { FUN_1001df00(); if (puVar3 == (undefined4 *)0x0) { ExceptionList = local_10; return 0; } FUN_1001f550(puVar3); FUN_1001de20(puVar3); } } else { puVar3 = *(undefined4 **)(*this_00 + 8); } if (puVar3 != (undefined4 *)0x0) { iVar1 = FUN_10020740(puVar3 + 1,(wchar_t *)*param_2); if (iVar1 == 0) { FUN_10020860(puVar3 + 1,param_2); } ExceptionList = local_10; return 1; } } ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f4f0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_1001f4f0(void *this,undefined4 param_1) { void *local_10; undefined *puStack_c; undefined4 local_8; puStack_c = &LAB_1003ed40; local_10 = ExceptionList; ExceptionList = &local_10; *(int *)((int)this + 4) = 0; *(undefined4 *)((int)this + 8) = 0; *(undefined4 *)((int)this + 0xc) = 0; *(undefined4 *)((int)this + 0x10) = 0; *(undefined4 *)((int)this + 0x14) = 0xffffffff; local_8 = 0; *(undefined4 *)this = param_1; FUN_10018c50((int *)((int)this + 4)); ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10018c50 ------------------------------- ---------------------------------------------------------------------------- void __fastcall FUN_10018c50(int *param_1) { int *piVar1; int *piVar2; int iVar3; *param_1 = param_1[1]; if (param_1[1] == 0) { param_1[4] = -1; return; } do { piVar1 = (int *)*param_1; if (piVar1 == (int *)param_1[1]) { param_1[1] = *piVar1; } else { *(int *)piVar1[1] = *piVar1; } piVar2 = (int *)*param_1; if (piVar2 == (int *)param_1[2]) { iVar3 = piVar2[1]; param_1[4] = param_1[4] + -1; param_1[2] = iVar3; } else { *(int *)(*piVar2 + 4) = piVar2[1]; iVar3 = *(int *)*param_1; } *param_1 = iVar3; if (piVar1 != (int *)0x0) { FUN_1001de20(piVar1); param_1[3] = param_1[3] + -1; } } while (*param_1 != 0); param_1[4] = -1; return; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020860 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_10020860(void *this,undefined4 param_1) { undefined4 *puVar1; puVar1 = (undefined4 *)FUN_1001ddc0(0xc); if (puVar1 != (undefined4 *)0x0) { *puVar1 = 0; puVar1[1] = 0; puVar1[2] = param_1; *(int *)((int)this + 0xc) = *(int *)((int)this + 0xc) + 1; if (*(int *)((int)this + 4) == 0) { *(undefined4 **)((int)this + 4) = puVar1; } else { **(undefined4 **)((int)this + 8) = puVar1; puVar1[1] = *(undefined4 *)((int)this + 8); } *(undefined4 **)((int)this + 8) = puVar1; *(undefined4 **)this = puVar1; *(int *)((int)this + 0x10) = *(int *)((int)this + 0xc) + -1; return 1; } return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001f550 ------------------------------- ---------------------------------------------------------------------------- void __fastcall FUN_1001f550(undefined4 *param_1) { undefined4 uVar1; int iVar2; void *local_10; undefined *puStack_c; undefined4 local_8; local_10 = ExceptionList; puStack_c = &LAB_1003ed55; ExceptionList = &local_10; param_1[1] = param_1[2]; param_1[5] = (param_1[2] != 0) - 1; iVar2 = param_1[1]; local_8 = 0; while (iVar2 != 0) { if (*(int *)(param_1[1] + 8) != 0) { FUN_1001de20(*(int *)(param_1[1] + 8)); } if ((undefined4 *)param_1[1] != (undefined4 *)0x0) { uVar1 = *(undefined4 *)param_1[1]; param_1[5] = param_1[5] + 1; param_1[1] = uVar1; } iVar2 = param_1[1]; } FUN_10018c50(param_1 + 1); *param_1 = 0; local_8 = 0xffffffff; FUN_10018c50(param_1 + 1); ExceptionList = local_10; return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001de20 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001de20(undefined4 param_1) { if (DAT_1005b548 != (int *)0x0) { (**(code **)(*DAT_1005b548 + 4))(param_1); } return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001df00 ------------------------------- ---------------------------------------------------------------------------- void FUN_1001df00(void) { return; } ---------------------------------------------------------------------------- ------------------------------- FUN_100204d0 ------------------------------- ---------------------------------------------------------------------------- void __thiscall FUN_100204d0(void *this,wchar_t *param_1,wchar_t *param_2,wchar_t *param_3,wchar_t *param_4, rsize_t param_5,int param_6) { int iVar1; int iVar2; iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if (iVar2 != 0) { iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8); goto LAB_1002050e; } } iVar1 = 0; LAB_1002050e: if (param_4 != (wchar_t *)0x0) { if (iVar1 == 0) { if (*(int *)((int)this + 0x22c) != 0) { FUN_1001ff80(this,param_1,param_2,param_3); } FUN_1001e680(param_4,param_3,param_5); } else { *(undefined4 *)(iVar1 + 4) = 0; FUN_1001e680(param_4,*(wchar_t **)(iVar1 + 8),param_5); if (param_6 == 1) { FUN_1001e750((wint_t *)param_4); return; } if (param_6 == 2) { FUN_1001e7c0((wint_t *)param_4); return; } } } return; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e750 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e750(wint_t *param_1) { byte bVar1; wint_t wVar2; int iVar3; _locale_t unaff_ESI; wint_t *pwVar4; if ((param_1 != (wint_t *)0x0) && (pwVar4 = param_1, *param_1 != 0)) { do { iVar3 = FID_conflict:_iswlower(*pwVar4,unaff_ESI); if (iVar3 == 0) { bVar1 = *(byte *)pwVar4; if (((0xdf < bVar1) && (bVar1 < 0xf7)) || ((0xf7 < bVar1 && (bVar1 < 0xfe)))) { *pwVar4 = *pwVar4 - 0x20; } } else { wVar2 = _towupper(*pwVar4); *pwVar4 = wVar2; } pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); return param_1; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e7c0 ------------------------------- ---------------------------------------------------------------------------- wint_t * __cdecl FUN_1001e7c0(wint_t *param_1) { byte bVar1; wint_t wVar2; int iVar3; wint_t *pwVar4; if ((param_1 != (wint_t *)0x0) && (pwVar4 = param_1, *param_1 != 0)) { do { iVar3 = FID_conflict:__iswupper_l(*pwVar4); if (iVar3 == 0) { bVar1 = *(byte *)pwVar4; if (((0xbf < bVar1) && (bVar1 < 0xd7)) || ((0xd7 < bVar1 && (bVar1 < 0xde)))) { *pwVar4 = *pwVar4 + 0x20; } } else { wVar2 = _towlower(*pwVar4); *pwVar4 = wVar2; } pwVar4 = pwVar4 + 1; } while (*pwVar4 != 0); return param_1; } return param_1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10023470 ------------------------------- ---------------------------------------------------------------------------- undefined4 __cdecl FUN_10023470(uint *param_1,void *param_2,wchar_t *param_3) { bool bVar1; int iVar2; undefined3 extraout_var; uint uVar3; undefined3 extraout_var_00; undefined3 extraout_var_01; undefined3 extraout_var_02; wchar_t local_20c [260]; *param_1 = 0; FUN_100204d0(param_2,param_3,L"HorizontalAlignment",L"",local_20c,0x104,0); iVar2 = FUN_1001e490(local_20c); if (iVar2 == 0) { bVar1 = FUN_1001e560(local_20c,L"CENTER",0); if (CONCAT31(extraout_var,bVar1) == 0) { bVar1 = FUN_1001e560(local_20c,L"RIGHT",0); uVar3 = 4; if (CONCAT31(extraout_var_00,bVar1) == 0) goto LAB_100234fd; } else { uVar3 = 1; } } else { LAB_100234fd: uVar3 = 2; } *param_1 = *param_1 | uVar3; FUN_100204d0(param_2,param_3,L"VerticalAlignment",L"",local_20c,0x104,0); iVar2 = FUN_1001e490(local_20c); if (iVar2 == 0) { bVar1 = FUN_1001e560(local_20c,L"CENTER",0); if (CONCAT31(extraout_var_01,bVar1) != 0) { *param_1 = *param_1 | 0x10; return 1; } bVar1 = FUN_1001e560(local_20c,L"BOTTOM",0); uVar3 = 0x40; if (CONCAT31(extraout_var_02,bVar1) != 0) goto LAB_10023587; } uVar3 = 0x20; LAB_10023587: *param_1 = *param_1 | uVar3; return 1; } ---------------------------------------------------------------------------- ------------------------------- FUN_100208c0 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_100208c0(void *param_1,wchar_t *param_2,wchar_t *param_3,int param_4) { int iVar1; wchar_t *pwVar2; wchar_t local_20c [260]; FUN_100204d0(param_1,param_2,param_3,L"",local_20c,0x104,0); iVar1 = FUN_1001e490(local_20c); if (iVar1 != 0) { return (wchar_t *)0x0; } if (param_4 == 1) { FUN_1001e750((wint_t *)local_20c); pwVar2 = FUN_1001e4d0(local_20c); return pwVar2; } if (param_4 == 2) { FUN_1001e7c0((wint_t *)local_20c); } pwVar2 = FUN_1001e4d0(local_20c); return pwVar2; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001e4d0 ------------------------------- ---------------------------------------------------------------------------- wchar_t * __cdecl FUN_1001e4d0(wchar_t *param_1) { rsize_t _SizeInWords; wchar_t wVar1; wchar_t *pwVar2; pwVar2 = (wchar_t *)0x0; if (param_1 != (wchar_t *)0x0) { if (*param_1 == L'\0') { pwVar2 = (wchar_t *)FUN_1001dcd0(2); if (pwVar2 != (wchar_t *)0x0) { *pwVar2 = L'\0'; return pwVar2; } } else { pwVar2 = param_1; do { wVar1 = *pwVar2; pwVar2 = pwVar2 + 1; } while (wVar1 != L'\0'); _SizeInWords = ((int)pwVar2 - (int)(param_1 + 1) >> 1) + 1; if (pwVar2 != (wchar_t *)0x0) { _wcscpy_s(pwVar2,_SizeInWords,param_1); } } } return pwVar2; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001dcd0 ------------------------------- ---------------------------------------------------------------------------- void __cdecl FUN_1001dcd0(undefined4 param_1) { (**(code **)*DAT_1005b548)(param_1,0,0,DAT_1005b524); return; } ---------------------------------------------------------------------------- ------------------------------- FUN_10021aa0 ------------------------------- ---------------------------------------------------------------------------- float10 __cdecl FUN_10021aa0(wchar_t *param_1) { bool bVar1; int iVar2; undefined3 extraout_var; wchar_t *pwVar3; float *pfVar4; float10 fVar5; iVar2 = FUN_1001e490(param_1); if (iVar2 == 0) { pfVar4 = (float *)&DAT_100579a0; iVar2 = FUN_1001e490(u_FEET_100579a4); if (iVar2 == 0) { pwVar3 = u_FEET_100579a4; do { bVar1 = FUN_1001e560(pwVar3,param_1,0); if (CONCAT31(extraout_var,bVar1) != 0) { return (float10)*pfVar4; } pwVar3 = pwVar3 + 10; pfVar4 = pfVar4 + 5; iVar2 = FUN_1001e490(pwVar3); } while (iVar2 == 0); } fVar5 = (float10)FUN_1002bef0(param_1,(int *)0x0); fVar5 = (float10)(float)fVar5; if ((NAN((float10)0) || NAN(fVar5)) == ((float10)0 == fVar5)) { return fVar5; } } return (float10)1; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020590 ------------------------------- ---------------------------------------------------------------------------- uint __thiscall FUN_10020590(void *this,wchar_t *param_1,wchar_t *param_2,uint param_3) { bool bVar1; int iVar2; int iVar3; undefined3 extraout_var; undefined3 extraout_var_00; wchar_t *pwVar4; wchar_t local_20c [260]; iVar2 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar2 != 0) { iVar2 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar3 = FUN_10020740((void *)(iVar2 + 4),param_2); if (iVar3 != 0) { iVar2 = *(int *)(*(int *)(iVar2 + 4) + 8); goto LAB_100205d4; } } iVar2 = 0; LAB_100205d4: if (iVar2 != 0) { *(undefined4 *)(iVar2 + 4) = 0; FUN_1001e680(local_20c,*(wchar_t **)(iVar2 + 8),0x104); bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x238),0); if (CONCAT31(extraout_var,bVar1) != 0) { return 1; } bVar1 = FUN_1001e560(local_20c,*(wchar_t **)((int)this + 0x23c),0); if (CONCAT31(extraout_var_00,bVar1) != 0) { return 0; } *(undefined4 *)(iVar2 + 4) = 1; param_3 = (uint)(*(int *)(iVar2 + 0xc) != 0); } if (*(int *)((int)this + 0x22c) != 0) { if (param_3 == 0) { pwVar4 = *(wchar_t **)((int)this + 0x23c); } else { pwVar4 = *(wchar_t **)((int)this + 0x238); } FUN_1001ff80(this,param_1,param_2,pwVar4); } return param_3; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001ed70 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001ed70(void *this,wchar_t *param_1,wchar_t *param_2) { int iVar1; undefined4 uVar2; iVar1 = FUN_10020740((int *)((int)this + 0x208),param_1); if (iVar1 != 0) { uVar2 = FUN_10020740((void *)(*(int *)(*(int *)((int)this + 0x208) + 8) + 4),param_2); return uVar2; } return 0; } ============================================================================ ------------------------------- FUN_10013b50 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013b50(void *this,void *param_1,wchar_t *param_2) { float10 fVar1; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea3a; local_10 = ExceptionList; ExceptionList = &local_10; FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarHorizonClass::vftable; local_8 = 0; fVar1 = FUN_10020450(param_1,param_2,L"ElevationScale",*(float *)(DAT_10059e28 + 0x50)); *(float *)((int)this + 0x24) = 1.0 / (float)(fVar1 * (float10)0.01745329238474369); ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUNCTION ------------------------------- ---------------------------------------------------------------------------- FUN_100136d0 FUN_10020450 ============================================================================ ------------------------------- FUN_10013bd0 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013bd0(void *this,void *param_1,wchar_t *param_2) { float fVar1; float10 fVar2; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea4c; local_10 = ExceptionList; ExceptionList = &local_10; FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarElevationClass::vftable; local_8 = 0; fVar2 = FUN_10020450(param_1,param_2,L"ElevationScale",*(float *)(DAT_10059e28 + 0x50)); fVar1 = 1.0 / (float)(fVar2 * (float10)0.01745329238474369); *(float *)((int)this + 0x24) = fVar1; *(float *)(DAT_10059e28 + 0x50) = fVar1; ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_100136d0 ------------------------------- ---------------------------------------------------------------------------- undefined4 * __thiscall FUN_100136d0(void *this,void *param_1,wchar_t *param_2) { float fVar1; int iVar2; undefined4 uVar3; float10 fVar4; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003e9d8; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarImageClass::vftable; *(undefined4 *)((int)this + 0x18) = 0xffffffff; fVar4 = FUN_10020450(param_1,param_2,L"ImageSize",0.0); fVar1 = (float)fVar4; *(float *)((int)this + 0x1c) = fVar1; *(undefined4 *)((int)this + 0x20) = 0; if (0.0 < fVar1 != NAN(fVar1)) { FUN_100204d0(param_1,param_2,L"TextureName",L"",local_21c,0x104,0); iVar2 = FUN_1001e490(local_21c); if (iVar2 == 0) { uVar3 = (**(code **)(*DAT_10059068 + 0x7c))(local_21c,1,1,0); *(undefined4 *)((int)this + 0x18) = uVar3; } iVar2 = FUN_1001ed70(param_1,param_2,L"RotationAngle"); if (iVar2 != 0) { fVar4 = FUN_10020450(param_1,param_2,L"RotationAngle",0.0); *(float *)((int)this + 0x20) = (float)fVar4; if (1.1920929e-07 < ABS((float)fVar4)) { *(uint *)((int)this + 4) = *(uint *)((int)this + 4) | 0x10000; ExceptionList = local_10; return (undefined4 *)this; } } } ExceptionList = local_10; return (undefined4 *)this; } ---------------------------------------------------------------------------- ------------------------------- FUN_10020450 ------------------------------- ---------------------------------------------------------------------------- float10 __thiscall FUN_10020450(void *param_1,wchar_t *param_2,wchar_t *param_3,float param_4) { int iVar1; int iVar2; iVar1 = FUN_10020740((void *)((int)param_1 + 0x208),param_2); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)param_1 + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_3); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 2; return (float10)*(float *)(iVar1 + 0x10); } } if (*(int *)((int)param_1 + 0x22c) != 0) { FUN_1001fe50(param_1,param_2,param_3,param_4); } return (float10)param_4; } ---------------------------------------------------------------------------- ------------------------------- FUN_1001fe50 ------------------------------- ---------------------------------------------------------------------------- undefined4 __thiscall FUN_1001fe50(void *this,wchar_t *param_1,wchar_t *param_2,undefined4 param_3) { int iVar1; int iVar2; wint_t *pwVar3; undefined4 *puVar4; undefined4 uVar5; undefined4 extraout_ECX; undefined4 extraout_EDX; float10 extraout_ST0; ulonglong uVar6; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ee08; local_10 = ExceptionList; ExceptionList = &local_10; iVar1 = FUN_10020740((void *)((int)this + 0x208),param_1); if (iVar1 != 0) { iVar1 = *(int *)(*(int *)((int)this + 0x208) + 8); iVar2 = FUN_10020740((void *)(iVar1 + 4),param_2); if ((iVar2 != 0) && (iVar1 = *(int *)(*(int *)(iVar1 + 4) + 8), iVar1 != 0)) { *(undefined4 *)(iVar1 + 4) = 2; *(undefined4 *)(iVar1 + 0x10) = param_3; ExceptionList = local_10; return 1; } } iVar1 = FUN_10025810((void *)((int)this + 0x21c),param_2); if (iVar1 != 0) { pwVar3 = (wint_t *)FUN_10025790((int)this + 0x21c); puVar4 = (undefined4 *)FUN_1001ddc0(0x14); local_8 = 0; if (puVar4 == (undefined4 *)0x0) { puVar4 = (undefined4 *)0x0; } else { *puVar4 = pwVar3; puVar4[1] = 2; FUN_1001e8f0(pwVar3); puVar4[2] = 0; uVar6 = FUN_1002a7b0(extraout_ECX,extraout_EDX); puVar4[4] = (float)extraout_ST0; puVar4[3] = (int)uVar6; } local_8 = 0xffffffff; uVar5 = FUN_1001f5f0(this,param_1,puVar4); ExceptionList = local_10; return uVar5; } FUN_1001df00(); ExceptionList = local_10; return 0; } ---------------------------------------------------------------------------- ------------------------------- FUN_1002a7b0 ------------------------------- ---------------------------------------------------------------------------- ulonglong __fastcall FUN_1002a7b0(undefined4 param_1,undefined4 param_2) { ulonglong uVar1; uint uVar2; float fVar3; float10 in_ST0; uint local_20; float fStack_1c; if (DAT_1005d4f4 == 0) { uVar1 = (ulonglong)ROUND(in_ST0); local_20 = (uint)uVar1; fStack_1c = (float)(uVar1 >> 0x20); fVar3 = (float)in_ST0; if ((local_20 != 0) || (fVar3 = fStack_1c, (uVar1 & 0x7fffffff00000000) != 0)) { if ((int)fVar3 < 0) { uVar1 = uVar1 + (0x80000000 < (uint)-(float)(in_ST0 - (float10)(longlong)uVar1)); } else { uVar2 = (uint)(0x80000000 < (uint)(float)(in_ST0 - (float10)(longlong)uVar1)); uVar1 = CONCAT44((int)fStack_1c - (uint)(local_20 < uVar2),local_20 - uVar2); } } return uVar1; } return CONCAT44(param_2,(int)in_ST0); } ============================================================================ ------------------------------- FUN_10013c60 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013c60(void *this,void *param_1,wchar_t *param_2) { FUN_100136d0(this,param_1,param_2); *(undefined ***)this = RadarAzimuthClass::vftable; *(uint *)((int)this + 4) = *(uint *)((int)this + 4) & 0xfffffffe | 2; return (undefined4 *)this; } ============================================================================ ------------------------------- FUN_10013c90 ------------------------------- ============================================================================ undefined4 * __thiscall FUN_10013c90(void *this,void *param_1,wchar_t *param_2) { float10 fVar1; wchar_t local_21c [260]; void *local_14; void *local_10; undefined *puStack_c; undefined4 local_8; local_8 = 0xffffffff; puStack_c = &LAB_1003ea66; local_10 = ExceptionList; ExceptionList = &local_10; local_14 = this; FUN_100135f0(this,param_1,param_2); local_8 = 0; *(undefined ***)this = RadarTextClass::vftable; FUN_100204d0(param_1,param_2,L"Text",L"",(wchar_t *)((int)this + 0x18),0x40,0); FUN_10023470((uint *)((int)this + 0x98),param_1,param_2); local_8 = 1; *(undefined ***)this = RadarRangeScaleClass::vftable; FUN_100204d0(param_1,param_2,L"DisplayUnit",L"",local_21c,0x104,0); fVar1 = FUN_10021aa0(local_21c); *(float *)((int)this + 0x9c) = (float)((float10)1 / fVar1); ExceptionList = local_10; return (undefined4 *)this; } ===================================================================== ===================================================================== ------------------------------- NOTES ------------------------------- ===================================================================== ===================================================================== | -------------------- | ----------------------------------------------------------------------- | | **Function** | **What It Creates / Does** | | -------------------- | ----------------------------------------------------------------------- | | `FUN_10013bd0` | Creates **RadarElevationClass** → handles elevation bar drawing | | `FUN_10013f90` | Creates **RadarTargetRangeTextClass** → handles range text like “10 nm” | | `FUN_10013940` | Initializes **RadarTextClass**, then upgrades to `RadarTargetTextClass` | | `FUN_100136d0` | Base class initializer for visual radar components | | `FUN_10020450`, etc. | Load values from INI → `[RadarDisplay]`, `[AvionicsData]`, etc. | | `DAT_10059e28` | Likely a **central render config structure** used across radar visuals |
  14. Hello everyone! I am currenlty digging through Avionics70.DLL and found some of goldenmine. It turns out that Avionics70.DLL is class based, rather than function when handling the avionics. It makes sense, consdieirng how Avionics70.DLL ini works differenlty from Avionics60.DLL. Here is what I found so far: Eagle114th
  15. HOLY MOLY!!!!!!!!!!!!!!!!!!! I found the goldmine, the pieces of the disassembled codess! I was looking into this function: FUN_10013dc0(0x10057620); Then i notice the address 0x10057620, so I went into that, then I landed in the goldmine! I found a large block of codes that handles the .ini, here is the codes:
×

Important Information

By using this site, you agree to our Terms of Use, Privacy Policy, and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..