# Quick primer

Let's start with a very short and simple function:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-3c1c09ba3cd492970f3e948169f4af52adf15fd3%2Fprimer1.gif?alt=media)

We decompile it with **View, Open subviews, Pseudocode** (hotkey **F5**):

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-d5e8ee421681d59cc170139e2a6d5d40eee927b1%2Fprimer2.gif?alt=media)

While the generated C code makes sense, it is not pretty. There are many cast operations cluttering the text. The reason is that the decompiler does not perform the type recovery yet. Apparently, the **a1** argument points to a structure but the decompiler missed it. Let us add some type information to the database and see what happens. For that we will open the **Local Types** window (**Shift-F1**) and add a new structure type:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-58426cde9e7156368dec7766bee02a3a57c3f028%2Fprimer3.gif?alt=media)

After that, we switch back to the pseudocode window and specify the type of **a1**. We can do it by positioning the cursor on any occurrence of **a1** and pressing **Y**:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-33bde98e6ed933f100018a1836a2ad404b395477%2Fprimer4.gif?alt=media)

When we press **Enter**, the decompilation output becomes much better:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-f07589cae0c84695def1a270ee3d792d66b9d932%2Fprimer5.gif?alt=media)

But there is some room for improvement. We could rename the structure fields and specify their types. For example, **field\_6B1** seems to be used as a counter and **field\_6B5** is obviously a function pointer. We can do all this without switching windows now. [Only the initial structure definition required the **Local Types** window](#user-content-fn-1)[^1]. Here is how we specify the type of the function pointer field:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-7db9fabed329f607aaf291ef862b1e0f82ed8080%2Fprimer6.gif?alt=media)

The final result looks like this:

![](https://545602138-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FucByjS46IhJacH1pbIKC%2Fuploads%2Fgit-blob-b4fc765cff21af9dc0c449bc79807cebaba8ae03%2Fprimer7.gif?alt=media)

Please note that there are no cast operations in the text and overall it looks much better than the initial version.

[^1]: This is not completely true. In fact, we could enter the full structure definition in the type dialog box, but it is difficult because the input field consists of a single line. We could also define new types with the **File, Load file, Parse C header file** command.
