Executables
Updater (ffxivupdater.exe)
This documentation is incomplete.
The program that processes the patch files and applies them to the game or boot data.
Arguments #
Just like the other executables, it requires you to pass these using the SqexArg format.
- BootVersion
- The version of the boot component.
- GameVersion
- The version of the game component, however I’m curious as to the purpose of this variable. Is the patcher itself fetching the patches required for the provided game version?
- CallerWindow
- This seems to be the HWND which it sends messages to. Passing a HWND that is setup to receive messages, it appears to yield a 0x74 message (OpenWindow I believe) which means this is the most likely case. More on the IPC below.
- IsSteam
- Obviously, to check if this is the Steam version. I have not reversed the game arguments of the Steam version yet.
- NextExe
- I’m not entirely sure what the purpose of this is yet. It makes no sense for the updater to call the game itself, I’m pretty sure this is used for “patch chaining” but it’s also set for regular game patches. For example, when updating the game through the launcher it points to ffxiv.exe. Note that it is not ffxiv_dx11.exe, which means this is probably unused in the retail launcher.
- ShowMode
- This is the most interesting parameter, more testing is needed. There is multiple values here, and some of them correspond to known launcher behavior:
- 1: This seems to be some sort of standalone updater window that I’ve never seen before in retail. Is this a leftover from a older version of the game? For example, it looks for “LauncherPatchInstall.list” (I can’t seem to recreate this file). I have not gotten it to read from a “GamePatchInstall.list” either, however there is probably some other parameter to trigger this change. This “list” format is also unknown.
- 2: This has no user-visible window, and is the “default mode” when launched properly through ffxivlauncher.exe. It’s communicating through regular Win32 IPC I believe, back to the launcher where the launcher updates it’s own window.
- 3: I haven’t gotten this mode to work, but on the standalone updater window it mentions “repairing game files”. I believe this is what’s used by the “repair game files” button in the launcher, but I’ve never used it before nor do I know it’s actual purpose (just checking hashes?).
- UserPath
- This is the usual UserPath arugment, pointing to your FFXIV-ARR Documents directory.
Processes #
During update execution, the launcher copies the updater executable into your UserPath/downloads
directory, where it is then ran. I’m assuming this is to work around a Windows limitation where you can’t update the executable on disk, so it has to be ran from a location where it could “update” itself.
ShowMode 2 #
This is the regular retail patching mode, and it runs ffxivupdater64.exe in a hidden window that’s just there for message processing. I’m not sure yet if ffxivupdater.exe is the one actually downloading the patch files yet. The launcher just reflects ffxivupdater’s progress, and passes it along to the web form in the form of a json callback. You can set a breakpoint at 0x183278 (tested on the launcher ver 3/20/2022) and see that it first hits that area when updating. There is three seperate printf strings, which I’m guessing is the three “modes” of patch progress:
Offset | String Data |
---|---|
1400e6df0 | {version:"%s",remaintime:"%s",progress:%6.2f} u"{version:"%s",remaintime:"%s",progress:%6.2f}" |
1400e75a0 | {version:"%s",downloadsize:"%s",remaintime:"%s",speed:"%s",progress:%6.2f} |
1400e76c0 | {version:"%s",remaintime:"%s",speed:"%S",progress:%6.2lf} |
(The offsets are tested on 3/20/2022) The first one appears very minimal but might be the one used when it’s not downloading/installing any patches yet, and just gathering information. The second one appears to be the regular “downloading” patch mode, considering it says “downloadsize” right there. The last one would appear to be when it’s actually applying the patches, as it has “remaintime” as well as “speed”.
IPC #
It looks like this communicates exclusively through Win32 IPC (SendMessage). I haven’t deciphered all of the messages yet, but here is a few interesting ones I’ve seen used:
0x7fc
The format is
{version:\"%s\",ID:%d}
. I’m guessing this means “install this patch”, version obviously corresponds to the patch version, and maybe ID is the jumble of alphanumeric characters in the directory names of the ffxivpatch folder?0xbd4 - unknown
0x81a - unknown
Alternative Implementations #
Launcher (ffxivlauncher.exe)
This is the program that logins into the official servers and launches the game.
History #
Since FFXIV has been around for a long time, it’s went through several launcher redesigns.
1.x #
This is the launcher used for 1.x, before A Realm Reborn. This screensot is a recreation by Ioncannon, as I can’t find the original login page anywhere online.

2.x #
This launcher design was launched with A Realm Reborn and had been in service until Endwalker.

6.5+ #
This is the current iteration of the launcher, and the old launcher can no longer be used and all users must use the new design (as of 6.5+)

Internals #
The launcher is wrapper of a website, and the page is served by the Frontier server on URLs such as https://frontier.ffxiv.com/version_4_0_win/index.html?1559390056785.
In order for the launcher to actually launch anything useful, it uses JavaScript callbacks into native code.
For details on how logging into the Square Enix servers work, see the relevant page on this concept.
Arguments #
Like the other executables, it requires you to pass these using the SqexArg format.
ExecuteArg
(Required)- This is a strange argument. This appears to be a random gibberish of numbers:
/T =1000000 /ExecuteArg =14431503 /UserPath =C:/users/yourname/Documents/My Games/FINAL FANTASY XIV - A Realm Reborn
In reality, decompiling the launcher reveals that they are sprintf’ing in this format:
%02d%02d%02d%02d
- 1st arg - current month + 1
- 2nd arg - current day
- 3rd arg - current hour
- 4th arg - current minute
UserPath
- Your usual path to your FFXIV data folder in
My Documents
.
- Your usual path to your FFXIV data folder in
Alternative Implementations #
Installer (ffxivinstaller.exe)
This is not a standard InstallShield installer (at least to my knowledge) but seems to a self-extracting executable and then some form of InstallShield executable.
If you only care about the .cab files (which can then be read with your usual installshield libraries/tools like unshield) then they are contained right in the executable, uncompressed.
To find them, simply find the needle string “Disk1\{FileName}” where FileName is the cab filename. They are as follows:
- data1.cab
- data1.hdr (to my knowledge, this is some kind of “file index” for installshield installers)
- data2.cab
They are simply put right next to each other in the executable, so if you follow that order you’ll find each of them quite easily.
Alternative Implementations #
Client (ffxiv.exe)
This is the game client executable.
There are two separate executables for DirectX 11 and DirectX 9. The DX11 version is named ffxiv_dx11.exe
. The DX9 version will be removed in a future update.
Arguments #
Unlike other executables, passing arguments encrypted with SqexArg is optional for the client. It’s recommended that you do so if you’re planning to use actual SIDs though.
There a few known arguments that work on the normal game client:
DEV.DataPathType
- Guessing that this controls the asset data type used by the client, this is will always be
1
.
- Guessing that this controls the asset data type used by the client, this is will always be
DEV.UseSqPack
- Guessing that this tells the client to try to load data from SqPack files instead of from regular, uncompressed files. Seems to always be
1
.
- Guessing that this tells the client to try to load data from SqPack files instead of from regular, uncompressed files. Seems to always be
DEV.MaxEntitledExpansionID
- This is the max entitled expansion ID that the currently logging in user has access to, you will want to set this from your login response.
DEV.TestSID
- This is the SID you get from your login response.
SYS.Region
- Your login region.
language
- Your login language.
ver
- The (base) game version string.
DEV.GMServerHost
- This is the address of the frontier server to connect to. If empty, this will default to the official Square Enix frontier server.
DEV.LobbyHost0X
- This is the address of the Nth lobby available to the client, these are numbered 0-9. If empty, this will default to the official Square Enix lobbies.
DEV.LobbyPort0X
- This is the port number of the Nth lobby available to the client, these are numbered 0-9. If empty, this will default to the official Square Enix lobbies.
For benchmark versions of the game, there is a whole host of graphical options available as game arguments - but this seems to be missing in the retail version.
Alternative Implementations #
- SaBOTender (C#)
- Implements very basic networking capabilities.
Boot (ffxivboot.exe)
This documentation is incomplete.
This executable handles launching ffxivlauncher.exe, and also patching “boot files” (aka anything inside of the GameInstall/boot folder).
Alternative Implementations #
Benchmarks
There have been several benchmarks publicly released, which are modified client executables that replay several cutscenes (usually made exclusively for the benchmark) and can create character creation save data.
Despite the official FFXIV Benchmark site only displaying the latest expansion, all previous benchmarks are still accessible. An archive of all links are provided below.
- Original (1.x)
- A Realm Reborn (2.x)
- Heavensward (3.x)
- Stormblood (4.x)
- Shadowbringers (5.x)
- Endwalker (6.x)
- Dawntrail (7.x)
ARR and Heavenward place the benchmark files under a /inst
directory on their server. Expansions afterward, place it under a directory with a directory with a seemingly randomized string such as ’nr2xkhecw9vrkuqy'.