Highlights

Disabled write support by default to prevent data loss. Write-support can now be enabled via the registry.

Added support for file creation.

Added support for folder creation.

Confirmed that Windows sees all files and folders created in ReactOS. Tested with up to 700 files (present limit of tester).

Confirmed that all files created in ReactOS have proper contents when read in Windows.

Confirmed that chkdsk won't report any problems after creating files and folders in ReactOS.

Expanded stand-alone utilities to assist with this years' project.

Identified and repaired numerous bugs.

How to Observe Work Performed

In order to see the results of my labor, you must first build my branch with the usual method and setup a virtual machine with the output. You can use a bootcd or a livecd. If you have any trouble building ReactOS, you can ask for help on IRC.

Before you build ReactOS, you must enable NTFS write-support if you want to test it. This is because write-support is still experimental; there's still a lot of things that could go wrong and using this driver could result in catostrophic data loss.

To enable write support, open the folder you checked out my branch to, and navigate to boot\bootdata\ and open the hivesys.inf file. Find the section that starts with &semi; NTFS filesystem driver

Simply remove the semicolon at the start of that line and save the file and build ReactOS as usual. This will add the registry key needed to enable write support.

Next, in a virtual machine (strongly recommended) boot into Windows and format a second virtual drive as an NTFS volume. Then, use the volume you formatted as a second hard drive in a virtual machine running ReactOS.

What's Working & What Can Be Used Now

Creating a file or folder and overwriting a file have been debugged pretty thoroughly in my branch and should work as you'd expect in all but the rarest of cases.

You can create files from the command line, by redirecting standard outpout.

Or, you can create a file by right-clicking. Renaming a file isn't supported yet, so if you create a file or folder via right-clicking, you'll have to accept the default name.

Also, you can use my test program to create files.

Creating a folder works as well. This was a feature I was able to implement at the last minute.

Reboot into the Windows vm and you should notice that all the files you created in ReactOS are available to you. If you run "chdsk x: /f" from a command line, where x is the letter of the ntfs drive you wrote files to, chkdsk should not report that it found any errors.

There's also some features which I have implemented or fixed which are less-obvious to an end-user. These include:

Support for enlarging the master file table when necessary.

Support for updating the $MFTMirr file.

Fixed support for POSIX vs Windows naming conventions. See CORE-13700.

During the course of this activity, I also expanded the stand-alone programs and scripts I wrote last year. Only the minimal amount of time was spent writing these programs, so I wasn't distracted from writing driver code. As such, this bonus code has numerous errors: memory is often leaked; file handles are leaked; comments are missing, deceptive, or just plain wrong; things are done in an inconsistent manner; etc. For the most part, these programs can't be interacted with except at the level of their source code.

Tester (AKA "Disk_Test_1")

This automated-tester was absolutely crucial to my progress. Not only did it consistently find errors that would have been impossible to reproduce otherwise, it was the only way I could test many of my incremental improvements to write support. This year I added tests specifically for creating a large number of files and verifying their creation.

"NTFSbrowse"

I developed this program as a learning tool for myself, but it has become a powerful debugging tool as well as a learning aid. The program will give you a lot of information about a particular file record, identifying most of the individual fields in its HTML output. This year I added an interface and a detailed breakdown of the $INDEX_ROOT attribute, as well as dumping the $I30 index allocation to another file which is linked to, and a detailed breakdown of the index records within the index allocation.

"DumpDrive"

This program is designed to create images of an NTFS partition, then compare these images. If it's able, the tool will keep track of every file that's changed, and display information related to the change. I gave it an interactive interface this summer and it was invaluable in helping me to track down some things that were causing chkdsk to complain.

"BuildRosFast.ahk"

I wrote this AutoHotKey script last year and improved it a little this summer. I have it assigned it to a custom toolbar button in Visual Studio. When I click this button, it starts building a livecd of ReactOS, kills any sessions of WindBg, reboots a VM, Launches WindBg, Launches ReactOS with debugging enabled, and finally adds whatever breakpoints I'm interested in before clicking the two buttons prompted by a livecd before you enter the desktop. This script is pretty crude (it would be better if it paid attention to the build results) but at the same time, it's an extremely powerful time saver!

What's left to be done

There's still considerable work to be done before the driver is ready for the day-to-day use. Immediate goals include:

Deleting files and directories

Renaming files and directories

Caching

Page-file support

Support for async IO

Support for memory mapped files

Once these features are working (maybe sooner), I'd like to see ReactOS booting from NTFS! Wouldn't we all? That will require:

Adding support for formatting a volume

Updating setup to use NTFS

Creating a bootloader for NTFS and using / fixing freeldr's NTFS support

There might be something else I've forgotten / am not aware of

Furthermore, there is some support for these NTFS-specific features, but they aren't fully working right now:

Sparse files

Alternate Data Streams (Named Streams)

File records that have or require an $ATTRIBUTE_LIST attribute

There's other features of NTFS that are yet to be supported:

Support for drives and files with greater-than 2^32 clusters

Compressed files

Encrypted files

Logging

It should also go without saying that there will be lots of bugs to fix along the way.

Looking Forward

Thank you to my mentor Pierre, ReactOS, and Google for this wonderful opportunity!!

I definitely plan to keep contributing to ReactOS! I will make one more blog post after this one to summarize my experience from a personal standpoint.

Introduction

ReactOS App Manager (RAPPS) is an app used in ReactOS to download apps, tested by ReactOS team and community. It also manages apps that are installed - you can view apps that are present on your system and uninstall them. The goal of this project was to improve RAPPS and add some very useful features.
Here is a video presenting it's features:

Table of contents

Building

Building RAPPS is no different as building parts of ReactOS. You can build it via RosBE:

Checkout the reactos/branches/GSoC_2017/rapps/reactos repo via your favourite svn client. Alternatively you can use ssvn from RosBE. Set the environment variable ROS_BRANCH to "GSOC_2017/rapps" and do ssvn create

Testing

RAPPS is mostly straightforward to use. Just doubleclick the app you want to install or select multiple apps via checkboxes. You can also invoke a context menu on each entry for other commands.

Changes made during development

Visually RAPPS remains mostly the same. It's base design isn't changed. However, I've added some enhancements for the UI. Some of them won't be listed here as they are not only visual.

Application List Improvements

One of the goals on the first week was editing the info for available applications. I've added several new information types for this panel.

The info panel displays status right after the name of the app. Statuses can be "Not installed", "Installed", "Update available". Installation check is done via checking the /Uninstall keys in the registry, and it's not very reliable - every app writes it's own string there. There already is a field which allows you to specify this string per app, but no apps database entries actually use that right now. While this string is a prefered method of doing such checks, I've decided to also do them with the existing plain names with or without version attached (this is a common thing), and that worked very well.

Version number is also retrieved from the same registry key. When the app is installed, and the available version is higher, then RAPPS would show "Update available" status. If the check can't happen or installed version is greater it falls back to "Installed". Suffers from the very same problem as the above, because version check uses the same method.

Another added field is Languages field. This field can tell you if this app is translated to your language or English and how many more there is. This one requires adding additional Languages field to the DB entries where you add all the language codes app supports separated by |. Example: Languages=0C09|0813|0422 \\English|Dutch|Ukrainian Multiline parameters are also supported.

And the last field is LicenseInfo. It's a field in the DB which, when present, changes the way License field in the info is shown. Value 1 stands for "Open Source", 2 - "Freeware" and 3 - "Demo/Trial". Introducing this would highlight the open source apps among the rest.

I've used Faenza as well as some random icons from the Internet.

Old RAPPS used the same boring icon for every app in the list. I've added support for 'per app' icons, that can be loaded from AppData/rapps/rapps/icons folder (that's where the database entries are).

Bulk installing

Previously you could only download and install one app at time and you could not use RAPPS while doing it. This change introduces new download dialog that can download and install multiple apps sequentially and also it's now modeless. That means you can continue using RAPPS while it downloads something. Dialog also shows download progress status for each app.

This GIF is from earlier days of testing when RAPPS had 'Installed' disabled and there was a visual bug with decrementing. These are fixed now.

In the statusbar at the bottom now appears application selection count. Note that checkbox selection drops every change of category. Checkboxes also hide when user switches to 'Installed' category.

Scripted installation

Long requested feature - unattended installs! Well, not very correct, since it will still run those installers in foreground, but you can specify exactly what app you want without firing up GUI. There are two keys now:

/INSTALL - accepts multiple apps as values and installs them if they are available.

Example: rapps /INSTALL 7-Zip AkelPad

/SETUP - accepts a full path to the .inf file, where in [RAPPS] block you can specify which apps to install using one Install= key per single app.

Future work

While almost everything works, RAPPS still needs additional changes so it wasn't merged yet. But I expect it to be mergable pretty soon.

There still are some things I want to improve or left incomplete. I've mentioned some them in the previous chapters, but to name a few:

Making app selection persistent across the app

Improving Installed category - left untouched by this project

Adding comfirmation dialog for the downloads

Adding parallel downloads

Making RAPPS maintainable

Also, my proposal initially contained the 'Setup mode' function. ReactOS team decided to postpone that and focus on other features. Other thing that's left out is Screenshots view. That was also posponed since RAPPS has a very simple DB system. Maybe on the next GSoC... :)

Conclusions

ReactOS team is awesome! I really enjoyed working on the project and working with my mentors and devs. This project gave me valuable knowledge on what FOSS community is like. And also some experience on refactoring, debugging, and in general.

I'll definetly stay with the project! Thanks Google for the GSoC that gave me an oportunity and incentive to work on something great.

P.S

I'm sorry for not keeping you updated on the last month with blogs. But expect another post or two about this project and Hackfest! Also, I gave updates on the live stream from the Hackfest, so you should watch that as well! And, of course, see the video at the beginning. Good day and happy hacking!