Jump to content

Eagle114th

+MODDER
  • Posts

    1,063
  • Joined

  • Last visited

  • Days Won

    23

Everything posted by Eagle114th

  1. Hello @pvince and everyone, I have finally got to complete digging the possible sections and keys, along with assoicaated keys from Avionics60.DLL. WShat is included inthe AVIONICS 60.zip (4 Folders): RTTI - CLASS + FUNC LIST RTTI - DUMP RTTI - STRING LIST SF2 INI MODDING NOTES The recent HUD.txt and other .txt posted above are insdie SF2 INI MODDING NOTES too. however, you will see files: This time, they are labelled whichi DLL file they are from, to avoid the confusion when dealing with various .txt files. The next thing I want to note: AIs, no matter how advacned they are, they are still prone to make mistakes from tim eto time, which can't be helped. That is why the DUMP file come sin handy, as well RTTI String and class / fucntion list, so you can check it. And not everything come in string, sometime the class calls another calss for sections / keys. Next, about the DUMP, I will retreat it again: It is in C Pseudocodes, NOT native codes that SF2 is written in. This C codes is decompiled from Ghidra software and they follow the logic and systems that is natively built using C++. Basically it's C folloiwng how C++ is used in SF2 engine. Keep that mind when looking at DUMP file. Here is the file: AVIONICS 60.zip Now I am moving oni to Avionics70.DLL. Cheers!
  2. @pvince TRhank you for BIG help testing the funcitonality of the HUD / COCKPIT / RADAR! I will keep posting what I can find from the DUMP files and please feel free to make the chagnes to the files I upload here. I forgot to add that the HUD.txt I upload is tied to Avionics60. I have at ehory that Avinoics60 and 70 have a bit different way how HUD works? When I upload the next files, will make sure to add DLL file name, so we wont' get confused among the files. There wil be Avionics60 - HUD.txt and Avionics70 - HUD.txt as an example. By the way, I believe this coudl be huge help: If we could make the table and put all HUD_Functions names on left section, then add to clumn: COCKPIT | HUD | RADAR Then add check or mark which works for either of them. The more people work with us here, the merrier! I am now working on Avionicsdata, RWR, TVDisplay and other sections of Avioincs60.DLL before moving on to Avionics70.DLL. I want to add one more thing, the more we become aware of how SF2 engine works syemtically, the higher chance we can get modifying DLL working in SF2. Cheers!
  3. Hello everyone! It have been incredible challenging going through over 60k lines of C-pseudocodes (Decompiled in Ghidra) that follows the logic of C++ (natively written in SF2 DLL files) in Avionics60.DLL file. The interesting thing is, I have noted how each class of HUD calls another HUD class and/or uses string to handle the key and associated keys for each sections. Spent days and many hours working on both HUD and RadarDisplay key extraction that can be used in INI files. I do NOT guarantee that it works, at least it is what is found in the DUMP files. The AIs have been huge help, cutting down the intense DLL DUMP digging. Here are HUD and RaadarDisplay (WIP) INI usage guide. If some codes (INI) does not work, then I apologize. At least I tried! Here are two Avioincs60 INI information: HUD.txt RADARDISPLAY.txt Eagle114th
  4. Hello everyone! The progress mining through the Avionics60.DLL in the language of C pseudocodes of Ghidra have been full of puzzles and it starts to make sense. Here is how it work, based on what I understand: 1) INI reads the token: "SymbolType=(NAME)" 2) Engine normalizes the token (treats "AirspeedScale", "airspeedscale", "AIRSPEED_SCALE" as the same entities). 3) Engine looks it up in a registry (Table), instantiates the matching "avnHUD(NAME)Class". 4) That class owns the **logic + drawing** for the symbol. The way SF2 handle hte string and names from class is wild! Here is list, so you can see an example: This is based on what is found inside the Avionics60 and SF2.exe dump. I want to add more informaiton about LCOS and CCIP adn why they don ot stay within the limtation of HUD rendering area (ViewportTopLeft and ViewportBottomRight): LCOS and CCIP are HUD symbols, BUT they calls the ballistic code within HUD class, resulting in not being fully integrated in HUD codes as another HUD classes do. Another wild bug I also discovered, this is from Avionics60.DLL DUMP FILE: This means if anyonoe uses "TrackMemoryTime" instead of TrackMemroyTime, wil not work. I plan on correcting it by modifying the DLL files via Ghidra and patching the DLL as first step toward modding DLL files after finishing the ini modding information library. Cheers!
  5. Hello everyone! I figured out what to do now. I’ve been digging through Avionics60.dll to understand how HUD and avionics are handled before any attempts to modify DLL files. By analyzing the Ghidra dump and .ini files, I created detailed notes on .ini editing for Avionics60.dll, starting with the HUD section. Here is note for a start: HUD.txt This is what I just realized from digging through Avionics60.DLL: Keys (Entries) like LCOS and CCIP are tied to the specific ballistic classes (avnHUDLCOSClass, avnHUDCCIPClass), not the generic HUD class, THERFORE is why LCOS and CIPP goes beyond HUD. Slowly will go through each DLL and extract what I can find (Sections and Keys), to build a comprehensive .ini editing library for modders here. Cheers
  6. Hello everyone! I am back to working on ghidra and SF2 DLL files digging. This week I am working on extracting all of available sections (Headers), key values, available values that can be used with it, especially examples how to use it. I am quite shocked to see this in Avonics60, example: UPDATE: For now, the list is removed. There was some mistakes. I am continuing to grow skilsl using AI correclty while extracting huge amounts of codes (over 60K lines of codes from Avionics60.Dll). I apologize for the mistakes. Will post more accurate list when I double check them. However, I do not promise that it do work in SF2, but it is what extracted from avionics60 dll Therefore, this week, I am going to get busy building the large database of information for each .ini sections (headers), keys (entries), and values that can be used with each keys. With that, we can experiment if they do work in SF2. Eagle114th
  7. Hello everyone! I have been working LOT on CSF Type 96 optical sight / HUD and is happy with the result. Here is screenshot of improved CSF Type 96: Navigation Mode: AA Mode: AG Mode: The Mirage 5E2's HUD also have been worked on. Navigation Mode: AA Mode: AG Mode: Eagle114th
  8. Hello everyone! It have been quite epic projects working on CSF Type 96 optical sight / HUD and Cyrano IV-0 for the Mirage 5SDE. While working on Egytpian aircraft, I realized that the Mirage 5SDE actually use Cyrano IV, which makes sense. It is irony because the 'E' of Mirage usually is multi-role. For example, the Mirage IIIC, the 'C" is an interceptor while 'E' (which mean "Equipment"), is multi-role, where the radar (such as Cyrano II) features both air to air and ground mapping. Libyan Mirage 5DE (Note 'E' as well), have multi-role air frame with Cyrano II radar. Egyptian Mirage 5SDE, in other, is also multi-role by nature, BUT uses early Cyrano IV which does not have ground mapping mode. Therefore, is irony but it makes sense. Right after the Six Day war, after devastating losses of hundred of aircraft, it would make sense that Egypt needs equipment that provides more advanced air to air capable for quick intercepting. Going through various references to start working on the radar texture. It is quite tricky because, what I have learned, the Cyrano IV-0 have ground noise background, right where the scanning screen is. Cyrano IV-1, in other hand, is the next version that have 'look down' capable, which means less or none of 'noise' background, I believe. Cyrano IV-2, and later version, in other hand, have the ground mapping and various air to ground radar features. (Please feel free to correct me if I am wrong) Anyway, here is screenshot of Mirage 5SDE's Cyrano IV-0, you will see different layout for different range RANGE MODE: 7 NM RANGE MODE: 15 NM RANGE MODE: 35 NM RANGE MODE: 60 NM BORESIGHT MODE Next screenshots shows the optical sight / HUD. First, I want to give HUGE thanks to the masterpiece of The Mirage Factory for the great work they have done on the CSF Type 96 Optical sight / HUD. It is quite complicated avionics. I am using their excellent work as foundation while improving upon it, such as gunsight, the firing cues, and other symbols. However, this part is still work in progress. NAVIGATION MODE AIR TO AIR MODE AIR TO GROUND MODE Eagle114th
  9. Hello everyone! Lot of works on Egyptian Mirage 5SDE and 5E2. From what I have learned, Mirage 5E2 uses HUD as used in Alpha Jet, so I used thee Alpha Jet HUD. I tis still WIP: NExt is Mirage 5SDE (This one is Mirage Factory, released by Wrench, did some work on implementing the new sight, radar, an d RWR made for Mirage IIIE.) Eagle114th
  10. Hello everyone! It have been a whil since Ihave worked on this project, after two weeks break. What have been done: Overhaul the [DetectSystem] becasue I have noticed that many of data.ini does not have matching of DetectSystem and Avioincs (for radar and Rangefinder), especailly with the RWR. With that, each aircraft will refelct from what is enabled in Avionics.ini in data.ini, especailly for AIs. I went through all aircraft and work inprogress Mirage III and 5 series, as well Nesher and Kfir. The Kfir series (work of Yakorav79) and thirdwire are now completed. Sorry no screenshot for now, the next time I post, will include the screenshots. I am currenlty workin gon Egypt Mirage series, as well Libya. Cheers!
  11. 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!
  12. Hello everyone, the new version of modder resource library v1.1 is uploaded, it is posted on the 2nd post above. Eagle114th
  13. 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
  14. 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!
  15. 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.11 SF2 -Resource Library v1.11.zip SF2 INI Modding Guidance Library v1.0 INI MODDING GUIDANCE LIBRARY v1.0.zip 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.) Cheers!
  16. 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!
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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 |
  24. 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
  25. 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:
×
×
  • Create New...

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..