https://reactos.org/wiki/api.php?action=feedcontributions&user=Learn+more&feedformat=atomReactOS Wiki - User contributions [en]2024-03-28T15:25:38ZUser contributionsMediaWiki 1.31.7https://reactos.org/wiki/index.php?title=RAPPS&diff=55394RAPPS2024-01-25T11:28:22Z<p>Learn more: /* See Also */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program located in <code>C:\ReactOS\System32</code> that allows users to download, install and update multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
The official list of downloadable programs (an archive "rappmgr.cab" or "rappmgr2.cab"), is kept on a [https://rapps.reactos.org/rappmgr2.cab public ReactOS server] and synced every time RAPPS is launched for the first time.<br />
Once the rappmgr.cab is downloaded to <code>%appdata%\RApps</code>, RAPPS extracts it using cabinet.dll inside <code>%appdata%\RApps\appdb</code>. After that, it will parse all the *.txt files contained therein.<br />
<br />
Every subsequent time the program tries to access the local .txt files until a database update is manually triggered by the user.<br />
<br />
If the rappmgr.cab file is moved or just missing, RAPPS will download it again.<br />
<br />
Each program entry consists of a text file formatted with an INI-like syntax. Every .txt file describes a program, the filename is used as a unique identifier and should correspond to the software it "contains".<br />
<br />
= Submitting New Applications =<br />
It is possible to submit new application creating a txt file according to the file schema, forking the [https://github.com/reactos/rapps-db rapps-db repository on GitHub] and sending your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
Before submitting the Pull Request, test the files by pasting the document in the <code>\RApps\appdb</code> folder and clicking "Refresh" in the GUI.<br />
<br />
Description files need to be saved in UTF-16 LE (Little Endian) in the rapps folder on disk. Without this, characters out of the ANSI range will display broken mojibake, some editors like Notepad++ call this format UCS-2 Little Endian.<br />
Line endings must be set as Windows format (<code>\r\n</code>). At the end of the file, there must be one empty line.<br />
<br />
If included in the ReactOS source code versioning entries are stored in UTF-8 without BOM (Byte Order Mask) for VCS friendliness.<br />
They get automatically converted to UTF-16 when creating the compressed rappmgr.cab package.<br />
<br />
It is suggested that the commits to be squashed into one commit before a PR. If the reviewers asked for changes, ensure that the commits are squashed afterwards.<br />
<br />
= File Schema =<br />
<br />
== Sections ==<br />
RAPPS can show different programs' information accordingly to the host system language: to achieve this, the INI files used by RAPPS are divided in section.<br />
<br />
Each section begins with ''[Section.XXXX]'', where ''XXXX'' is a four-digit ''Locale ID'', that uniquely identifies a language.<br />
A list of Locale IDs can be found [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c on Microsoft Docs] (last four digits of the ''Language ID'' column).<br />
To avoid "colliding" codes (same ID used for multiple languages), also check [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f MS-LCID Reference], for example in the [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d-210407.pdf 14.1 protocol revision (obsolete)] see Language ID at page 9.<br />
<br />
An exception is made for the default entry, that is only defined as ''[Section]'': this should contain information in English.<br />
<br />
If there is no entry for the host system language, the default entry is chosen. <br />
For example if the system is set to Spanish and there is no Spanish entry of a program, then software description etc. will be displayed in English.<br />
<br />
Note that every field in a section can be customized for a language, not only the description (for example if a program offers different download links for different localizations).<br />
Fields that are not customized for a language will use the default entry in ''[Section]''.<br />
<br />
Here is a minimal example of a multilanguage file:<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My Program Name<br />
Category = 16<br />
URLDownload = https://example.com/MyProgram.exe<br />
<br />
; Russian language<br />
[Section.0419]<br />
Name = Имя моей программы <br />
URLDownload = https://example.com/MyProgram_LocalizedRussian.exe<br />
</syntaxhighlight><br />
<br />
RAPPS also accepts neutral language codes, meaning that you can do things like this<ref>https://github.com/reactos/rapps-db</ref>:<br />
<syntaxhighlight lang="ini"><br />
; Default English fallback, used if everything else fails.<br />
[Section]<br />
Name = Name in English<br />
<br />
; Neutral Spanish, used if the specific variant of Spanish does not match.<br />
[Section.0a]<br />
Name = Name in Generic Spanish<br />
<br />
; Spanish from Spain, used if the system is configured for it.<br />
[Section.0c0a]<br />
Name = Name in Castilian Spanish<br />
</syntaxhighlight><br />
<br />
Note that is possible to create a file without an English entry, so that the program would be only shown to systems set to determinate languages, but it is discouraged, as users aren't able yet to choose the languages they want to visualize (so for example if a French-speaking user would set the system to English, RAPPS would not show eventual French-only entries, even if the user is potentially able to use them). <br />
<br />
RAPPS behaviour on systems with multiple languages has not been documented yet.<br />
<br />
== Sections Fields ==<br />
<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
; Mandatory fields<br />
Name = My fun stuff-o-matic<br />
Category = 5<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
SizeBytes = 10485760<br />
<br />
; Optional fields in alphabetical order (no experimental features)<br />
Description = Shortish description giving some additional background information about what it does.<br />
Icon = SomeIcon.ico<br />
License = GPL<br />
RegName = Name in Registry<br />
SHA1 = 47480394167aca4869b7bf330af6c6fc5ca4ac25<br />
URLSite = https://example.org/<br />
Version = 1.1.1<br />
</syntaxhighlight><br />
<br />
Let's analyze it from top to the bottom.<br />
''The following fields are mandatory.''<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. <br />
Currently on ReactOS 0.4.13 there are 15 + 1 categories:<br />
* 1 – '''Audio''': Software for recording, playing, modifying, converting sounds<br />
* 2 – '''Video''': as above but applied to videos and movies<br />
* 3 – '''Graphics''': a above, but applied to graphics and images<br />
* 4 – '''Games & Fun''': games, console emulators etc.<br />
* 5 – '''Internet & Network''': browsers, IM clients, FTP software, Remote desktop etc.<br />
* 6 – '''Office''': office suites and similar<br />
* 7 – '''Development''': IDEs, debuggers, compilers and anything related to software development<br />
* 8 – '''Edutainment''': software related to education & teaching, like dictionaries and translators<br />
* 9 – '''Engineering''': CAD, FEM, numerical computation etc.<br />
* 10 – '''Finance''': balances management, warehouse software, trade monitors etc.<br />
* 11 – '''Science''': programs for simulation, advanced calculus, chemistry, physics and similar<br />
* 12 – '''Tools''': utilities like archiving software, disc burning utilities etc.<br />
* 13 – '''Drivers''': device drivers<br />
* 14 – '''Libraries''': libraries and runtimes, usually needed to run/develope other programs<br />
* 15 – '''Themes''': themes for ReactOS or Windows<br />
* 16 – '''Other''': programs that do not fit in above categories<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program. <br />
Scripted download are not supported yet, so ensure it is a direct link to a file.<br />
HTTPS is not mandatory but recommended.<br />
<br />
''The following fields are optional (but recommended).''<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does.<br />
<br />
=== License ===<br />
The license under which the software is released, for example Apache, GPL, MIT...<br />
Non-libre software is usually released under a End-User License Agreement (EULA) shipped with the software.<br />
<br />
=== Icon ===<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', and include the .ico extension.<br />
The icon itself should be placed in the `icons` folder in the rapps-db repository.<br />
Alternatively, if the filename of the .txt file matches the filename of an .ico file, that icon will also be displayed.<br />
<br />
=== RegName ===<br />
Name in Registry<br />
<br />
=== SHA1 === <br />
SHA1 checksum, to verify the download.<br />
By standard SHA1 is case-insensitive.<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
On Windows systems usually both nominal size and size on disk are reported, in this case use the former.<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
HTTPS is not mandatory but recommended.<br />
<br />
=== Version ===<br />
This is the version of the program. <br />
In the code it is treated as a zero terminated string, so the decimal separator shouldn't matter, RAPPS should only check if the string of the latest available version is different from the installed one.<br />
<br />
== Deprecated fields ==<br />
<br />
=== LicenseInfo ===<br />
For a while the wiki erroneously reported LicenseInfo instead of LicenseType. If it is found in a file, please simply replace it with LicenseType.<ref>https://jira.reactos.org/browse/CORE-17771</ref><br />
<br />
=== Size ===<br />
The Size parameter was used before the introduction of SizeBytes. It has now been removed<ref>https://github.com/reactos/rapps-db/pull/153</ref>.<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not included yet in the current stable (0.4.13), and are only available in development (0.4.15-dev).<br />
<br />
These work well enough to be tested and used but might still be subject to changes before being merged in stable.<br />
<br />
== Architecture-based Sections ==<br />
[[ReactOS ports|As ReactOS has several ports]] (at different stages of completions), it is already possible to define different sections for different architectures.<br />
Some files in rapps-db already include different entries, but at the moment (0.4.13 release) the x86 port is the only one working.<br />
<br />
If not differently specified, all entries are assumed to be x86.<br />
<br />
These are the possible values for the architecture<ref>https://github.com/reactos/reactos/blob/master/base/applications/rapps/include/misc.h</ref>:<br />
* <code>[Section.x86]</code> - i586. Can be omitted, by default all entries are supposed to be for x86.<br />
* <code>[Section.amd64]</code> - x86_64/x64<br />
* <code>[Section.arm]</code> - ARM<br />
* <code>[Section.arm64]</code> - ARM64<br />
* <code>[Section.ia64]</code> - Itanium<br />
* <code>[Section.ppc]</code> - PowerPC<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight><br />
<code>[Version]</code> section is a necessary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
<br />
== New Sections Fields ==<br />
<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseType === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
* 1 – "Open Source"<br />
* 2 – "Freeware" <br />
* 3 – "Demo/Trial"<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...)<br />
<br />
Currently, only first Screenshot is used. Ensure the URL is a direct link to the image, not a page containing the image (e.g. Imgur links).<br />
It is also preferred to include the screenshot taken on ReactOS, not on Windows.<br />
<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
; Example of a current application in RAPPS with a screenshot<br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
Version = 17.12<br />
License = GPLv3<br />
Description = An open source, cross-platform, powerful IDE. It does not contain a compiler.<br />
Category = 7<br />
URLSite = http://www.codeblocks.org/<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
* Documentation<br />
** [https://doxygen.reactos.org/dir_f72badb8674797321b701dde383e2467.html RAPPS generated documentation (Doxygen)]<br />
** [https://github.com/reactos/reactos/blob/master/base/applications/rapps/README.ENG RAPPS Readme on GitHub]<br />
** [[Developing_ReactOS_with_Visual_Studio|Developing ReactOS with Visual Studio on windows]]<br />
* Forum topics<br />
** Tutorials<br />
*** [https://reactos.org/forum/viewtopic.php?f=22&t=11015 RAPPS - For those that want more from it.]<br />
* GSoCs that involved RAPPS<br />
** [https://reactos.org/tags/rapps/ rapps | ReactOS Project]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=ReactOS_FAQ&diff=55393ReactOS FAQ2024-01-25T07:07:15Z<p>Learn more: /* Why isn't ReactOS 64-bit? */</p>
<hr />
<div>== User FAQ ==<br />
=== [[ReactOS#What Is ReactOS|What is ReactOS?]] ===<br />
ReactOS (short for React Operating System) is an open-source project to develop a quality operating system that is compatible with Microsoft Windows&trade; NT applications and drivers. In effect, ReactOS aims to replicate Windows NT. '''Please be aware that ReactOS is in ALPHA - what this means is that ReactOS is under heavy development and therefore NOT ready for every day use.''' <br />
<br />
'''A short but important history lesson regarding NT''': What the general public perceives as current 'Windows' - the user and application interface is actually just one part of the modern Windows NT&trade; operating system. This in turn is provided by the [[Win32]] subsystem which is a layer that sits upon the NT kernel. The term "NT" refers to the whole Windows NT series from 2000 until today. This range comprises NT version 3 to NT5 (2000, XP & 2003), then from NT6 (Vista, 2008, 7, 8, 2012 & 8.1) to NT10 (10, 11, 2016 & 2019). The NT architecture was originally designed by a team led by David Cutler, a former lead developer of Digital Equipment's VMS operating system. It took the team more than 4 years to combine the best of UNIX, VMS, and OS/2 to create the NT architecture. ReactOS aims to replicate NT starting at NT5 (Server 2003) as NT5 was a stable and functional o/s whose fundamental components (APIs) still comprise the basis of later versions of Windows. An additional aim is compatibility with many of the more modern APIs from later NT6 versions of the Windows o/s.<br />
<br />
=== Is ReactOS legal? ===<br />
Yes. ReactOS is fully legal and adheres to the strongest standards of accountability.<br />
<br />
Windows source code is not publically available. ReactOS Developers (devs) do not and have not looked at any leaked Microsoft Windows&trade; source code. They can only use the publically available documentation that Microsoft publishes and that which exists is not comprehensive. As a result, ReactOS devs have to test Windows in detail to understand how every component of Microsoft Windows works. ReactOS inevitably intends to perform exactly the same as Windows but it WILL accomplish this differently due to having very different source code being programmed by a completely different team of developers. All code in ReactOS is released under the GNU GPL (General Public License) that allows external scrutiny.<br />
<br />
=== Is ReactOS based on Microsoft Windows&trade; original source code? ===<br />
No! ReactOS consists only of clean-room engineered GNU GPL (General Public License) and GPL compatible licensed source code.<br />
<br />
=== Is ReactOS based on *nix or Linux? ===<br />
No! ReactOS is not based on UNIX/Linux. It is not a variant of linux and uses no linux source code nor drivers. ReactOS has been written from scratch.<br />
<br />
=== Why doesn't ReactOS have a modern UI? ===<br />
<br />
There is no such thing as a modern UI. The UI of current Windows changes according to the whim of Microsoft. This is not the case for ReactOS. <br />
<br />
The target for ReactOS is Windows 2003. ReactOS' default UI is based upon that which you will find in Windows 2003. At the moment there are four alternative theme choices and all are suited for desktop operation. Current Windows (10 & 11) uses a theme that is compatible with both desktop and tablet based versions of the o/s. That theme is tied to the corporate design that Microsoft is currently espousing. The themes that come with ReactOS are not tablet-based themes as ReactOS is a desktop based operating system.<br />
<br />
There are some users, those that are perhaps a little naive, that believe the UI-look-and-feel is in some way tied to the real functionality of the core o/s but that is not really the case. If you are comparing ReactOS default UI with that of current Windows you may not fully appreciate that ReactOS' UI is configurable and being FOSS will be user-customisable in a way that current Windows simply is not. Eventually it will be possible to configure ReactOS to appear any way you desire with your own 3rd party tools and themes. Simply put, if you want ReactOS to look like Windows 10 or 11 then it is entirely possible. All you need to do is find and install a suitable theme and configure it - or even create one yourself!<br />
<br />
=== Why ReactOS? Why clone Microsoft Windows&trade;? ===<br />
We do not consider ReactOS as being a mere clone of Windows. We prefer to think of ReactOS as an operating system that is compatible with Microsoft Windows applications and drivers, one that is free and open source. The developers of Linux (an open-source UNIX clone) was created for very similar reasons. Linux is a great operating system but it is not the answer for everybody and it is not compatible with Windows applications and drivers. There are a lot of people that like the Microsoft Windows environment but are very frustrated with Microsoft's policies on various issues.<br />
<br />
The Microsoft Windows NT&trade; family of Windows has a solid design. Not everything is perfect but there is nothing we, the general public can do about it. Without access to the source code there is no way to fix anything - so in response to this we decided that a Windows-compatible operating system must be built from the ground up.<br />
<br />
Think of ReactOS as a community-created o/s with honourable goals, ie. to create a free-to-use Windows-compatible o/s that will be quick to install, quick to run and easy to operate. Think of it in the same spirit as a "Linux for Windows users" or perhaps more accurately as a "Windows o/s for Linux users"? Both built in the same spirit with a similar aim in mind.<br />
<br />
ReactOS is a desirable object given that it should free Windows development from the shackles of Microsoft's current business model. That is a great target in itself. When, if ever ReactOS achieves beta release, it will provide a home for the continued development of legacy applications (win32, MFC and the like), their future will be rosy well away from the UWP framework that Microsoft has been imposing upon both users and developers alike. Microsoft has in its current business aims the desire to dominate desktop, tablet and IoT devices. ReactOS does not have these aims but it can provide an alternative.<br />
<br />
=== Where can I download ReactOS? ===<br />
Please visit the [http://www.reactos.org/download/ download page].<br />
<br />
In addition, official ReactOS nightly builds are available at [http://www.reactos.org/getbuilds/ Nightly Build page]. Builds are generated for every commit and include full installation and live ISOs, both debug and release versions.<br />
<br />
=== How can I contribute to ReactOS? ===<br />
* We need coordinated [[Testing Central|testers]], which means we need people that help us testing in a coordinated way.<br />
To join our testing come to the [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels]. Find any dev and ask us what to test. Every day the ReactOS project has different testing needs so testing is not boring.<br />
*We need coordinated [[Translation Introduction|translators]] for languages not yet translated.<br />
*We need coordinated C [[Development Introduction|developers]] for core o/s development.<br />
*We need coordinated C++ [[Development Introduction|developers]] for o/s utility development.<br />
*We need coordinated bloggers<br />
<br />
To find your place just come and join the [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels]. See you there.<br />
<br />
=== I am an experienced coder... How can I help? ===<br />
If you are a developer experienced in C and C++ then join [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels]. There you can ask questions regarding our code and find a component upon which to work. You can select any component that interests you but first contact us and tell us what you are planning to do. Other developers may already be working in that particular area. We're especially in need of people who know how to write NT drivers because our current drivers could use some improvement.<br />
<br />
There are several ways to contribute to the development of ReactOS. The most often encountered problem is not knowing where to begin or what to do. If you are able to program or understand the technical information that is pertinent to this project, helping the development can be easy. <br />
<br />
Please visit the [https://reactos.org/wiki/Development_Introduction Developer Introduction page] for an overview for developers so that you know where to begin.<br />
<br />
The full developer Wiki page will be found here: [https://reactos.org/wiki/Welcome_to_the_ReactOS_Development_Wiki The Developer Wiki]<br />
<br />
=== I don't know how to code but I want to learn. How? ===<br />
Study C, C++, WinAPI, then read books as "Windows Internals" and/or "Operating System Concepts".<br />
Come and ask us. For C and C++ questions you have the C and C++ [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels], they will solve your doubts much faster.<br />
<br />
=== I'll never know how to code... How can I still help? ===<br />
Developers always require testing of something. Just come to [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels] and ask for something to test. Developers will give you some ReactOS testing work suited to your skills.<br />
Testing on real hardware is especially important as the kernel rewrite approaches completion. Some issues are known, such as missing assembly code and broken implementations causing issues on certain processors. Bugs found in the trunk can be reported in Jira, but try to avoid entering duplicate bugs.<br />
<br />
=== I don't know how to test but I want to learn. How? ===<br />
First of all, don't raise loads of issues on Mattermost or on the forum. By all means, use this as a method of raising awareness on an issue but if you are really going to help raise a ticket! This means opening a bug report on our bug reporting system known as [https://jira.reactos.org/secure/Dashboard.jspa JIRA]. You can log in using your ReactOS website credentials. If you have questions regarding filing bugs, please see the helpful WIKI entry here - [[File Bugs|Filing bugs on JIRA]]. In addition to this WIKI there also exists a [[A_layman's_guide - How_to_create_a_JIRA_Issue|layman's guide to filing bugs]], written by one of our regular contributors.<br />
<br />
=== What else can I do to help? ===<br />
You can promote ReactOS around the web, correcting inaccurate opinions where you find them. You can look for useful FOSS code that can provide an element of Windows that ReactOS does not currently have. You can encourage other developers to contribute to ReactOS. You can send a donation to ReactOS or encourage others to do so.<br />
<br />
If you find a wandering kernel developer with no current employment then please lasso him and bring him back to the ReactOS team, we need skilled kernel developers!<br />
<br />
Please note that we are not currently looking for graphic designers to redesign the ReactOS UI. We receive a lot of offers in this regard. The offer of your skills is appreciated but we already have a few capable graphical designers in-house and we are not looking to change the current NT5 style UI. If you really do want to contribute in this area then we would suggest building a theme suitable for XP and testing it there. It will theoretically also be installable on ReactOS and you can offer it as a suitable replacement. Please note we will not be incorporating a lot of themes within the os so lower your expectations of having your own unique theme bundled with ReactOS.<br />
<br />
=== Who should I talk to about helping ReactOS? ===<br />
The best way to get in touch with a developer is to hop onto the [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels].<br />
<br />
*[https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels] Read the [[Mattermost-CoC|Mattermost code of Conduct]] before participating<br />
<br />
A list of the developers showing their Mattermost nicknames and their respective areas of expertise is here: [[Developer Roles]] - Names of other developers will be added as time progresses and it becomes clear which are contributing and how.<br />
<br />
Note: If you have a query, simply join a discussion group and ask your question. If someone knows the answer, they'll usually answer straight away. If you want the skills of a specific developer then ping that developer and ask them questions directly.<br />
<br />
Another way is to join the ROS-dev mailing list: http://www.reactos.org/mailman/listinfo/ros-dev<br />
<br />
=== How can ReactOS help me? ===<br />
Being involved with developing ReactOS can help in the development of your own personal technical skills. ReactOS development is one of the few locations where potential Windows operating system developers can learn their craft. The majority of ReactOS devs gain their first o/s coding experience digging deep into ReactOS' internals. For others it may well be their very first experience of coding of any sort, ReactOS devs are happy to mentor, direct and teach enthusiastic but dedicated amateur coders. We even offer scholarships to student contributors for specific tasks. Apart from a career within Microsoft, there really is no better place to learn how Windows functions at the deepest technical level. You’ll find in ReactOS the possibility to move from theoretical analysis of how Windows operates to seeing how a Windows-like o/s really operates in real-life practical cases. <br />
<br />
If you are a C or C++ coder then working with like-minded coders can improve your skills in relation to Windows APIs, tools, debugging an o/s and the intricacies of developing in a cleanroom environment.<br />
<br />
Contributing toward open source projects is a positive act that demonstrates not only where your moral sentiments lie but also shows your ability to work as part of a team towards a common goal. ReactOS is an English-speaking, worldwide community that uses a wide variety of internet-based tools from social networking to online messaging platforms to achieve its aims. Experience of all these skills will be appreciated when you seek job interviews with software companies involved in operating system development. Even an organisation such as Microsoft has been known to absorb former ReactOS developers into its own ranks. <br />
<br />
By being involved in ReactOS you have the chance to boost your technical skills to the highest level, to have fun with the sure knowledge that you are doing some good to the world, promoting the use of Free and Open Source Software.<br />
<br />
=== Testing ReactOS on real hardware ===<br />
Testing on real hardware is especially important as it allows us to receive feedback on ReactOS kernel and driver compatibility. However, it is VITAL that you take precautions to avoid data loss.<br />
<br />
IF you choose to test ReactOS on real hardware then be aware that you should never do so using a computer that contains valuable data or even data that has not been backed-up elsewhere. ReactOS is an alpha-grade o/s and as such could easily damage any file system you already have loaded on that system, even if it is on another drive or on a separate partition. ReactOS file system code is as much alpha-grade as is the rest of the system. The simple rule is - just keep your valuable data away from ReactOS. Some suggest that they'd like to use ReactOS now but we strongly suggest you do NOT. By all means, test it but don't try to use it in a real-life situation other than to test it, you could do damage to your data and potentially even to the machine itself, the latter is very, very unlikely but you ought to consider it before you start testing and looking for someone to blame when things go wrong.<br />
<br />
If you want your testing to go well then choose XP or Vista era hardware as the typical combinations of hardware from that time are more likely to work with ReactOS. Later, more modern technology is best put to use running ReactOS in a VM as it is unlikely that ReactOS will boot at the hardware level at all.<br />
<br />
SUMMARY: Don't install ReactOS anywhere where it could adversely affect your precious belongings, data or otherwise.<br />
<br />
=== How can I test ReactOS without risking my existing hardware/installations? ===<br />
You can test ReactOS on [[Virtualization software|virtual hardware]] in a comparatively safe manner. This way, you can start ReactOS in a window without leaving your operating system. Official preloaded packages for Qemu, VMware, and VirtualBox are available in the "Advanced Downloads" section of the [https://www.reactos.org/download download page]. ReactOS is also known to run in Bochs and VirtualPC. If you know of other virtual machines that support it, please send an e-mail to the ros-dev mailing list.<br />
<br />
Because a virtual machine is an emulated environment, a virtual machine can not run ReactOS as fast as ReactOS could run on the actual hardware. Virtual machines like Qemu that emulate hardware at the instruction decoding level will run ReactOS much slower than actual hardware.<br />
<br />
* ''See: [[Installing ReactOS]]''<br />
<br />
=== Why isn't this or that feature in ReactOS? ===<br />
This question is asked a lot and the simple answer is almost always "because it hasn't been coded yet". If you read this FAQ from top to bottom it will become clear that ReactOS is a community effort. YOU are part of the community if you choose to donate, code or document. IF there is anything you specifically require in ReactOS then you can help make it happen, write specifications, create documentation, search for suitable FOSS code, code it yourself or engage the services of a developer to contribute actual code, you could even raise a bounty! If you want something specific done then the simple rule is - do it yourself! The alternative is to wait for the community to come up with that functionality by itself, it might be a long wait that does not suit your timescales but in the end, if it was part of Windows server 2003 then most likely it will come, just not yet.<br />
<br />
=== Why isn't ReactOS 64-bit? ===<br />
ReactOS is modeled after Windows 2003/XP and although there were 64-bit versions of this series of operating systems, the majority of users would have typically encountered the 32-bit version. A 64-bit version of ReactOS is under development and progress is steady. Do bear in mind that 64-bit support isn't the current main focus, whilst the core of ReactOS still awaits development and completion.<br />
<br />
At the time of writing this FAQ there is still no functioning 64-bit version of ReactOS for you to try but this is expected to change in the near future as the 64-bit version of ReactOS is receiving attention, please be patient in the knowledge that it will come in time.<br />
<br />
With regard to the current 32-bit target, for most practical purposes 64-bit processes are generally not required to obtain XP/2003 compatibility and currently, 32-bit proves to be enough for the majority of applications that XP/2003 NT5 is ever likely to encounter. A 32-bit Windows program designed for XP/2003 should run and operate on ReactOS as quickly and as functional as you would expect. If you have a 64-bit Windows 2003 program that requires more than 3.25gig of RAM, is compiled to take advantage of 64-bit operation then clearly a 64-bit version of the program is what you require. The 64-bit development of ReactOS will help you in this regard - when it is available. <br />
<br />
Many modern Windows 10 programs are now being compiled for 64-bit operation by default and for this reason (and others) will not run on ReactOS at the moment. Note that developers may also maintain a current 32-bit version of your desired program or perhaps an older 32-bit version may also exist for you to test. As long as they use no NT6+ APIs and they function on XP/2003 there is a good chance they will operate on ReactOS too.<br />
<br />
=== Is ReactOS able to run Windows software and Windows drivers? ===<br />
Yes. ReactOS is able to load Windows XP/2003 software and Windows drivers without hacking them. Remember: we are still in the Alpha stage so we have a long walk ahead before we reach these objectives 100%. You can visit our Software and Hardware Compatibility databases to know which Drivers and Apps are compatible with the latest ReactOS version.<br />
<br />
If your chosen software has Windows XP or Server 2003 as its compatibility target then it ought to run on ReactOS without a problem. If it does not then it is more than likely a bug in ReactOS. Later versions of programs that do not offer XP nor server 2003 compatibility may not work currently but might function in the future as support for more recent NT6 APIs are added to ReactOS.<br />
<br />
=== How about Windows Vista&trade;/7/8 or 10 programs and drivers? ===<br />
The original target for ReactOS with regard to driver and application compatibility was Microsoft Windows NT 4.0&trade;. Since then, Microsoft Windows 2000, XP, Server 2003, Vista, Win 7, 8 and Win10 have been released. All these are descendants of Windows NT. As such we can gradually shift our compatibility target without worrying about the architecture changing too much. The ReactOS team currently targets Windows 2003 Server as the official compatibility target as 2003 Server has proven to be one of the most robust.<br />
<br />
The present compatibility target for ReactOS is Microsoft Windows Server 2003&trade; (NT 5.2). Features present in later versions of Windows NT&trade; based operating systems may also be implemented in ReactOS but this is lower priority until basic NT 5.2 compatibility is completed. Work is continually being done to implement newer NT6 APIs or to provide for their future implementation.<br />
<br />
=== Why does a certain application of mine not work under ReactOS? ===<br />
ReactOS is in alpha stage and not recommended for everyday use. Many applications do not work fully or correctly because many API calls simply haven't been implemented nor are the existing ones fully operational. In any case, to put it bluntly, ReactOS is in alpha and there are lots of serious bugs. This may be the reason for your software not working. <br />
<br />
In this case, raise a bug report but do avoid ticket duplication as it is quite likely that the issue is known already. Search the bug reporting system first for a similar bug as it is important to avoid duplications. Report a bug here: [[File Bugs]].<br />
<br />
In most cases it is simply a matter of waiting for the specific bugs to be fixed - then your software will magically start to operate - one day. If you want to speed this process up then donate!<br />
<br />
=== I installed ReactOS but I don't see any applications, why not? ===<br />
Note that ReactOS is an operating system and by default an o/s doesn't necessarily come with any software pre-installed, that job is up to you. Even though that pre-installed apps may be a trend with current tablet-based OSes, it isn't a trend that ReactOS will follow. So, no Candy Crush here. There is no 'app store' like Apple and Microsoft so you are expected to select and install any software yourself, doing it manually just as we have always done so in Windows. To assist you, ReactOS has an in-built package or application manager called RAPPS that you can utilise to download programs that are known to work on ReactOS. Some of the few 'basic' apps that came with Windows NT5 will eventually come bundled in ReactOS, these may be as simple as Notepad, Paint or perhaps even a simple media player but please note that not all these have been coded yet.<br />
<br />
=== Can I install ReactOS on a pen drive/stick? ===<br />
ReactOS's state of development is a process of continuous change and as such USB support is under development but improving. For more details ''See: [[LiveUSB]]''<br />
<br />
=== My Anti-Virus claims that ReactOS has a virus ===<br />
Common sense should tell you that these must be false positives. Malware scanners that base their operation upon imperfect malware signatures can flag perfectly safe programs as being infected. In some cases, even Windows components signed by Microsoft have been flagged as malware. That is the case with ReactOS. Your scanner is flagging a ReactOS component as a false positive. We recommend that you use a tool such as VirusTotal but learn how to differentiate a malware report from a false positive. When you come across such an occurrence in ReactOS then take the correct action to report the false positive to your chosen anti-malware provider. Each tool provides such a utility, either through the tool itself or via a web page. That is your responsibility as a user of the tool.<br />
<br />
Be assured that ReactOS is FOSS and as such the code can be checked by you and by experts for any hidden malware. Anyone who chooses to do so can review the code at any time. No malware has ever been detected in ReactOS and we aim to keep it that way.<br />
<br />
=== How many cores does ReactOS support? ===<br />
ReactOS currently only supports a single core as ReactOS does not yet have an SMP-enabled kernel. However, ReactOS does run very quickly on a single core system so the lack of this feature is not as desperately needed as you would imagine at this stage in ReactOS development. SMP support will come in time. IF you know of any Windows kernel developers available to work on this feature then do let us know.<br />
<br />
=== My screen turns black when loading ReactOS. I don't see anything. ===<br />
It seems your video card is not yet compatible with ReactOS, search our list of [[Supported Hardware/Video cards]] to find a compatible one. Also, report yours as not compatible, it will help others. Share your findings!<br />
<br />
=== My ReactOS installation doesn't produce any sounds, why is that? ===<br />
It seems your sound card is not yet compatible with ReactOS, search our [[Supported Hardware/Sound cards|supported sound Hardware Compatibility list]] to find a compatible one. In addition, report yours as not compatible as it will help others. Share your findings! If you are running in a VM then there will be some configuration changes that are needed to support sound. You can find those links on that page.<br />
<br />
In truth, having said all that, ReactOS sound support is currently at quite an early stage. Lower your expectations, it is one of the areas where ReactOS is still being developed. A good bit of advice for the moment is, regardless of whether you are running ReactOS in a VM or real hardware - turn off the sound...<br />
<br />
=== Does ReactOS have a [[Psxss.exe|POSIX]] subsystem? ===<br />
* We currently don't have a [[Psxss.exe|POSIX]] subsystem. Well, we have one but it's broken and it's not a priority in terms of compatibility. After all, we're trying to run Windows programs here, not [[Psxss.exe|POSIX]] programs.<br />
* Think first: ReactOS should be stable and support a good deal of Windows apps. Then worry about [[Psxss.exe|POSIX]]/*NIX, Mac, WinCe, OS/2, RiscOS, whatever else...<br />
<br />
=== I inserted the Installation CD but the installation doesn't even begin ===<br />
It may well be that your CD/DVD is a SATA device that UniATA doesn't yet support (so neither does ReactOS). If your CD/DVD is ATA then try the next trick:<br />
<br />
OPTIONAL STEP (make backup files):<br />
* Back up uniata.sys as uniataB_UP.sys.<br />
* Back up atapi.sys as atapiB_UP.sys<br />
<br />
REPLACING<br />
* Rename uniata.sys to atapi2.sys<br />
* Rename atapi.sys to uniata.sys<br />
* Rename atapi2.sys to atapi.sys<br />
<br />
If you damage or lose the files when replacing them, you can restore the backup files from the optional step so make sure you do it. <br />
<br />
If your HD controller is an NVMe disk controller device then ReactOS does not currently support this technology. For best results on real hardware use XP era systems that would typically support XP. The drivers for that o/s should or might work in ReactOS.<br />
<br />
=== The installation hangs or hangs before reaching the Desktop ===<br />
Try the "I inserted the Installation CD but the installation doesn't begin" trick if your HDD is an ATA device. Remember that trick doesn't work at all with SATA devices.<br />
<br />
=== When will ReactOS be complete? ===<br />
The target for ReactOS is Windows Server 2003 but ReactOS will be capable of use before full compatibility is met as components and sub-systems are developed. The definition of usable is down to the use-case and only you yourself will be able to define whether ReactOS is usable for you. ReactOS is already of use now for teaching developers how to re-engineer and code a Windows-compatible o/s but it is not ready for real-life usage where o/s stability and data security is important. Since the definition of what ReactOS should be capable of when it is considered complete may vary greatly between end-users, this question cannot be completely or accurately answered. One thing is for sure: ReactOS will continue to be developed as there will always be a need for improvements, for example, although ReactOS is an NT5 based o/s, support is already being added for NT6 API compatibility to allow modern programs to operate. For more information, visit the [[Roadmap]] page (note it is impossible to provide a time-dependent roadmap at this stage of ReactOS development due to the 'community' nature of the project).<br />
<br />
=== Why is ReactOS development so slow? ===<br />
First of all, developing a Windows-compatible o/s is an enormous task due to the sheer complexity of Windows and its undocumented nature. The team cannot work with Microsoft sourced code and all development has to be done via a process called clean-room engineering ensuring that no ReactOS source is contaminated by developer exposure to any copyrighted code from Microsoft. In addition, the slow development progress is primarily due to the 'enthusiast' approach of development ie. the developers are simply people like you and I. They work on whatever task that takes their interest, spending as much of their spare time as they can, working on the project. In comparison, Microsoft employed as many as 2,000 software engineers for four years to build their first proper o/s NT3, it took another 8 years of continuous improvement to attain NT5 Windows XP.<br />
<br />
The complexity of writing an o/s from scratch also requires certain skill-sets that are not generally available within the enthusiast programming community, ie. competent Windows Kernel Developers available to contribute - are thin on the ground. The slow pace is also partly due to a lack of sponsors leading to the majority of code being contributed by unpaid effort. Despite this, recent testing shows how much ReactOS has progressed and it is remarkable how much the project has achieved ([https://reactos.org/forum/viewtopic.php?f=2&t=10972&start=1230 see ReactOS Epic Wins]) but it has a long way to go before approaching beta stage. <br />
<br />
Despite all of this, developers have a firm target and the team is a dynamic one with solid supporters and contributors, meaning that the task is achievable, it'll just take a while. The ReactOS team likes to think of progress as being steady and continuous rather than slow.<br />
<br />
If you want to view the activity that underlies the development of ReactOS then [https://chat.reactos.org/reactos/channels/activity-stream ReactOS activity stream on Mattermost].<br />
<br />
=== When is 0.5 appearing? And Beta? And 1.0? And 123.0? And... ===<br />
It depends. We need Developers and Testers (Coordinated Testers).<br />
Statistics suggest that 99.99% of the forum users who ask these questions have never helped in a Coordinated Testing. So stop asking and use that time to help us, if you want it asap then contribute a little. Money is appreciated but testing is much more useful at the current stage.<br />
<br />
We perform several Coordinated Testings via [https://chat.reactos.org/reactos/channels/town-square/ Mattermost discussion channels]. Join them and you will discover the feelings of being part of the Community, not just part of the Forum.<br />
<br />
=== Why there is no Solid [[Roadmap]]? ===<br />
An OS covers a wide area of knowledge, it is not a mere App. ReactOS is first-class OS but heavily under development.<br />
As a result, we need developers from all areas of expertise. It is not easy to find skilled kernel and o/s experienced developers, in addition, none of our regular contributors are paid. They have their real-life-work, families, and problems. They are just like you and me. You cannot press anyone to work in any particular area as their involvement is based upon voluntary contribution. We can just thank each contributor for dedicating some time to make this OS become a reality.<br />
<br />
<br />
=== Why not use UNIX instead? ===<br />
Mac OS X, Linux, BSD, and other UNIX derivatives share a common heritage based on a more than three decades old design of a simple basic operating system that has evolved over time into a complex structure. Modern incarnations like Mac OS X put a fancy graphical user interface on top of UNIX in order to hide system details but focus mainly on beginners, thus many advanced users are left out in the rain as most advanced features cannot be accessed from the graphical user interface. Almost all UNIX flavours retain some of the original design flaws but binary compatibility between various versions is usually non-existent.<br />
<br />
In theory, there are a few UNIX standards like [[Psxss.exe|POSIX]] but in practice, the standards are old and cover only the basic operating system and the terminal environment. Other standards such as the Linux Standard Base are often not implemented faithfully. As there is no standard user interface nor a standard API most people still have to use command-line applications or fight through the GUI mess. Many UNIX derivatives use the de-facto standard X-Window system for graphical output which might well possess one of the worst designs in software history. However, it must be said that modern UNIX derivatives are trying hard to catch up with recent o/s innovations and some of them already possess important features like access control list support.<br />
<br />
In contrast to UNIX, ReactOS was designed for people familiar and comfortable with the Windows environment. Everything can be done through the well known Win32 user interface and advanced users are free to automate tasks with scripts or use the console.<br />
<br />
Let me remind you that the ReactOS team are not in any manner, Microsoft haters. The opposite is true, we think that Windows is a superb operating system at its core, created by some genius minds. We simply believe that a FOSS re-implementation of Windows will provide an operating system that is free of some of the design constraints that have been imposed on more recent versions of Windows.<br />
<br />
=== Why don't you help develop Linux instead? ===<br />
It is our view that Linux + Wine can never be a full replacement for Microsoft Windows&trade;. ReactOS has the potential for a much higher degree of compatibility, especially for Microsoft Windows drivers which Wine does not address. In addition, graphical compatibility with Windows requires kernel-level access which is something that Wine cannot provide but merely emulate.<br />
<br />
=== Why don't you help the Wine project instead? ===<br />
All these projects are FOSS and working with deriving the same technologies. As such they cross pollinate. We work very closely with the Wine project and thus both projects actually benefit from each other. We have several developers in both the Wine and ReactOS projects that work on cross-compatibility issues and keeping synchronisation between both projects.<br />
<br />
Wine has a lot more in common with ReactOS than it does with Linux. The Wine project has the goal of implementing the entire Windows API on top of WineServer. We use these very same APIs in ReactOS and there are only a very few Wine DLLs that cannot be used within ReactOS. These are [[Ntdll.dll]], [[User32.dll]], [[Kernel32.dll]], [[Gdi32.dll]] and [[Advapi32.dll]]. It is our view that Linux + Wine can never be a full replacement for Microsoft Windows&trade; due to the separation that exists between the Linux kernel and Wine's graphic device calls. This separation means that Windows applications running in Wine can never operate as quickly as they would on a fully Windows compatible o/s. This is especially important for graphical applications that run within Windows' Kernel level to achieve much quicker access for graphical operations. <br />
<br />
ReactOS has the potential for a much higher degree of compatibility – especially for Microsoft Windows drivers – which Wine does not address.<br />
<br />
=== Why target x86 instead of today's fashionable CPU architecture? ===<br />
The ReactOS project has targeted the x86 architecture from the earliest days of the project. x86 hardware designed for Microsoft Windows is plentiful and drivers exist for the widest variety of peripherals. x86 may be the CPU architecture familiar to the largest number of skilled developers and programmers.<br />
<br />
Please note that Apple Computer has changed architectures from 68000 to PowerPC, x86, x64, and now touts ARM for its future laptop and desktop computers. Will RISC-V be next?<br />
<br />
=== Why use ReactOS? ===<br />
A lot of people in popular discussion forums quite rightly keep asking “why should I use ReactOS?” or “why would someone need ReactOS?” or “why not help develop Wine instead?” or “why not use Linux with Wine?”.<br />
<br />
We can answer all these questions, but it's not in one simple magic word. Let's name a few key issues here that may help to answer that question:<br />
<br />
First and foremost, no-one should actually be attempting to use ReactOS as their daily driver as it is an Alpha grade operating system under heavy development now. This means that it is unstable and possibly even quite capable of damaging your data. However, as ReactOS approaches beta it will steadily become more usable. When it finally attains stability, the following are a few reasons why you might want to use ReactOS.<br />
<br />
*There are plenty of *nix operating systems out there - this is very good. However, they have different end-user targets (they perfectly fit the server market but the desktop still isn't fully conquered and several usability factors work against most Linux-based alternatives in the market today).<br />
<br />
*There is currently no other operating system that implements the kernel architecture design of MS Windows NT&trade; so if you are unhappy with the direction or goal of Windows there is little real alternative. ReactOS was started as a “clone” of Windows NT to alleviate this situation. To demonstrate the concept of o/s cloning, GNU/Linux is the best for comparison here: Linux was started as a “clone” of Minix and Unix, eventually going on to be a Unix replacement.<br />
<br />
*There are no plans for any of Microsoft's versions of Windows to be released under a GPL-compatible license (at least, the ReactOS team and the world are not aware of them).<br />
<br />
*Linux+Wine is never going to be a complete replacement for a full Windows system. It's not only because of Linux (despite some user-friendly Linux distributions out there) and not only because many users might find a transition to Linux/BSD difficult but it is largely due to design and implementation decisions of Linux and Wine architectures which prevent 100% compatibility.<br />
<br />
*Even though Linux supports many types of hardware, Windows is still the dominant platform for device manufacturers. There are attempts to overcome this situation (like the NDIS Wrapper for NT network card drivers, there are rumours about supporting NT video drivers and Captive NTFS for NT filesystem support) but ReactOS solves them from day one by its very design – being compatible with existing drivers and existing applications.<br />
<br />
*There are many people who do not like how *nix systems behave or dislike the conventions used. For them, Linux, BSD, and Mac OS X are not options, even before application compatibility and hardware support come into play. An operating system should give the consumers what they want instead of demanding that the consumer conform. Even with Wine, you are still running an operating system that behaves quite differently from Windows at both the user and system levels.<br />
<br />
*Backwards compatibility. This is something vital for many people and companies but the development philosophies of Linux and the GNU project do not consider it a priority. The Windows family has always gone out of its way to ensure a stable API and backwards compatibility. By its design, ReactOS will also follow the philosophy of backward compatibility with existing applications designed for the whole Windows NT family whilst providing compatibility to later developments too.<br />
<br />
Finally, ReactOS offers a third alternative, for people who are fed up with Microsoft's policies but do not want to give up the familiar environment, architectural design, and millions of existing software applications, and thousands of hardware drivers.<br />
<br />
= Developer FAQ =<br />
There are several ways to contribute to the development of ReactOS. The most often encountered problem is not knowing where to begin or what to do. If you are able to program or understand the technical information that is pertinent to this project, helping the development can be easy. <br />
<br />
Please visit the [https://reactos.org/wiki/Development_Introduction Developer Introduction page] for an overview for developers so that you know where to begin.<br />
<br />
The full developer Wiki page will be found here: [https://reactos.org/wiki/Welcome_to_the_ReactOS_Development_Wiki The Developer Wiki]<br />
<br />
= See Also =<br />
* [[File Systems#FAQ|File Systems FAQ]]<br />
* [[ReactOS Explorer#FAQ|ReactOS Explorer & GUI FAQ]]<br />
* [[ReactOS Foundation#FAQ|ReactOS Website FAQ]]<br />
* [[ReactOS ports#FAQ|ReactOS Ports FAQ]] for questions about ARM, AMD64, and PowerPC<br />
* [http://www.reactos.org/forum/viewtopic.php?f=2&t=8814 ReactOS Forum FAQ]<br />
* [http://www.reactos.org/forum/viewtopic.php?f=9&t=3673 ReactOS Forum Developer FAQ]<br />
<br />
[[Category:FAQs]]</div>Learn morehttps://reactos.org/wiki/index.php?title=ReactOS_Git_For_Dummies&diff=55360ReactOS Git For Dummies2023-12-08T10:25:35Z<p>Learn more: /* Basic rules that we should try to follow */</p>
<hr />
<div>== Introduction ==<br />
=== Basic Git concepts ===<br />
Lots of information here, take it slowly!<br />
<br />
* '''Commit:''' A commit in git contains information about a set of changes to the code. It represents the same information you could see in a patch/diff file, but in an internal binary representation. Notably, a commit has some values we care about:<br />
** Hash: A SHA1 (for now) hash computed from all the data and metadata included in the commit.<br />
** Message: The first line, or 80 characters of the first line, are considered the summary, and the rest is usually shown separately.<br />
** Author: The name+email of the person that wrote the patch.<br />
** Committer: The name+email of the person that applied the patch.<br />
** Parent(s): In a standard commit, there will be one parent, represented as its commit hash. In a merge commit (see below), it would have two parents.<br />
* '''Branching:''' A git branch is merely an entry in the repository that has a HEAD property, pointing to the commit hash of the newest commit in the branch. The commit operation implicitly assigns the new hash to the branch&rsquo;s head. This gives git an extremely fast branching system, turning them into a very effective tool for managing contributions.<br />
* '''Merging:''' When two branches are merged, a new commit is created, which contains all the data necessary to apply the changes from one branch, onto the other. This is represented in the metadata by a commit with two parents. Parent 1 represents the primary source of code, and parent 2 the &ldquo;other&rdquo; branch that is being merged. Git does not distinguish between merging from master into a work branch, or from a work branch to master, in both cases a merge is &ldquo;A=A+B&rdquo; with A being the currently checked out branch, and B the chosen target to merge from. The downside of merge commits is that they can &ldquo;dirty&rdquo; the history, when merge commits pile up one after another.<br />
* '''Commit:''' A git commit encodes the modified files, along with a commit message, and authorship information, into the internal representation. The commit&rsquo;s hash is then assigned to the branch head in the local repository.<br />
* '''Clone:''' In git, everyone works based on a full copy of the history. The action of creating this copy from a remote repository into your computer, is called cloning.<br />
* '''Remotes:''' A git remote tells git about a repository in another computer (for most of us, this will be GitHub&rsquo;s servers), where you will be fetching from and/or pushing to. You can have as many remotes as you need, and with any names you want, but the most commons are named &ldquo;origin&rdquo; for your personal fork, and &ldquo;upstream&rdquo; for the repository that you are contributing to.<br />
* '''Fetch:''' In order to retrieve new commits from a remote, the fetch operation computes what data you are missing, and sends back all the compressed objects and metadata you need in order to replicate the rest of the history. This data is accessible from special branches, with names such as &ldquo;remotes/origin/master&rdquo;, where &ldquo;origin&rdquo; is the name of the remote you assigned when setting up the repository, and &ldquo;master&rdquo; is the name of the branch in the remote repository.<br />
* '''Checkout:''' Checking out is the operation of extracting the data at the state represented by the given branch/commit, and making it available in the working copy. Unlike SVN, git does not like performing a checkout with modified files, and stashing is often required.<br />
* '''Stashing:''' Git has the ability to save local modifications as patches in an internal &ldquo;stash&rdquo;. It is a common thing to stash changes before you update the working copy, and &ldquo;pop&rdquo; from the stash when you are done, to return to the previous state or apply the changes to a different branch.<br />
* '''Pull:''' You will inevitably come across tutorials and examples using the pull command. This is a combined utility command that performs a fetch operation of the selected branch, and immediately after, a merge operation from the remote branch, to the selected branch. We don&rsquo;t recommend using pull, but rather to use fetch and rebase.<br />
* '''Push:''' The reverse operation to pull. It computes the required data and sends it to the remote repository, subsequently updating the remote&rsquo;s HEAD to match your local HEAD commit hash.<br />
* '''Fast-forwarding:''' A push operation is considered to be fast-forwarding, if it adds commits following the current HEAD, and non-fast-forward if the history does not fully contain all the commits from the target.<br />
* '''Rebase:''' In the normal workflow of git, updating the state of a branch implies merging from another branch. There are cases, however, when we do not want to use a merge commit, but rather we want to re-apply all the changes on top of the new updated code. The rebase operation does exactly that: it computes the list of commits that have been added since the branches split off, and applies all of them on top of the target commit. Because the metadata will change, a rebase operation is considered to &ldquo;rewrite history&rdquo;. Because of that, rebasing is normally considered an advanced operation, and can have side-effects that may be harder to grasp for a beginner. However, we&rsquo;ll be using it extensively, so it is important to understand the idea.<br />
* '''Force-pushing:''' Git normally rejects commits that are non-fast-forward. If we amend, rebase, or otherwise modify the commit data or metadata of commits that have been previously pushed to a different branch or repository, we are implicitly generating an &ldquo;alternate history&rdquo; of those changes. Git will then refuse to accept those modifications, as they could potentially lose data, and hence is considered dangerous. Git provides a &ldquo;--force&rdquo; setting, which disables all of those checks. Because &ldquo;--force&rdquo; is extremely dangerous, it&rsquo;s highly discouraged to use this flag. However, in order to effectively use the rebase option, we do need to force-push commits, when working with ''our own work branches'' (force-pushing to the '''master''' branch of our main repository is '''strictly forbidden''' , and reserved only for administrative actions). In order to lessen the danger of the force-push operation, there is an alternative flag, namely &ldquo;--force-with-lease&rdquo;, that conditionally allows the force-push, but only if the remote state matches the local cache.<br />
* '''Pull Requests:''' When contributing as an external contributor, or when working with large change sets, spanning many commits, or with sensitive edits, we want to be able to review the changes before they are applied. In GitHub, as with most other repository hosts, a pull request offers this service. A pull request gives other developers a chance to comment, request changes, and eventually approve or reject those changes. Once the changes have been reviewed, and sufficiently approved (the number of approvals is at the discretion of the pull request&rsquo;s author -- or assignee if the author is not a team member), the Merge button allows integrating those changes into the master branch.<br />
<br />
=== FAQ ===<br />
* You spoke about parents, but what about children, which is the &ldquo;next commit&rdquo; for a given hash?<br />
** Git does not have any information about the children in the commit graph, in order to obtain the list of children (branching implies there can be many), a slow walk through all the branch histories is needed. The main method to analyze the history is to open the commit log on your favorite Git GUI tool, and locate your commit in there. Because this can sometimes be annoying, we have an alternative way through the [https://reactos.org/getbuilds GetBuilds] site, which allows navigating back and forth through the builds, giving something that approximates the linear history of SVN.<br />
<br />
<br />
== Workflow ==<br />
=== Basic rules that we should try to follow ===<br />
* '''Prefer working on a branch, and pushing to your personal fork.'''<br />
** Except for small commits that can be safely pushed to master, if you feel they are safe and you are part of the team<br />
<br />
* Avoid merge commits<br />
** This implies using rebase to ensure that all history remains linear<br />
<br />
* Keep a summary of the commit on the first line<br />
** Example: <pre>[NTOSKRNL]: Update exports to NT6.3&#10;&#10;* Added some stuff&#10;* Removed some stuff</pre><br />
<br />
=== Cloning the repository ===<br />
These are the recommended steps to set up a local clone:<br />
<br />
# Go to https://github.com/reactos/reactos and click the ''Fork'' button there to create a ''personal fork'' of the ReactOS repository.<br>This one will host your work branches and will be the source of your Pull Requests. It will be available publicly in a URL like ''<nowiki>https://github.com/&lt;yourusername&gt;/reactos</nowiki>''.<br />
#* I will be calling them ''personal fork'' to distinguish them from a project-wide fork such as OpenOffice vs LibreOffice. A personal fork is just a personal space to make changes in, with the intention of contributing them back upstream.<br />
#* Creating forks on other sites is possible, but you won't have the pull request feature, so not recommended.<br />
# Clone ''<nowiki>https://github.com/&lt;yourusername&gt;/reactos</nowiki>'' into your computer.<br />
#* Using TortoiseGit:<br>Right-click somewhere → Git Clone → Enter URL and Directory → OK<br />
#* Using the command line: <pre>git clone https://github.com/&lt;yourusername&gt;/reactos</pre><br />
# Add https://github.com/reactos/reactos as a remote named ''upstream'', so that you can fetch latest changes from the main ReactOS repository.<br />
#* Using TortoiseGit:<br />
#*# Right-click the clone folder → TortoiseGit → Settings → Remote<br />
#*# In the ''Remote:'' box, enter ''upstream''. In the ''URL'' box, enter ''https://github.com/reactos/reactos''<br />
#*# Then click ''Add New/Save'' and answer any appearing questions with ''No''<br />
#* Using the command line: <pre>git remote add upstream https://github.com/reactos/reactos</pre><br />
<br />
Now you have a local clone with two remotes:<br />
* '''origin''' - Your personal fork, where you can work in branches<br />
* '''upstream''' - The main ReactOS repository<br />
<br />
=== Updating your environment with latest code ===<br />
This is how you get the latest code set up before you start working on something new:<br />
<br />
# Checkout your local ''master'' branch (if you were working on another branch)<br />
#* Using TortoiseGit:<br>Right-click the clone folder → TortoiseGit → Switch/Checkout → Select ''master'' as ''Branch:'' → OK<br />
#* Using the command line: <pre>git checkout master</pre><br />
# Fetch the latest commits from the main ReactOS repository and apply them on top of your local master branch:<br />
#* Using TortoiseGit:<br />
#*# Right-click the clone folder → Git Sync<br />
#*# Set 'Local Branch' and 'Remote Branch' to 'master', and 'Remote URL' to upstream <br />
#*# Click the ''Fetch & Rebase'' button (it's hidden behind the arrow next to the ''Pull'' button)<br />
#* Using the command line: <pre>git fetch upstream&#10;git rebase upstream/master</pre> or simply <pre>git pull --rebase upstream master</pre><br />
<br />
=== Performing quick fixes (a.k.a. Working directly into the master branch of the main repository) ===<br />
These are the steps one would follow during normal development of a &ldquo;quick fix&rdquo; (without a work branch).<br />
It is recommended to use a work branch for anything that is more than a trivial change:<br />
<br />
# Ensure your local master is up to date following the instructions above.<br />
# Do the work. Commit early, commit often (locally).<br />
#* You can later use TortoiseGit's ''combine into one commit'', or commandline git's interactive rebase, to reduce the number of total commits you will push later, so don't worry about spamming the log!<br />
# Commit the final touches.<br />
# Fetch the latest code again following the instructions above, and use the rebase method to make sure your changes are applied on top of the latest master code.<br />
#* THIS IS VERY IMPORTANT! '''ALWAYS REBASE BEFORE PUSHING TO MASTER!'''<br />
# This is your last chance to use interactive rebase, or TortoiseGit's log window, to cleanup your commits until you are satisfied with the resulting ''patch set''.<br />
# Push to upstream<br />
#* Using TortoiseGit:<br>Right-click the clone folder → TortoiseGit → Push → Select ''master'' as ''Remote:'' under ''Ref'' and ''upstream'' as ''Remote:'' under ''Destination'' → OK<br />
#* Using the command line: <pre>git push upstream</pre><br />
# If the push operation complains about non-fastforward commits, it means someone else pushed something in between your fetch and your push, so you will have to go back to the fetch+rebase steps and try again.<br />
<br />
<br />
It should go without saying, but '''NEVER EVER FORCE-PUSH TO MASTER'''. Gladly, this is disabled on the server.<br />
<br />
<br />
=== Working on a branch ===<br />
These are the steps one would follow to work on a personal branch, backed by your personal fork, on something that can't be described as a &ldquo;quick fix&rdquo;:<br />
<br />
# Ensure your local master is up to date following the instructions above.<br />
# Create the branch with a name representative of the work you will be doing<br />
#* Using TortoiseGit:<br />
#*# Right-click the clone folder → TortoiseGit → Create Branch → Enter a name → OK<br />
#*# Right-click the clone folder → TortoiseGit → Switch/Checkout → Select your new branch → OK<br />
#* Using the command line: <pre>git branch &lt;branch-name&gt;&#10;git checkout &lt;branch-name&gt;</pre><br />
# Do the work. Commit early, commit often (locally).<br />
#* You can later use TortoiseGit's ''combine into one commit'', or commandline git's interactive rebase, to reduce the number of total commits you will push later, so don't worry about spamming the log!<br />
# Push to your personal fork (Remote: ''origin'') whenever you want to back things up online. This is optional, but recommended!<br />
#* The first time you push to your personal fork, you have to tell it explicitly about the new branch:<br />
#** Using TortoiseGit:<br />
#**# Right-click the clone folder → TortoiseGit → Push<br />
#**# Leave ''Remote:'' in ''Ref'' blank and select ''origin'' as ''Remote:'' in ''Destination''<br />
#**# Check ''Set upstream/track remote branch''<br />
#**# Click ''OK''<br />
#** Using the command line: <pre>git push --set-upstream origin &lt;branch-name&gt;</pre><br />
#* Subsequent pushes will be easier:<br />
#** Using TortoiseGit:<br>Right-click the clone folder → TortoiseGit → Push → OK<br />
#** Using the command line: <pre>git push</pre><br />
# Commit the final touches and push the result to your personal fork.<br />
# Navigate to your personal fork on GitHub, and in your branch, choose ''Create pull request''<br />
#* If the push was done very recently, it will show up on the main page of your fork<br />
# Take a final look, and maybe ask others to review the code and give their approval.<br />
#* Getting things reviewed is highly recommended, specially for bigger changes.<br />
# Once you are positive about your changes, press the ''Merge with rebase'' button that GitHub provides.<br />
<br />
<br />
If the merge button isn't enabled, it probably means GitHub can't safely rebase your changes.<br />
In that situation, you first have to rebase manually as described in [[#Updating your environment with latest code]].<br />
Then force-push into your personal fork<br />
* Using TortoiseGit:<br>Right-click the clone folder → TortoiseGit → Push → Check ''Force: May discard known changes'' → OK<br />
* Using command line: <pre>git push --force-with-lease</pre><br />
<br />
<br />
=== Applying an old patch from SVN ===<br />
We have plenty of patches in JIRA, and in our HDDs, that were created from SVN, or at least '''for''' svn.<br />
<br />
Although Git is perfectly capable of generating and applying patches, its primary patch format contains more metadata that SVN patches are lacking. Most notably, the authorship information. To work around the differences in the patch format, alternative methods need to be used to get the patch applied.<br />
<br />
Here are the steps needed to apply an old patch:<br />
<br />
# Make sure your environment is updated, and an appropriate branch is in place, as described in the previous sections.<br />
# Use the general-purpose ''patch'' program (instead of ''git apply'') or a GUI patching utility to apply the changes.<br />
#* Using TortoiseGit:<br>Right-click the patch file → TortoiseGit → Review/apply single patch<br />
#* Using the command line: <pre>patch -p1 < patchfile.patch</pre><br />
# Review the changes and write an appropriate message.<br />
# Perform the commit with a custom author<br />
#* Using TortoiseGit:<br>Check the ''Set Author'' checkbox in the Commit dialog and enter the Name and E-Mail Address of the patch author.<br />
#* Using the command line: <pre>git commit --author &quot;Name &lt;email@address.com&gt;&quot;</pre><br />
# Rebase and push as needed.<br />
<br />
== Slightly more advanced topics ==<br />
=== Amending commits ===<br />
If you notice a mistake in your last commit, Git allows you to ''amend'' it:<br />
# Do the file changes that should have been included in the last commit.<br />
# Amend the last commit:<br />
#* Using TortoiseGit:<br>Right-click the clone folder → Git Commit → Check ''Amend Last Commit''<br />
#* Using the command line: <pre>git commit --amend</pre><br />
<br />
You can also change author or date information when amending commits.<br />
TortoiseGit has additional checkboxes for this while command line Git accepts additional parameters for ''git commit''.<br />
<br />
Note that you change the history when amending commits. That means, if you have already pushed your last commit to your personal fork, you have to force-push the changes.<br />
That also means, amending a commit that has been pushed to the main ReactOS repository is not possible!<br />
<br />
Alternatively you can amend, squash or rename multiple commits at once. This is called "interactive rebasing".<br />
* Using the command line: <pre>git rebase -i HEAD~3</pre> where 3 is the number of commits to edit after HEAD.<br />
<br />
=== Removing the need to enter your user+password on push (improves security) ===<br />
Github (similarly to most other Git hosts), offers a way to authenticate your machines using SSH, replacing the need for passwords. These SSH keys are usually generated once per machine, so that if one machine becomes stolen and/or compromised, you can disavow the public key, and prevent extra damage.<br />
<br />
In order to use an SSH key, these are the steps:<br />
# Get yourself an SSH key. This depends on your environment and platform. My choice is to configure TortoiseGit to use PuTTY, generate my keys with PuTTYgen, and load them with PuTTY's Pageant (authentication agent). Another option is to use OpenSSH tools instead.<br />
#* You can find tutorials of your chosen tool, or ask someone on Mattermost for help.<br />
# Add the public key to your GitHub account, in the account settings, under ''SSH Keys''. Don't ever share the private key!<br />
# Change your local clone settings, so that your remotes point to the URL with SSH protocol.<br>You can see this URL by navigating to the repository, clicking the ''Clone or download'' button and choosing ''Use SSH''.<br />
# From this point on, pushing will not ask for your GitHub password, but it WILL ask for the SSH passphrase if your private key has one.<br />
<br />
=== Assign commits with your name & E-mail automatically ===<br />
Git gives the possibility to set up your name and E-mail within Git configuration without the need to append '''--author''' flag each time you commit. To do so you must type the following command line as follows:<br />
* Using the terminal<br />
<pre>git config --global user.name "YOUR NAME HERE"</pre><br />
<pre>git config --global user.email youremail@address.com</pre><br />
The '''--global''' flag saves your settings globally, for each commit and whatever you do in Git. The settings can be changed by typing the command lines with new name/E-mail again. To list the current Git configuration (alongside with your name and E-mail) type the following command line below:<br />
* Using the terminal<br />
<pre>git config --list</pre><br />
<br />
=== Amending your commit with name/E-mail ===<br />
If you have forgotten to sign your commit with your personal data (name and mail) you can '''amend''' the commit. To do so, you must open the terminal and type the following command line:<br />
* Using the terminal<br />
<pre>git commit --amend --author="YOUR NAME <youremail@address.com>"</pre><br />
The '''--author''' flag in the command line, alongside with the '''--amend''' flag, will amend the specific commit in your branch with your name and E-mail. Note that you must do a force push in order for the changes to take effect. For this, type the following command line:<br />
* Using the terminal<br />
<pre>git push --force-with-lease</pre><br />
'''KEEP IN MIND''' this will only update the SINGLE LAST commit of your branch! If you have more than one commits which don't have your name/E-mail assigned, then you've to '''rebase''' the branch. Assuming the commit order of your branch is A-B-C-D-E (which E is the HEAD) then the command line will be like so:<br />
* Using the terminal<br />
<pre>git rebase -i A^</pre><br />
'''NOTE''' that A is the hash of the first commit and the '''"^"''' symbol means it'll take all the commits from the branch. Git will open a text editor with the list of all the commits. Replace the text from '''pick''' to '''edit'''. When Git prompts you to change the commit, you can now sign the commit with your name/E-mail with this command line:<br />
* Using the terminal<br />
<pre>git commit --amend --author="YOUR NAME <youremail@address.com>"</pre><br />
Finally, you can do a force push.<br />
* Using the terminal<br />
<pre>git push --force-with-lease</pre><br />
<br />
[[Category:Source Control]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:Drag_source&diff=54761Techwiki:Drag source2023-03-11T15:12:28Z<p>Learn more: </p>
<hr />
<div><br />
&lArr;[[Techwiki:Main]]<br />
<br />
== non-OLE Drag source ==<br />
<br />
From https://github.com/microsoft/winfile/issues/378#issuecomment-1464841379<br />
<br />
<br />
<code>DragObject()</code> is the function that implements the dragging state and sends most of the messages. It's where all of the business logic about what dragging means is implemented. Note the caller specifies the type of the object as well as a caller allocated buffer describing the object. This function accepts two window handles. The first is the window that limits the scope of the drag; any drag outside of this window's bounds will be rejected. The second is the one processing window messages and driving the operation. It looks like the first was intended for MDI applications to restrict dragging to within themselves (using the frame window), although WinFile also uses <code>GetDesktopWindow()</code> in one call site, which is effectively disabling any restrictions on where the drag can go. Note that the later Windows 3.1 Drag & Drop API (which is really only a Drop API) would have required no restrictions on the applications that the drag could go to.<br />
<br />
<br />
<code>WM_QUERYDROPOBJECT</code> is the message that determines whether a window can accept a drop. It is sent to the childmost window, and progressively up the parent chain, until any window indicates it can accept drops. FALSE indicates not accepting drop; TRUE indicates accepting drop with a default cursor; or it can return a mouse cursor handle to use, which implies willingness to accept drops. There's an important piece of magic here, which is the list box control populates <code>dwControlData</code> with the item within the list box corresponding to the mouse location, before deferring to the parent to decide whether to accept the drop.<br />
<br />
<br />
<code>WM_DRAGSELECT</code> is used to indicate that a drag has entered or left a window. It is sent to the window that the mouse is navigating over, with a wParam of TRUE if a drag enters a window, FALSE if a drag is leaving a window.<br />
<br />
<br />
<code>WM_DRAGMOVE</code> is sent if a drag is moving within the same window, as an alternative to <code>WM_DRAGSELECT</code>. WinFile is able to use the <code>dwControlData</code> mentioned above to highlight the list item being dragged over. Note that because only one of these is sent for any mouse movement, <code>WM_DRAGSELECT</code> ends up needing to invoke the same logic as <code>WM_DRAGMOVE</code>.<br />
<br />
<br />
<code>WM_DRAGLOOP</code> is sent after <code>WM_QUERYDROPOBJECT</code> but before <code>WM_DRAGSELECT</code> or <code>WM_DRAGMOVE</code>. It is sent to the window that initiated the drag, indicating whether the drag is over a window that is willing to accept a drop. This is used to allow the window to modify the mouse cursor, and that seems to be the sole reason it exists. Note this leaves an ambiguity because both the drop window and initiating window get a chance to set the mouse cursor - there's no clear ownership about which window is responsible.<br />
<br />
<br />
<code>WM_DROPOBJECT</code> is sent at the end of a successful drop to the window that is receiving the drop.<br />
<br />
<br />
<code>WM_BEGINDRAG</code> is the most interesting, and looks unused. All of the five above are sent from <code>DragObject()</code>, but this is sent from a list box control to its parent window when the list box detects a motion that should be interpreted as a drag. In WinFile, and in other software of the era, this is instead performed by <code>WM_LBTRACKPOINT</code> which is sent from the list box to its parent when the mouse is clicked on an item. WinFile implements the logic of <code>WM_BEGINDRAG</code> via a <code>GetMessage()</code> loop in response to <code>WM_LBTRACKPOINT</code> (and its implementation is much simpler.)<br />
<br />
&lArr;[[Techwiki:Main]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:Drag_source&diff=54760Techwiki:Drag source2023-03-11T15:10:42Z<p>Learn more: Created page with "From https://github.com/microsoft/winfile/issues/378#issuecomment-1464841379 <code>DragObject()</code> is the function that implements the dragging state and sends most of t..."</p>
<hr />
<div>From https://github.com/microsoft/winfile/issues/378#issuecomment-1464841379<br />
<br />
<br />
<code>DragObject()</code> is the function that implements the dragging state and sends most of the messages. It's where all of the business logic about what dragging means is implemented. Note the caller specifies the type of the object as well as a caller allocated buffer describing the object. This function accepts two window handles. The first is the window that limits the scope of the drag; any drag outside of this window's bounds will be rejected. The second is the one processing window messages and driving the operation. It looks like the first was intended for MDI applications to restrict dragging to within themselves (using the frame window), although WinFile also uses <code>GetDesktopWindow()</code> in one call site, which is effectively disabling any restrictions on where the drag can go. Note that the later Windows 3.1 Drag & Drop API (which is really only a Drop API) would have required no restrictions on the applications that the drag could go to.<br />
<br />
<br />
<code>WM_QUERYDROPOBJECT</code> is the message that determines whether a window can accept a drop. It is sent to the childmost window, and progressively up the parent chain, until any window indicates it can accept drops. FALSE indicates not accepting drop; TRUE indicates accepting drop with a default cursor; or it can return a mouse cursor handle to use, which implies willingness to accept drops. There's an important piece of magic here, which is the list box control populates <code>dwControlData</code> with the item within the list box corresponding to the mouse location, before deferring to the parent to decide whether to accept the drop.<br />
<br />
<br />
<code>WM_DRAGSELECT</code> is used to indicate that a drag has entered or left a window. It is sent to the window that the mouse is navigating over, with a wParam of TRUE if a drag enters a window, FALSE if a drag is leaving a window.<br />
<br />
<br />
<code>WM_DRAGMOVE</code> is sent if a drag is moving within the same window, as an alternative to <code>WM_DRAGSELECT</code>. WinFile is able to use the <code>dwControlData</code> mentioned above to highlight the list item being dragged over. Note that because only one of these is sent for any mouse movement, <code>WM_DRAGSELECT</code> ends up needing to invoke the same logic as <code>WM_DRAGMOVE</code>.<br />
<br />
<br />
<code>WM_DRAGLOOP</code> is sent after <code>WM_QUERYDROPOBJECT</code> but before <code>WM_DRAGSELECT</code> or <code>WM_DRAGMOVE</code>. It is sent to the window that initiated the drag, indicating whether the drag is over a window that is willing to accept a drop. This is used to allow the window to modify the mouse cursor, and that seems to be the sole reason it exists. Note this leaves an ambiguity because both the drop window and initiating window get a chance to set the mouse cursor - there's no clear ownership about which window is responsible.<br />
<br />
<br />
<code>WM_DROPOBJECT</code> is sent at the end of a successful drop to the window that is receiving the drop.<br />
<br />
<br />
<code>WM_BEGINDRAG</code> is the most interesting, and looks unused. All of the five above are sent from <code>DragObject()</code>, but this is sent from a list box control to its parent window when the list box detects a motion that should be interpreted as a drag. In WinFile, and in other software of the era, this is instead performed by <code>WM_LBTRACKPOINT</code> which is sent from the list box to its parent when the mouse is clicked on an item. WinFile implements the logic of <code>WM_BEGINDRAG</code> via a <code>GetMessage()</code> loop in response to <code>WM_LBTRACKPOINT</code> (and its implementation is much simpler.)</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:Main&diff=54759Techwiki:Main2023-03-11T15:05:48Z<p>Learn more: /* ReactOS TechWiki */</p>
<hr />
<div>=== ReactOS TechWiki ===<br />
This is an attempt to create a technical wiki. The purpose is to document undocumented stuff, instead of having the documentation flying around in several textfiles, code comments, testcases etc.<br />
It can also serve as a documentation where our information was gathered from.<br />
<br />
* [[Abbreviations]] -- A list of technical abbreviations used on this site.<br />
* {{Techwiki|API Reference}} -- A list of Win32 API tech articles.<br />
* {{Techwiki|AppCompat}} -- Describes the Application Compatibility settings in the registry.<br />
* {{Techwiki|Behavior Differences}} -- Process paths that seem unique to Windows 2003 Server.<br />
* [[Techwiki:Crashdump Format|Crashdump Format]] -- File format and decode how-tos of crash dump files<br />
* {{Techwiki|CRT}} -- Misc CRT documentation.<br />
* {{Techwiki|Drag source}} -- Third party info about non-OLE Drag source<br />
* [[Techwiki:FastFatOverview|FastFAT Driver Overview]] -- An overview of our FastFAT driver.<br />
* [[Techwiki:hal|HAL]] -- HAL exports listed by Windows version.<br />
* [[Hungarian Notation]] -- A list of prefixes to be used in hungarian notation.<br />
* [[Techwiki:links|Interesting links]] -- Miscellaneous technical links.<br />
* {{Techwiki|KASLR}} -- Kernel address space layout randomization<br />
* {{Techwiki|Memory Layout}} -- Memory layouts listed by platform.<br />
* [[Techwiki:networking|Networking Stuff]] -- Mostly network registry configuration information.<br />
* {{Techwiki|NtGlobalFlag}} -- Explanation of NT Global Flag.<br />
* [[Techwiki:ntoskrnl|NTOSKRNL]] -- Information about the kernel image.<br />
* {{Techwiki|Performance Data Registry}} -- Information on using the raw performance data.<br />
* {{Techwiki|SEH64}} -- x64 exception handling information.<br />
* [[Shell_Documentation|Shell Documentation]] -- Documentation on our shell and hopefully the Win32 shell.<br />
* [[Techwiki:kd|The KD Protocol]] -- Information on the kernel debugging protocol.<br />
* [[Techwiki:SMP|Symmetric MultiProcessing (SMP) on NT/Windows 2003]] -- Information about how CPUs are set up in a NT SMP system.<br />
* [[Techwiki:tools|Useful tools]] -- Links to various helpful tools.<br />
* {{Techwiki|Win32k}} -- List of Win32k tech articles.<br />
* {{Techwiki|WindowStations}} -- Window Stations and SystemParamtersInfo.<br />
<br />
[[Category:Documentation]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Building_ReactOS&diff=54655Building ReactOS2023-02-11T15:28:10Z<p>Learn more: /* 3. Do the "configure" step */</p>
<hr />
<div>This page describes the steps necessary to build ReactOS.<br><br />
ReactOS supports building on different operating systems and with different compilers.<br />
Currently GCC, MSVC and LLVM/Clang can be used.<br />
<br />
The build process differs depending your operating system and the compiler of choice.<br><br />
Each build step in the tutorial is separated by OS/compiler when necessary. Choose ones which fit your configuration.<br />
<br />
== Which compiler to use ==<br />
* GCC is currently a recommended option as the most simple to use.<br />
* MSVC compiler can be used for better debugging capabilities (only MSVC builds support windbg debugger).<br />
* Clang support is currently experimental and not advised unless you know what are you doing.<br />
<br />
== Prerequisites ==<br />
* A PC with at least 2GB of RAM (4GB preferred), 15GB of free space.<br />
* Git version control system.<br />
* [[ReactOS Build Environment]] (RosBE). Please, always use the latest version available.<br />
* (optional) [https://visualstudio.microsoft.com/downloads/ Microsoft Visual Studio] 2015 or later (or Build Tools for Visual Studio).<br />
* (optional) [https://releases.llvm.org/ LLVM toolchain] 12.0.0 or later.<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed" style="overflow:auto;"><br />
<div style="font-weight:bold;line-height:1.6;">Visual Studio installation remarks</div><br />
<div class="mw-collapsible-content"><br />
* Download the Visual studio 2017 community edition (or later).<br />
: ''When selecting the options, be sure to at least include '''Desktop development with C++'''.''<br />
[[File:Desktop development.png|Desktop development]]<br />
* Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
: ''To validate this, choose '''Create a new project''', choose '''Console App''', and use all default options.''<br />
* While installing [[RosBE]], you may choose the option '''Add BIN folder to PATH variable''' (may be added later manually).<br />
[[File:RosBE BIN folder.png]]<br />
</div></div><br />
<br />
{{Notice|It is recommended to disable antivirus software before proceeding (or adding a build folder to exceptions), because some AVs may detect ReactOS' system files (in particular, crtdll.dll or csrss.exe) as being infected.}}<br />
<br />
== TL;DR ==<br />
<syntaxhighlight lang="dos"><br />
<inside RosBE command prompt><br />
git clone https://github.com/reactos/reactos<br />
cd reactos<br />
configure.cmd<br />
cd output-MinGW-i386<br />
ninja bootcd livecd<br />
</syntaxhighlight><br />
<br />
== Building instructions ==<br />
=== 1. Prepare a command prompt ===<br />
==== Windows/GCC or ReactOS/GCC ====<br />
* Just use the RosBE command prompt (from the Start menu)<br />
<br />
==== *nix/GCC ==== <br />
* Invoke <code>RosBE.sh</code> script<br />
<br />
==== *nix/Clang ====<br />
* Invoke <code>RosBE.sh</code> script, ensure <code>clang</code> is available in <code>$PATH</code><br />
<br />
==== Windows/MSVC ====<br />
* Open a Visual Studio command prompt for a desired target architecture (x86 or amd64).<br />
<br />
* Add RosBE's <code>bin</code> folder to <code>PATH</code> (if you have not done that during the RosBE installation), like this:<br />
<syntaxhighlight lang="dos"><br />
set PATH=C:\RosBE\Bin;%PATH%<br />
</syntaxhighlight><br />
<br />
* Set the <code>M4</code> and <code>BISON_PKGDATADIR</code> environment variables:<br />
<syntaxhighlight lang="dos"><br />
set M4=C:\RosBE\Bin\m4.exe<br />
set BISON_PKGDATADIR=C:\RosBE\share\bison<br />
</syntaxhighlight><br />
<br />
'''NOTE:''' <code>C:\RosBE</code> is an example path of RosBE. You may choose a different one.<br />
<br />
==== Windows/Clang ====<br />
* Same as MSVC, but also ensure that <code>clang-cl.exe</code> and other LLVM tools are added to <code>PATH</code><br />
<br />
=== 2. Obtain the source code ===<br />
<syntaxhighlight lang="bash"><br />
git clone https://github.com/reactos/reactos.git<br />
</syntaxhighlight><br />
<br />
=== 3. Do the "configure" step ===<br />
Before building the output location must be created and prepared. This is an easy step and involves only one command. This command is located in the root of recent revisions of the source code and can be run either from the root directory itself or any other directory you want the build your sources in. Please make sure you are running it from '''within a prepared build environment (step 1)'''.<br />
<br />
==== Windows or ReactOS ====<br />
<syntaxhighlight lang="dos"><br />
configure.cmd [CMake generator] [Additional CMake options]<br />
</syntaxhighlight><br />
<br />
CMake generator is one of the following:<br />
* <code>Ninja (default)</code> use Ninja as a CMake backend<br />
* <code>VSSolution</code> use MSBuild/sln file as a CMake backend (for working with the source code inside Visual Studio)<br />
<br />
==== *nix ====<br />
<syntaxhighlight lang="bash"><br />
configure.sh [Additional CMake options]<br />
</syntaxhighlight><br />
<br />
==== Additional options ====<br />
<br />
Additional CMake command line options may be passed in this format: <code>-DOPTION=VALUE</code>.<br />
Available options:<br />
<br />
* <code>ARCH</code> target architecture. Either "i386" (default), "amd64" or "arm".<br />
* <code>SARCH</code> architecture flavor. For i386 "pc" (default), "pc98" or "xbox" values are supported<br />
* <code>ENABLE_ROSTESTS</code> include tests in the build. Either "0" (default) or "1".<br />
* <code>ENABLE_ROSAPPS</code> include extra utilities in the build. Either "0" (default) or "1".<br />
* <code>PCH</code> enable [https://en.wikipedia.org/wiki/Precompiled_header precompiled headers] to increase the build speed. NOTE: may consume 7-15GB more space. Defaults to "1" for MSVC and "0" for GCC.<br />
* <code>USE_CLANG_CL</code> use clang-cl compiler instead of cl (only on Windows). Either "0" (default) or "1".<br />
* <code>NO_REACTOS_BUILDNO</code> do not include commit hash and date in the image. This allows to avoid recompiling the image when date changes. Either "0" (default) or "1".<br />
<br />
So to configure an MSVC build with ninja and rosapps and rostests, you would use:<br />
<syntaxhighlight lang="dos"><br />
configure.cmd -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1<br />
</syntaxhighlight><br />
<br />
=== 4. Start the build ===<br />
This step depends on what has been chosen as a CMake generator. <br />
<br />
==== Ninja ====<br />
<br />
From the build folder (e.g. reactos\output-MinGW-i386) enter the following command:<br />
<syntaxhighlight lang="dos"><br />
ninja [targets]<br />
</syntaxhighlight><br />
<br />
Available targets are:<br />
* <code>bootcd</code> creates an installation ISO to install ReactOS on a VM or PC.<br />
* <code>livecd</code> creates a live CD ISO to try ReactOS without installing.<br />
* <code>all</code> builds all binaries of ReactOS. ISO files are not created though.<br />
* <code>clean</code> cleans all files of your working copy except the generated ISO files (if any).<br />
* Any other binary file ReactOS consists of, for example <code>kernel32</code> or <code>ntoskrnl</code><br />
<br />
==== VSSolution (Visual Studio) ====<br />
<br />
{{Warning|Visual Studio (VSSolution) build cannot currently produce a bootable ISOs so use it for working with individual user-mode apps (like notepad, rapps or paint). For building bootcd or livecd configuration, please use Ninja option.}}<br />
''For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.''<br />
<br />
* If configure step went well, this message should appear:<br />
<pre><br />
Configure script complete! You can now use msbuild or open REACTOS.sln.<br />
</pre><br />
* There should now be a REACTOS.sln in your build folder (Which contains ALL projects!)<br />
* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 <code>project(rapps)</code>]] macro, there will also be a smaller solution just for rapps at <code>base\applications\rapps\rapps.sln</code><br />
* Open this solution, and expand <code>base\rapplications\rapps</code><br />
* Right click rapps, choose '''Set as Startup Project'''<br />
[[File:Set as Startup Project.png]]<br />
* Press '''Debug->Start Debugging''' in the menu, or the hotkey that is displayed behind it (usually <kbd>F5</kbd>)<br />
<br />
== See also ==<br />
* [[Installing ReactOS]]<br />
* [[Developing ReactOS with Visual Studio]]<br />
* [[Building MINGW-w64]]<br />
* (historical) [[RBuild]]<br />
<br />
[[Category:Building]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:CRT&diff=54609Techwiki:CRT2023-01-29T21:09:04Z<p>Learn more: </p>
<hr />
<div>&lArr;[[Techwiki:Main]]<br />
<br />
<br />
This page is for documenting the Windows CRT.<br />
<br />
<br />
=== Math ===<br />
<br />
'''_matherr'''<br />
<br />
_matherr is used to report errors in the CRT's math functions. It works as a callback function. If provided in an executable's code, it will be invoked whenever an error occurs. The CRT startup code that is statically linked to every executable calls <code>__setusermatherror(_matherr)</code> to set the _matherr function to either a function provided by the developer or to the dummy fallback in the CRT library, which does nothing and returns 0.<br />
<br />
_matherr exists in multiple places:<br />
<br />
* In msvcrt.lib (in ReactOS this is msvcrtex) as a dummy function, which is linked, when no other version is provided.<br />
* In libcntpr as a dummy function.<br />
* In libcmt as a dummy function.<br />
* In crtdll.dll as an export, which is also a dummy.<br />
* In ntdll.dll as an internal dummy.<br />
* In msvcrt as an internal function, which actually has an implementation: it calls the function registered by __setusermatherror.<br />
<br />
In summary: _matherr is a dummy, except for the internal implementation in msvcrt, which is not required to be called _matherr, but probably only has that name for historic purposes (before __setusermatherror existed).<br />
<br />
A compatible implementation can simply use something like <code>_invoke_matherr()</code>, which would be implemented in msvcrt.dll and libcmt, and a dummy in ntdll/crtdll/libcntpr.<br />
<br />
<br />
&lArr;[[Techwiki:Main]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:Memory_Layout&diff=54608Techwiki:Memory Layout2023-01-29T21:08:35Z<p>Learn more: </p>
<hr />
<div>&lArr;[[Techwiki:Main]]<br />
<br />
== x86 (non-PAE) ==<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 00000000 || UserMode Addresses<br />
|-<br />
| 7FFFF000 || No Access Area (64kB)<br />
|-<br />
| 80000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| 8??????? || PFN database<br />
|-<br />
| BD000000 || MiSessionPoolStart = MmSessionBase<br />
|-<br />
| BE000000 || MiSessionViewStart<br />
|-<br />
| BF800000 || MiSessionImageStart (default)<br />
|-<br />
| C0000000 || Page Table pages - 4Mb<br />
|-<br />
| C0400000 || HyperSpace<br />
|-<br />
| C0C00000 || System Cache structures<br />
|-<br />
| C1000000 || System Cache<br />
|-<br />
| E1000000 || Paged System area<br />
|-<br />
| ???????? || System PTE area<br />
|-<br />
| ???????? || Nonpaged System area<br />
|-<br />
| FFBE0000 || Crash dump driver area<br />
|-<br />
| FFC00000 || Reserved for HAL (4mb)<br />
|-<br />
| FFDFF000 || Boot PCR (KIP0PCRADDRESS)<br />
|}<br />
<br />
== IBM PowerPC ==<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 00000000 || UserMode Addresses<br />
|-<br />
| 7FFFF000 || No Access Area (64kB)<br />
|-<br />
| 80000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| 90000000 || System Cache working set<br />
|-<br />
| 90400000 || System Cache<br />
|-<br />
| A0000000 || Kernel segment<br />
|-<br />
| C0000000 || Page Table pages - 4Mb - Kernel Only<br />
|-<br />
| C0400000 || HyperSpace<br />
|-<br />
| D0000000 || System Mapped Views<br />
|-<br />
| D3000000 || Paged System area<br />
|-<br />
| EFBFFFFF || Nonpaged System area<br />
|-<br />
| FFFFD000 || PCR Structure, per processor<br />
|-<br />
| FFFFF000 || Debugger Page<br />
|}<br />
<br />
<br />
== MIPS R-Series ==<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 00000000 || UserMode Addresses<br />
|-<br />
| 7FFFF000 || No Access Area (64kB)<br />
|-<br />
| 80000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| A0000000 || Kernel segment<br />
|-<br />
| C0000000 || Page Table pages - 4Mb - Kernel Only<br />
|-<br />
| C2400000 || HyperSpace<br />
|-<br />
| C2800000 || System Cache structures<br />
|-<br />
| C2C00000 || System Cache<br />
|-<br />
| DE000000 || System Mapped Views<br />
|-<br />
| FFBFFFFF || Nonpaged System area<br />
|-<br />
| FFC00000 || Reserved for HAL (4mb)<br />
|}<br />
<br />
<br />
== DEC Alpha (32bit) ==<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 00000000 || UserMode Addresses<br />
|-<br />
| 7FFFF000 || No Access Area (64kB)<br />
|-<br />
| 80000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| C0000000 || Page Table pages - 2Mb - Kernel Only<br />
|-<br />
| C1000000 || HyperSpace<br />
|-<br />
| C2000000 || PTEs<br />
|-<br />
| C3000000 || System Cache structures<br />
|-<br />
| C4000000 || System Cache<br />
|-<br />
| DE000000 || System Mapped Views<br />
|-<br />
| E1000000 || Paged System area<br />
|-<br />
| F0000000 || Nonpaged System area<br />
|-<br />
| FE000000 || Reserved for HAL (4mb)<br />
|}<br />
<br />
<br />
== DEC Alpha (64bit) AXP64 ==<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 0000000000000000 || UserMode Addresses (4TB)<br />
|-<br />
| 000003FFFFFF0000 || No Access Area (64kB)<br />
|-<br />
| FFFFFC0000000000 || Start of System area, 2TB accessable<br />
|-<br />
| FFFFFE0000000000 || 8GB three-level Page Table map<br />
|-<br />
| FFFFFE0400000000 || Reserved for Win32k.sys<br />
|-<br />
| FFFFFE0600000000 || System Cache working set<br />
|-<br />
| FFFFFE0800000000 || System Cache (1TB)<br />
|-<br />
| FFFFFF0800000000 || Start of Paged System Area. (128GB)<br />
|-<br />
| FFFFFF2800000000 || System PTE Pool (128GB)<br />
|-<br />
| FFFFFF67FFFFFFFF || Nonpaged System area (128GB)<br />
|-<br />
| FFFFFFFF80000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| FFFFFFFFFF000000 || Shared System Page<br />
|-<br />
| FFFFFFFFFF002000 || Reserved for HAL<br />
|}<br />
<br />
<br />
== Intel Itanium ia64 ==<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Description<br />
|-<br />
| 0000000000000000 || UserMode Addresses (8084GB)<br />
|-<br />
| 000003FFFFFF0000 || No Access Area (64kB)<br />
|-<br />
| 0000040000000000 || HyperSpace<br />
|-<br />
| 1FFFFF0000000000 || 8gb Leaf level Page Table map<br />
|-<br />
| 2000000000000000 || win32k.sys reserved (8gb)<br />
|-<br />
| 3FFFFF0000000000 || 8gb Leaf level Page Table map<br />
|-<br />
| 8000000000000000 || Addressable Physical Memory<br />
|-<br />
| E000000080000000 || HAL/NTOSKRNL/Boot Drivers<br />
|-<br />
| E0000000A0000000 || Reserved for Win32k.sys<br />
|-<br />
| E0000000FF002000 || Reserved for HAL<br />
|-<br />
| E000000400000000 || System Cache working set<br />
|-<br />
| E000000600000000 || System Cache (1TB)<br />
|-<br />
| E000010600000000 || Start of Paged System Area. (128GB)<br />
|-<br />
| E000014600000000 || System PTE Pool (128GB)<br />
|-<br />
| E00001465FFFFFFF || Nonpaged System area (128GB)<br />
|-<br />
| E000040000000000 || PFN Database (2TB)<br />
|-<br />
| FFFFFF0000000000 || 8gb Leaf level Page Table map<br />
|}<br />
<br />
== AMD64 ==<br />
<br />
Windows 2003 (based on Windows internals 4):<br />
{| class="wikitable"<br />
! Address<br />
! Size<br />
! Description<br />
|-<br />
| 0000000000000000 - 000007FFFFFEFFFF || 8TB-64k || UserMode Addresses<br />
|-<br />
| 000007FFFFFF0000 - 000007FFFFFFFFFF || 64k || No Access Area<br />
|-<br />
| 0000080000000000 - FFFF7FFFFFFFFFFF || || -<br />
|-<br />
| FFFF800000000000 - FFFFF67FFFFFFFFF || || Start of system space<br />
|-<br />
| FFFFF68000000000 - FFFFF6FFFFFFFFFF || 512 GB || 4 lvl page table map<br />
|-<br />
| FFFFF70000000000 - FFFFF77FFFFFFFFF || 512 GB || HyperSpace<br />
|-<br />
| FFFFF78000000000 - FFFFF77000000FFF || 4 KB || Shared system page<br />
|-<br />
| FFFFF78000001000 - FFFFF7FFFFFFFFFF || 512 GB || system working set<br />
|-<br />
| FFFFF80000000000 - FFFFF8FFFFFFFFFF || 1 TB || Mappings initialized by the loader<br />
|-<br />
| FFFFF90000000000 - FFFFF97FFFFFFFFF || 512 GB || Session space<br />
|-<br />
| FFFFF98000000000 - FFFFFA7FFFFFFFFF || 1 TB || System cache<br />
|-<br />
| FFFFFA8000000000 - FFFFFA9FFFFFFFFF || 128 GB || Start of Paged System Area.<br />
|-<br />
| FFFFFAA000000000 - FFFFFABFFFFFFFFF || 128 GB || System PTE pool (MmNonPagedSystemStart)<br />
|-<br />
| FFFFFAC000000000 - FFFFFADFFFFFFFFF || 128 GB || Non paged pool<br />
|-<br />
| FFFFFAE000000000 - FFFFFFFFFFFFFFFF || 2 GB || Reserved for HAL <br />
|-<br />
| FFFFFFFFFFFFFFFF || || End of VA space<br />
|}<br />
<br />
<br />
Windows Vista+ (based on http://www.codemachine.com/tool_cmkd.html#kvas / http://www.codemachine.com/article_x64kvas.html):<br />
{| class="wikitable"<br />
! Address<br />
! Size<br />
! Description<br />
|-<br />
| 0000000000000000 - 000007FFFFFEFFFF || 8TB-64k || UserMode Addresses<br />
|-<br />
| 000007FFFFFF0000 - 000007FFFFFFFFFF || 64k || No Access Area<br />
|-<br />
| 0000080000000000 - FFFF7FFFFFFFFFFF || || -<br />
|-<br />
| FFFF800000000000 - FFFFF67FFFFFFFFF || 238 TB || System space<br />
|-<br />
| FFFFF68000000000 - FFFFF6FFFFFFFFFF || 512 GB || Page tables<br />
|-<br />
| FFFFF70000000000 - FFFFF77FFFFFFFFF || 512 GB || HyperSpace<br />
|-<br />
| FFFFF78000000000 - FFFFF78000000FFF || 4 KB || Shared system page<br />
|-<br />
| FFFFF78000001000 - FFFFF7FFFFFFFFFF || 511 GB || Cache working set<br />
|-<br />
| FFFFF80000000000 - FFFFF87FFFFFFFFF || 512 GB || Loader mappings<br />
|-<br />
| FFFFF88000000000 - FFFFF89FFFFFFFFF || 128 GB || System PTEs<br />
|-<br />
| FFFFF8A000000000 - FFFFF8BFFFFFFFFF || 128 GB || Paged pool<br />
|-<br />
| FFFFF8C000000000 - FFFFF8FFFFFFFFFF || <br />
|-<br />
| FFFFF90000000000 - FFFFF97FFFFFFFFF || 512 GB || Session space<br />
|-<br />
| FFFFF98000000000 - FFFFFA7FFFFFFFFF || 1 TB || Dynamic kernel VA<br />
|-<br />
| FFFFFA8000000000 - FFFFF??????????? || up to 8 TB || Pfn database<br />
|-<br />
| FFFFF??????????? - FFFFFFFFFFBFFFFF || up to 128 GB || Non paged pool<br />
|-<br />
| FFFFFFFFFFC00000 - FFFFFFFFFFFFFFFF || 4 MB || Hal reserved<br />
|-<br />
| FFFFFFFFFFFFFFFF || || End of VA space<br />
|}<br />
<br />
Note: On Windows MmSystemRangeStart contains the value 0xFFFF080000000000, this is probably a typo.<br />
The real system range start is 0xFFFF800000000000<br />
<br />
Session space layout:<br />
<br />
{| class="wikitable"<br />
! Address<br />
! Size<br />
! Description<br />
|-<br />
| FFFFF90000000000 - FFFFF90000001E57 || 8 KB || ???<br />
|-<br />
| FFFFF90000001E58 - FFFFF90000010000 || 56 KB || MiSessionSpecialPool<br />
|-<br />
| FFFFF90000010000 - FFFFF90000011FFF || 8 KB || MiSessionDynamicVaBitBuffer<br />
|-<br />
| FFFFF90000012000 - FFFFF90000411FFF || 4 MB || MiSessionDynamicPoolBitBuffer<br />
|-<br />
| FFFFF90000412000 - FFFFF90000811FFF || 4 MB || MiSessionDynamicPtesBitBuffer<br />
|-<br />
| FFFFF90000812000 - FFFFF90080000FFF || 2039 MB || MiSessionSpaceWs<br />
|-<br />
| FFFFF90080001000 - FFFFF900A0101007 || 513 MB || MiSessionWsHashStart .. MiSessionWsHashEnd-1<br />
|-<br />
| FFFFF900C0000000 - FFFFF97FFFFFFFFF || 509 GB || MiSessionDynamicVaStart<br />
|}<br />
<br />
<br />
&lArr;[[Techwiki:Main]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:KASLR&diff=54607Techwiki:KASLR2023-01-29T21:08:00Z<p>Learn more: </p>
<hr />
<div>&lArr;[[Techwiki:Main]]<br />
<br />
This page describes KASLR on Windows / ReactOS. It's a WIP draft.<br />
<br />
= Overview =<br />
KASLR means Kernel adress space layout randomization<br />
<br />
= Considerations =<br />
* The boot loaded images are loaded by the bootloader and while it might theoretically be possible to relocate them in the kernel, that introduces more complexity as reasonable, therefore it makes more sense to randomize this location in the bootloader.<br />
* The page tables are also initialized from the bootloader. Changing the mapping in the kernel should be possible and easier than relocating the kernel image, but doing it from freeldr should be considered, too.<br />
* Some regions (page tables, hyperspace, session space) need a full top-level P*E entry. These should be randomized early (unless already done so by the bootloader).<br />
* The shared system page has a hardcoded address and is therefore not available for any other mappings.<br />
* There is a major difference between 32 and 64 bit: while on 64 bit the address space is so vast, that everything can be highly randomized (either at PXE or PPE level), the situation is quite different on x86, where the address space is pretty tight and requires a different approach, taking actual sizes (bootloaded images, PFN database) into account and to predetermine reasonable maximum sizes for other regions (np pool, paged pool, system cache, ...).<br />
* Currently kernel stacks are allocated from system PTEs. This is slightly problematic, since system PTEs are a relatively scarce resource and using it for something as common as kernel stacks can quickly deplete them. On x64 this also causes a huge problem with fragmentation (this is less of a problem on x86, where GUI stacks use twice the amount of system PTEs as normal kernel stacks thus one GUI stack can be reused by 2 normal kernel stacks and vice versa, reducing the fragmentation) requiring to massively increase the system PTE space to avoid problems. It would be much better to have dedicated regions to allocate kernel stacks from, on x64 split into 2 regions for normal and GUI stacks (the alternative is to simply reserve the size of a GUI stack and extend it when it's converted to a GUI stack, which seems more efficient, considering, that there is enough space). On x86, allocating kernel stacks from a dedicated region might tighten the address space even more, but it could also free up one wasted PTE per stack (used for system PTE bookkeeping). On x64 it might be more reasonable to have to separate regions for normal and GUI stacks to entirely avoid any fragmentation, while on x86 it might be more reasonable to have one region for both stacks to avoid wasting space, and allocate the GUI stacks on an aligned boundary if available and to allocate normal stacks preferably when the free space is too small for a GUI stack. Another alternative is to use multiple stack segments and allocate a new one for each user mode GUI callback (as done on Windows), but that can also waste quite a bit of stack space.<br />
* Choosing randomized locations instead of "packing" the address space can lead to additional memory usage. Usually this would be an average of half a page per region of actual pages, plus an additional few page tables. This is not a big issue for the normal randomization of regions. It gets bigger when kernel images are also highly randomized, but it would still only ammount to maybe a few hundred pages, which is not a problem. It becomes problematic though, when large pages are used. Large pages can still be used without any problem for regions like the PFN database or non-paged pool, but they become less efficient, when it comes to image mappings, if those are also highly randomized (which is probably more of a thing on x64, rather than on x86). A possible mitigation would be a prefetcher, that knows what images are to be loaded, and can reallocate a randomized, but contiguous range before the images are actually loaded.<br />
<br />
<br />
= Windows implementation =<br />
Describe on a high level, how it's implemented on Windows...<br />
* https://ininet.org/advances-in-memory-management-for-windows.html<br />
* https://kernelstruct.gitee.io/kernels/x86/Windows%2010/2004%2020H1%20(May%202020%20Update)/_MI_SYSTEM_VA_STATE<br />
* https://kernelstruct.gitee.io/kernels/x64/Windows%2010%20|%202016/2004%2020H1%20(May%202020%20Update)/_MI_VISIBLE_STATE<br />
* https://kernelstruct.gitee.io/kernels/x64/Windows%2010%20|%202016/2004%2020H1%20(May%202020%20Update)/_PROCESS_VA_TYPE<br />
* https://codemachine.com/articles/x64_kernel_virtual_address_space_layout.html<br />
<br />
==== System VA types on Windows ====<br />
<pre><br />
enum _MI_SYSTEM_VA_TYPE<br />
{<br />
MiVaUnused = 0,<br />
MiVaSessionSpace = 1,<br />
MiVaProcessSpace = 2,<br />
MiVaBootLoaded = 3,<br />
MiVaPfnDatabase = 4,<br />
MiVaNonPagedPool = 5,<br />
MiVaPagedPool = 6,<br />
#if (NTDDI_VERSION < NTDDI_WIN7)<br />
MiVaSpecialPool = 7,<br />
#else<br />
MiVaSpecialPoolPaged = 7,<br />
#endif<br />
MiVaSystemCache = 8,<br />
MiVaSystemPtes = 9,<br />
MiVaHal = 10,<br />
MiVaSessionGlobalSpace = 11,<br />
MiVaDriverImages = 12,<br />
#if (NTDDI_VERSION >= NTDDI_WIN7) && (NTDDI_VERSION < NTDDI_WIN1019H2)<br />
MiVaSpecialPoolNonPaged,<br />
#endif<br />
#if (NTDDI_VERSION >= NTDDI_WIN8) && (NTDDI_VERSION < NTDDI_WIN1019H2)<br />
MiVaPagedProtoPool,<br />
#endif<br />
#if (NTDDI_VERSION >= NTDDI_WIN10RS3)<br />
MiVaSystemPtesLarge,<br />
MiVaKernelStacks,<br />
#endif<br />
#if (NTDDI_VERSION >= NTDDI_WIN10_20H1)<br />
MiVaSecureNonPagedPool,<br />
#endif<br />
MiVaMaximumType,<br />
#if (NTDDI_VERSION >= NTDDI_WINBLUE) && (NTDDI_VERSION < NTDDI_WIN10RS3)<br />
MiVaSystemPtesLarge,<br />
#endif<br />
};<br />
</pre><br />
<br />
= Design proposal for ReactOS =<br />
<br />
<br />
&lArr;[[Techwiki:Main]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:AppCompat&diff=54606Techwiki:AppCompat2023-01-29T21:04:00Z<p>Learn more: /* Per application settings */</p>
<hr />
<div><br />
&lArr;[[Techwiki:Main]]<br />
<br />
<br />
== Registry storage ==<br />
The AppCompat settings are stored in the registry in the key 'HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags'.<br />
<br />
=== Per application settings ===<br />
For each program on the system that has been configured with AppCompat settings, there is one REG_SZ value in the 'Layers' subkey of the AppCompatFlags key.<br />
The name of the value is the DOS path of the application, the value contains the settings as a space speparated list.<br />
* Compatibility version: WIN95 WIN98 WINNT4SP5 WIN2000 WINXPSP2 WINXPSP3 WINSRV03SP1 WINSRV08SP1 VISTARTM VISTASP1 VISTASP2 WIN7RTM<br />
* Compatibility flags: 256COLOR 640X480 DISABLETHEMES DISABLEDWM HIGHDPIAWARE<br />
Windows allows any order of these settings. If the OS version is defined twice, the Compatibility tab in the application properties will show the OS that correspeonds with the last entry.<br />
<br />
Read/Write with SdbGetPermLayerKeys/SetPermLayerState.<br />
<br />
See https://git.reactos.org/?p=reactos.git;a=blob;f=dll/shellext/acppage/CLayerUIPropPage.cpp;hb=7a17c7d9adadf88eafc382d792771bea5fc412f8#l27 for a list of modes that can be set with the 'Compatibility' tab<br />
<br />
<br />
&lArr;[[Techwiki:Main]]<br />
<br />
<br />
See also: [[User:Learn_more/Appcompat]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Techwiki:Main&diff=54605Techwiki:Main2023-01-29T21:00:16Z<p>Learn more: </p>
<hr />
<div>=== ReactOS TechWiki ===<br />
This is an attempt to create a technical wiki. The purpose is to document undocumented stuff, instead of having the documentation flying around in several textfiles, code comments, testcases etc.<br />
It can also serve as a documentation where our information was gathered from.<br />
<br />
* [[Abbreviations]] -- A list of technical abbreviations used on this site.<br />
* {{Techwiki|API Reference}} -- A list of Win32 API tech articles.<br />
* {{Techwiki|AppCompat}} -- Describes the Application Compatibility settings in the registry.<br />
* {{Techwiki|Behavior Differences}} -- Process paths that seem unique to Windows 2003 Server.<br />
* [[Techwiki:Crashdump Format|Crashdump Format]] -- File format and decode how-tos of crash dump files<br />
* {{Techwiki|CRT}} -- Misc CRT documentation.<br />
* [[Techwiki:FastFatOverview|FastFAT Driver Overview]] -- An overview of our FastFAT driver.<br />
* [[Techwiki:hal|HAL]] -- HAL exports listed by Windows version.<br />
* [[Hungarian Notation]] -- A list of prefixes to be used in hungarian notation.<br />
* [[Techwiki:links|Interesting links]] -- Miscellaneous technical links.<br />
* {{Techwiki|KASLR}} -- Kernel address space layout randomization<br />
* {{Techwiki|Memory Layout}} -- Memory layouts listed by platform.<br />
* [[Techwiki:networking|Networking Stuff]] -- Mostly network registry configuration information.<br />
* {{Techwiki|NtGlobalFlag}} -- Explanation of NT Global Flag.<br />
* [[Techwiki:ntoskrnl|NTOSKRNL]] -- Information about the kernel image.<br />
* {{Techwiki|Performance Data Registry}} -- Information on using the raw performance data.<br />
* {{Techwiki|SEH64}} -- x64 exception handling information.<br />
* [[Shell_Documentation|Shell Documentation]] -- Documentation on our shell and hopefully the Win32 shell.<br />
* [[Techwiki:kd|The KD Protocol]] -- Information on the kernel debugging protocol.<br />
* [[Techwiki:SMP|Symmetric MultiProcessing (SMP) on NT/Windows 2003]] -- Information about how CPUs are set up in a NT SMP system.<br />
* [[Techwiki:tools|Useful tools]] -- Links to various helpful tools.<br />
* {{Techwiki|Win32k}} -- List of Win32k tech articles.<br />
* {{Techwiki|WindowStations}} -- Window Stations and SystemParamtersInfo.<br />
<br />
[[Category:Documentation]]</div>Learn morehttps://reactos.org/wiki/index.php?title=ReactOS_Remote_Debugger&diff=54406ReactOS Remote Debugger2022-11-19T16:52:46Z<p>Learn more: </p>
<hr />
<div>{{Warning|This page is outdated, and commands from this page might not work anymore.}}<br />
<br />
'''ReactOS Remote Debugger''' is a debugging shell that can take protocol modules (currently only for talking to [[Kdbg|KDBG]]), <tt>.nostrip</tt> files from the ReactOS build, and aggregate information in a way that is a bit impractical in KDBG. It is a Windows forms application (C#) with a number of window types, a simple poor man's dockability, and tabs.<br />
<br />
It has a local variables window, backtrace, debug interaction, threads, and processes. It can display a lot of info and will become more useful as features are fleshed out.<br />
<br />
== Source code ==<br />
https://github.com/reactos/reactosdbg<br />
<br />
== Binaries ==<br />
Unofficial download link: [http://www.4shared.com/file/128096613/1eb0dcad/RosDBG-42955.html Rev-42955].<br />
<br />
== Setting it up ==<br />
You need a full build with <code>ROS_BUILDNOSTRIP=yes</code>. Clean before building it the first time as already built (and up to date) modules will not be rebuilt. Do it like this:<br />
<br />
make ROS_BUILDNOSTRIP=yes bootcd<br />
<br />
Now that you've got symbols, select your source directory and output directory in the 'Extras|Settings...' menu of ReactOS Remote Debugger. Set the source directory to the 'reactos' directory that contains your sources. Set the output directory to the output-i386 directory you build into.<br />
<br />
Make sure your <tt>freeldr.ini</tt> boots ReactOS like this:<br />
<br />
Options=/DEBUG /DEBUGPORT=COM1 /KDSERIAL /BAUDRATE=115200<br />
<br />
Actually, you can use any baud rate you want as long as your cabling allows a relatively low error rate. Optionally add /BREAK to break in early.<br />
<br />
Newer builds of ReactOS already have a ReactOS (RosDbg) option in [[FreeLoader]] (/KDSERIAL only).<br />
<br />
== Using the debugger ==<br />
=== Real hardware ===<br />
Connect your null modem cable between com ports on your two computers and connect using the serial interface.<br />
<br />
=== Virtual machines ===<br />
Virtual machine specific debugging details can be found on the VM pages:<br />
* [[QEMU]]<br />
* [[VirtualBox]]<br />
* [[VMware]]<br />
<br />
==== TCP/IP (QEMU only) ====<br />
Add<br />
<br />
-serial tcp::1235,server<br />
<br />
to your QEMU command line.<br />
<br />
==== Serial connection (QEMU, VMware, VirtualBox) ====<br />
Use the serial port output together with the com0com driver (more [[Com0com|here]]). The ReactOS Remote Debugger is your terminal application in this case.<br />
<br />
==== Named pipe (QEMU, VMware, VirtualBox) ====<br />
Serial port configuration in VMWARE:<br />
<br />
[[File:Vmware-pipe-cfg.png]]<br />
<br />
== Breaking in ==<br />
If all goes well, connect to a running ReactOS instance and crash it (or hit Tab+K) and you'll break-in in the debugger. The ReactOS Remote Debugger will request a number of updates from KDBG to see where things are, examine the stack, etc. If you don't see this traffic, the most likely reason is that you've booted without /KDSERIAL, and KDBG input is coming from the keyboard. Boot ReactOS with the "ReactOS (RosDbg)" option in this case.<br />
<br />
If you see garbage and you're on a serial port, the most likely reason is that you've got ReactOS Remote Debugger and ReactOS set to different baud rates. We don't support auto baud setting yet, although somebody might be able to implement it fairly easily. It could also be dangerous at early /BREAK.<br />
<br />
If all goes well, ReactOS will break in, ReactOSDbg will poke around, and display a number of line in backtrace (addresses followed by source file and line number), and will populate the locals and threads+processes data grids.<br />
<br />
You can check that your locals appear by putting an __asm__("int3"); in your code. You should see all locally scoped variables and their values in the locals window when ReactOS breaks in.<br />
<br />
Unlike KDBG, ReactOS Remote Debugger uses dbghelp.dll (the wine version, that reads stabs) to read the local copy of the .nostrip files that are the byproduct of the ROS_BUILDNOSTRIP=yes build. Unlike the abbreviated rossym sections in the canonical binaries (suitable only for line number information), these contain all the information that's normally used by GDB to examine values in a running process. Since it doesn't rely on KDBG to lookup debug info, we could run a fully stripped build and still get debug info on the host (that is; debug a release build in a sensible way), and eventually, it'll be switched to kd protocol when ReactOS supports it. After that, it could be used to debug real windows, when given appropriate PDB files and the redistributable dbghelp.dll.<br />
<br />
== Notes and troubles ==<br />
The most common complaint is that the channel back to ReactOS doesn't respond. You have to start ReactOS with the "ReactOS (RosDbg)" FreeLDR option. If there is no such option, you have to add /KDSERIAL to your freeldr.ini boot options manually.<br />
<br />
KDBG, being a human interaction protocol, doesn't support retransmission. Luckily, ReactOSDbg is mostly stateless and responds to reports from KDBG as they become available. When in doubt, typing 'regs' and hitting return into the command prompt should get the essential updates flowing. It'll have a better automatic mechanism for that at some point in the future.<br />
[[Category:ReactOS Software]]<br />
[[Category:ReactOS Components]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=54014Developing ReactOS with Visual Studio2022-05-18T16:55:48Z<p>Learn more: </p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
''This workflow is mainly for working on usermode applications.''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
If you have already installed RosBE and Visual Studio, skip to [[#Creating the Solution|Creating the Solution]]<br />
<br />
=== Installation ===<br />
# Download the Visual Studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started Visual Studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
#* '''''<tt>x64_x86 Cross Tools Command Prompt</tt>''''' should work too<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly set up:<br />
#* <pre>cmake --version</pre><br />
#* The result should be: '''''<tt>cmake version 3.17.1-ReactOS</tt>'''''<br />
# Ensure that BISON and M4 are correctly configured:<br />
#* <pre>set M4</pre> and <pre>set BISON_PKGDATADIR</pre><br />
#* The output should be: '''''<tt>M4=C:\RosBE\Bin\m4.exe</tt>''''' and '''''<tt>BISON_PKGDATADIR=C:\RosBE\share\bison</tt>'''''<br />
#* IF THESE ARE NOT SET OR NOT SET CORRECTLY, ADD THEM MANUALLY:<br />
#* <pre>set BISON_PKGDATADIR=C:\RosBE\share\bison</pre><pre>set M4=C:\RosBE\Bin\m4.exe</pre><br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]<br />
<br />
__FORCETOC__<br />
<br />
[[Category:Development]]</div>Learn morehttps://reactos.org/wiki/index.php?title=User:Learn_more/Running_apitests_from_visual_studio&diff=53917User:Learn more/Running apitests from visual studio2022-03-20T16:38:35Z<p>Learn more: Created page with "* '''Ensure the test does not do anything destructive!''' * Add 'project(your project) in the CMakeLists.txt to both the dll to be tested and the executable to be run <pre> d..."</p>
<hr />
<div>* '''Ensure the test does not do anything destructive!'''<br />
* Add 'project(your project) in the CMakeLists.txt to both the dll to be tested and the executable to be run<br />
<pre><br />
diff --git a/modules/rostests/winetests/msi/CMakeLists.txt b/modules/rostests/winetests/msi/CMakeLists.txt<br />
index 631c09abc15e145b57d5d934ee79cec877f7a864..071af753347f3b5a946c2b2512524c86d48e125a 100644<br />
--- a/modules/rostests/winetests/msi/CMakeLists.txt<br />
+++ b/modules/rostests/winetests/msi/CMakeLists.txt<br />
@@ -1,4 +1,6 @@<br />
<br />
+project(msi)<br />
+<br />
spec2def(custom.dll custom.spec)<br />
add_library(custom MODULE custom.c ${CMAKE_CURRENT_BINARY_DIR}/custom.def)<br />
target_link_libraries(custom uuid)<br />
diff --git a/dll/win32/msi/CMakeLists.txt b/dll/win32/msi/CMakeLists.txt<br />
index 56fcc80cb251e1c814dbb2ecd6acc84013d9c45a..c033bc348dc67986f4293bb7ed0dd360fb0d0e0a 100644<br />
--- a/dll/win32/msi/CMakeLists.txt<br />
+++ b/dll/win32/msi/CMakeLists.txt<br />
@@ -1,4 +1,6 @@<br />
<br />
+project(msi)<br />
+<br />
remove_definitions(-D_WIN32_WINNT=0x502 -D_CRT_NON_CONFORMING_SWPRINTFS)<br />
add_definitions(-D_WIN32_WINNT=0x600)<br />
<br />
</pre><br />
* Re-configure<br />
* Load the generated 'your project' in Visual Studio<br />
* Open 'Solution Properties'->'Project Dependencies'<br />
* Select the apitest in the dropdown<br />
* Select the dll to be tested as dependency<br />
* Add an 'apitest.exe.manifest' file for your apitest (modify the name to match your target!)<br />
* In the 'assembly' section add an entry redirecting the dll to load from the visual studio dir, for example:<br />
<file name="msi.dll" loadFrom="R:\build\dev\devenv\dll\win32\msi\Debug\" /><br />
* Enjoy debugging a ReactOS dll on Windows.<br />
<br />
=== Complete msi_winetest.exe.manifest ===<br />
'''WARNING: THIS APITEST DOES OVERWRITE FILES!'''<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><br />
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><br />
<assemblyIdentity type="win32" name="Wine.Msiexec" version="0.0.0.0"/><br />
<dependency><br />
<dependentAssembly><br />
<assemblyIdentity<br />
type="win32"<br />
name="Microsoft.Windows.Common-Controls"<br />
version="6.0.0.0"<br />
processorArchitecture="*"<br />
publicKeyToken="6595b64144ccf1df"<br />
language="*"<br />
/><br />
</dependentAssembly><br />
</dependency><br />
<br />
<file name="msi.dll" loadFrom="R:\build\dev\devenv\dll\win32\msi\Debug\" /><br />
<file name="advapi32_vista.dll" loadFrom="R:\build\dev\devenv\dll\win32\advapi32_vista\Debug\" /><br />
<file name="kernel32_vista.dll" loadFrom="R:\build\dev\devenv\dll\win32\kernel32\kernel32_vista\Debug\" /><br />
<br />
<application xmlns="urn:schemas-microsoft-com:asm.v3"><br />
<windowsSettings><br />
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware><br />
</windowsSettings><br />
</application><br />
</assembly><br />
</pre></div>Learn morehttps://reactos.org/wiki/index.php?title=User:Learn_more&diff=53916User:Learn more2022-03-20T16:24:18Z<p>Learn more: </p>
<hr />
<div>* [[User:Learn more/Appcompat]]<br />
* [[User:Learn more/Running apitests from visual studio]]<br />
* [[User:Learn more/Tampermonkey]]<br />
<br />
== IDA Script to parse RosSym ==<br />
[https://gist.github.com/learn-more/72eed4cde1ea8262a9b94294c8af489e rossym.py]</div>Learn morehttps://reactos.org/wiki/index.php?title=Welcome_to_the_ReactOS_Development_Wiki&diff=53620Welcome to the ReactOS Development Wiki2022-01-24T12:52:41Z<p>Learn more: </p>
<hr />
<div><!-- File:GSoC-logo2016.png|frameless|center|600px|link=https://reactos.org/wiki/Google_Summer_of_Code_2021 --><br />
{| cellspacing="20" cellpadding="0" width="100%"<br />
|- valign="top"<br />
| width="50%" |<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Developers.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DEVELOPING</h2><br />
Get involved! Help us make ReactOS better.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[ReactOS|What is ReactOS]]''' | [[ReactOS_FAQ|FAQ]] | [[Development Introduction]] | [[Programming Guidelines]] | [[Coding Style]] | [https://git.reactos.org/?p=reactos.git;a=tree Online Code Browser] </span><br />
|}<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Testing.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">TESTING</h2><br />
Test hardware or software and report problems.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt"> '''[[Installing ReactOS]]''' | [[RosBuild|Nightly Builds]] | [[:Category:Tutorial|Tutorials]] | [[File Bugs|Report a bug]] | [[Testing Central]] | [http://reactos.org/testman/ Automatic Regression Tests] | [[Supported Hardware]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Tools.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">BUILDING</h2><br />
Build your own ReactOS!<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[ReactOS Git For Dummies#Cloning the repository|Getting the Source Code]] | [[Build Environment|Getting the Build Environment]] | [[Building ReactOS]] | [[Building Modules]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Debugging.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DEBUGGING</h2><br />
Fix bugs and improve ReactOS quality.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[File Bugs|Report a bug]]''' | [[Debugging|Debugging Basics]] | [[Kdbg|Kernel Debugger]] | [[ReactOS Remote Debugger|Remote Debugger]] | [[Submitting Patches]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Translating.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">TRANSLATING</h2><br />
Translate ReactOS into other languages.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[Translation Introduction]] | [[RC File Standards]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DOCUMENTATION</h2><br />
Get to know more about ReactOS and its internals.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[ReactOS|About ReactOS]] | [http://doxygen.reactos.org Generated Documentation] | [[Techwiki:main|Techwiki]] | [[Reference]] | [[ReactOS_FAQ|FAQ]] | [[Documentation Guidelines]] | [[Wiki Maintenance]] | [[File Systems]] | [[Third party libraries]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Status.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">STATUS</h2><br />
See what needs to be done and what needs improvements.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[Versions]] | [[Changelogs]] ([[Community Changelogs]]) | [[Roadmap]] | [[Version Tests]] | [[Missing ReactOS Functionality|Missing Functionality]] | [[Printing]] | [[Shell_status|Shell]] | [[ReactOS_ports|Ports]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Support.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">COLLABORATING</h2><br />
Contact others and solve problems together.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[Events]]''' | [[People of ReactOS]] | [[Contributors]] | [[Mattermost|Mattermost Chat]] | [http://www.reactos.org/community/mailing-lists Mailing Lists] | [[Mumble]] | [http://www.reactos.org/forum/ Forums] | [[Driver Signing|Driver Signing (obsolete)]] | [[Google Summer of Code]]</span><br />
|}<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">The layman's guides.</h2><br />
Easy to understand guides for enthusiastic testers.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 10pt"> <br />
Find the list of [[Index_to_the_layman's_guides | Guides here.]]</span><br />
|}<br />
<br />
||<br />
<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">Articles by Petr Akhlamov</h2><br />
Some info and manuals<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[User:Petr-akhlamov/ReactOS sound schemes|Sound schemes]] | [[User:Petr-akhlamov/Samba|Samba]] | [[User:Petr-akhlamov/Shell|Shell]] | [[User:Petr-akhlamov/NTVDM|NTVDM]] | [[User:Petr-akhlamov/WOW|WOW]] | [[User:Petr-akhlamov/RAM from HD|RAM from HDD]] | [[User:Petr-akhlamov/Compatibility mode|Compatibility mode]] | [[User:Petr-akhlamov/Crash Reports|Crash Reports]] | [[User:Petr-akhlamov/Recovery Console|Recovery Console]]</span><br />
|}<br />
<br />
|}<br />
__NOTOC__<br />
__NOEDITSECTION__</div>Learn morehttps://reactos.org/wiki/index.php?title=Welcome_to_the_ReactOS_Development_Wiki&diff=53619Welcome to the ReactOS Development Wiki2022-01-24T12:52:14Z<p>Learn more: </p>
<hr />
<div><!-- File:GSoC-logo2016.png|frameless|center|600px|link=https://reactos.org/wiki/Google_Summer_of_Code_2021 --><br />
{| cellspacing="20" cellpadding="0" width="100%"<br />
|- valign="top"<br />
| width="50%" |<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Developers.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DEVELOPING</h2><br />
Get involved! Help us make ReactOS better.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[ReactOS|What is ReactOS]]''' | [[ReactOS_FAQ|FAQ]] | [[Development Introduction]] | [[Programming Guidelines]] | [[Coding Style]] | [https://git.reactos.org/?p=reactos.git;a=tree Online Code Browser] </span><br />
|}<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Testing.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">TESTING</h2><br />
Test hardware or software and report problems.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt"> '''[[Installing ReactOS]]''' | [[RosBuild|Nightly Builds]] | [[:Category:Tutorial|Tutorials]] | [[File Bugs|Report a bug]] | [[Testing Central]] | [http://reactos.org/testman/ Automatic Regression Tests] | [[Supported Hardware]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Tools.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">BUILDING</h2><br />
Build your own ReactOS!<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[ReactOS Git For Dummies#Cloning the repository|Getting the Source Code]] | [[Build Environment|Getting the Build Environment]] | [[Building ReactOS]] | [[Building Modules]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Debugging.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DEBUGGING</h2><br />
Fix bugs and improve ReactOS quality.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[File Bugs|Report a bug]]''' | [[Debugging|Debugging Basics]] | [[Kdbg|Kernel Debugger]] | [[ReactOS Remote Debugger|Remote Debugger]] | [[Submitting Patches]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Translating.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">TRANSLATING</h2><br />
Translate ReactOS into other languages.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[Translation Introduction]] | [[RC File Standards]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">DOCUMENTATION</h2><br />
Get to know more about ReactOS and its internals.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[ReactOS|About ReactOS]] | [http://doxygen.reactos.org Generated Documentation] | [[Techwiki:main|Techwiki]] | [[Reference]] | [[ReactOS_FAQ|FAQ]] | [[Documentation Guidelines]] | [[Wiki Maintenance]] | [[File Systems]] | [[Third party libraries]]</span><br />
|}<br />
<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Status.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">STATUS</h2><br />
See what needs to be done and what needs improvements.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[Versions]] | [[Changelogs]] ([[Community Changelogs]]) | [[Roadmap]] | [[Version Tests]] | [[Missing ReactOS Functionality|Missing Functionality]] | [[Printing]] | [[Shell_status|Shell]] | [[ReactOS_ports|Ports]]</span><br />
|}<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:Support.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">COLLABORATING</h2><br />
Contact others and solve problems together.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">'''[[Events]]''' | [[People of ReactOS]] | [[Contributors]] | [[Mattermost|Mattermost Chat]] | [http://www.reactos.org/community/mailing-lists Mailing Lists] | [[Mumble]] | [http://www.reactos.org/forum/ Forums] | [[Driver Signing (obsolete)]] | [[Google Summer of Code]]</span><br />
|}<br />
|- valign="top"<br />
<br />
||<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">The layman's guides.</h2><br />
Easy to understand guides for enthusiastic testers.<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 10pt"> <br />
Find the list of [[Index_to_the_layman's_guides | Guides here.]]</span><br />
|}<br />
<br />
||<br />
<br />
{| width="100%"<br />
| style="width: 35px; vertical-align: top" | [[Image:About.png|link=]]<br />
| style="padding-left: 10px" | <h2 style="border: 0; margin: 0 0 3px 0; padding: 0">Articles by Petr Akhlamov</h2><br />
Some info and manuals<br />
<hr style="margin: 4px 0" /><br />
<span style="font-size: 8pt">[[User:Petr-akhlamov/ReactOS sound schemes|Sound schemes]] | [[User:Petr-akhlamov/Samba|Samba]] | [[User:Petr-akhlamov/Shell|Shell]] | [[User:Petr-akhlamov/NTVDM|NTVDM]] | [[User:Petr-akhlamov/WOW|WOW]] | [[User:Petr-akhlamov/RAM from HD|RAM from HDD]] | [[User:Petr-akhlamov/Compatibility mode|Compatibility mode]] | [[User:Petr-akhlamov/Crash Reports|Crash Reports]] | [[User:Petr-akhlamov/Recovery Console|Recovery Console]]</span><br />
|}<br />
<br />
|}<br />
__NOTOC__<br />
__NOEDITSECTION__</div>Learn morehttps://reactos.org/wiki/index.php?title=Commiting_Changes&diff=53618Commiting Changes2022-01-24T12:50:16Z<p>Learn more: </p>
<hr />
<div>Since the migration to GitHub, contributing to the project become even easier!<br />
<br />
==For newbies==<br />
To commit your changes into the repository, follow these steps:<br />
# If you don't have [http://github.com/ GitHub] account, create it first<br />
# ''Fork'' the [http://github.com/reactos/reactos ReactOS repository] into your own GitHub account<br />
# Make sure you set up your ''full name'' and correct ''public e-mail'' in your [https://github.com/settings/profile account settings] (this is required by our [https://github.com/reactos/reactos/blob/master/CONTRIBUTING.md#rules-and-recommendations contributing rules])<br />
# ''Commit'' changes in your new forked repository following our [https://github.com/reactos/reactos/blob/master/.gitmessage commit message style].<br />
## Each pull request needs a unique branch, so it is recommended to always create a new branch!<br />
## Updates to the pull request can be done by committing to this branch again (and pushing it)<br />
# Create a ''Pull Request'' from your branch using either GitHub interface or [https://desktop.github.com/ GitHub Desktop App]<br />
<br />
==For developers==<br />
Please follow [[ReactOS Git For Dummies#Workflow|Workflow]] guide.<br />
<br />
==Maintainers==<br />
There are known maintainers for some modules and parts of the ReactOS:<br />
<br />
* https://github.com/reactos/reactos/blob/master/CODEOWNERS<br />
<br />
Once you have created a Pull Request, you may want to communicate with module maintainer for review and merge your code.<br />
<br />
==See also==<br />
* For further details read [[ReactOS Git For Dummies]] article.<br />
* You may also refer to older article [[Submitting Patches]].<br />
<br />
<br />
[[Category: Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=53198RAPPS2021-10-03T19:37:29Z<p>Learn more: /* Sections Fields */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program located in "C:\Reactos\System32" that allows users to download, install and update multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
The official list of downloadable programs (an archive "rappmgr.cab"), is kept on a public ReactOS server and synced every time RAPPS is launched for the first time.<br />
Once the rappmgr.cab is downloaded to %appdata%\rapps, RAPPS extracts it using cabinet.dll inside %appdata%\rapps\rapps, after that, it will parse all the *.txt files contained therein.<br />
<br />
Every subsequent time the program tries to access the local .txt files until a database update is manually triggered by the user.<br />
<br />
If the rappmgr.cab file is moved or just missing, RAPPS will download it again.<br />
<br />
Each program entry consists of a text file formatted with an INI-like syntax. Every .txt file describes a program, the filename is used as a unique identifier and should correspond to the software it "contains".<br />
<br />
= Submitting New Applications =<br />
It is possible to submit new application creating a txt file according to the file schema, forking the [https://github.com/reactos/rapps-db rapps-db repository on GitHub] and sending your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
Before submitting the Pull Request, test the files by pasting the document in <code>/rapps</code> folder and clicking "Refresh" in the GUI.<br />
<br />
Description files need to be saved in UTF-16 LE (Little Endian) in the rapps folder on disk. Without this, characters out of the ANSI range will display broken mojibake, some editors like Notepad++ call this format UCS-2 Little Endian.<br />
Line endings must be set as Windows format (<code>\r\n</code>). At the end of the file, there must be one empty line.<br />
<br />
If included in the ReactOS source code versioning entries are stored in UTF-8 without BOM (Byte Order Mask) for VCS friendliness.<br />
They get automatically converted to UTF-16 when creating the compressed rappmgr.cab package.<br />
<br />
It is suggested that the commits to be squashed into one commit before a PR. If the reviewers asked for changes, ensure that the commits are squashed afterwards.<br />
<br />
= File Schema =<br />
<br />
== Sections ==<br />
RAPPS can show different programs' information accordingly to the host system language: to achieve this, the INI files used by RAPPS are divided in section.<br />
<br />
Each section begins with ''[Section.XXXX]'', where ''XXXX'' is a four-digit ''Locale ID'', that uniquely identifies a language.<br />
A list of Locale IDs can be found [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c on Microsoft Docs] (last four digits of the ''Language ID'' column).<br />
To avoid "colliding" codes (same ID used for multiple languages), also check [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f MS-LCID Reference], for example in the [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d-210407.pdf 14.1 protocol revision (obsolete)] see Language ID at page 9.<br />
<br />
An exception is made for the default entry, that is only defined as ''[Section]'': this should contain information in English.<br />
<br />
If there is no entry for the host system language, the default entry is chosen. <br />
For example if the system is set to Spanish and there is no Spanish entry of a program, then software description etc. will be displayed in English.<br />
<br />
Note that every field in a section can be customized for a language, not only the description (for example if a program offers different download links for different localizations).<br />
Fields that are not customized for a language will use the default entry in ''[Section]''.<br />
<br />
Here is a minimal example of a multilanguage file:<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My Program Name<br />
Category = 16<br />
URLDownload = https://example.com/MyProgram.exe<br />
<br />
; Russian language<br />
[Section.0419]<br />
Name = Имя моей программы <br />
URLDownload = https://example.com/MyProgram_LocalizedRussian.exe<br />
</syntaxhighlight><br />
<br />
RAPPS also accepts neutral language codes, meaning that you can do things like this<ref>https://github.com/reactos/rapps-db</ref>:<br />
<syntaxhighlight lang="ini"><br />
; Default English fallback, used if everything else fails.<br />
[Section]<br />
Name = Name in English<br />
<br />
; Neutral Spanish, used if the specific variant of Spanish does not match.<br />
[Section.0a]<br />
Name = Name in Generic Spanish<br />
<br />
; Spanish from Spain, used if the system is configured for it.<br />
[Section.0c0a]<br />
Name = Name in Castilian Spanish<br />
</syntaxhighlight><br />
<br />
Note that is possible to create a file without an English entry, so that the program would be only shown to systems set to determinate languages, but it is discouraged, as users aren't able yet to choose the languages they want to visualize (so for example if a French-speaking user would set the system to English, RAPPS would not show eventual French-only entries, even if the user is potentially able to use them). <br />
<br />
RAPPS behaviour on systems with multiple languages has not been documented yet.<br />
<br />
== Sections Fields ==<br />
<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
; Mandatory fields<br />
Name = My fun stuff-o-matic<br />
Category = 5<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
SizeBytes = 10485760<br />
<br />
; Optional fields in alphabetical order (no experimental features)<br />
Description = Shortish description giving some additional background information about what it does.<br />
Icon = SomeIcon.ico<br />
License = GPL<br />
RegName = Name in Registry<br />
SHA1 = 47480394167aca4869b7bf330af6c6fc5ca4ac25<br />
URLSite = https://example.org/<br />
Version = 1.1.1<br />
</syntaxhighlight><br />
<br />
Let's analyze it from top to the bottom.<br />
''The following fields are mandatory.''<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. <br />
Currently on ReactOS 0.4.13 there are 15 + 1 categories:<br />
* 1 – '''Audio''': Software for recording, playing, modifying, converting sounds<br />
* 2 – '''Video''': as above but applied to videos and movies<br />
* 3 – '''Graphics''': a above, but applied to graphics and images<br />
* 4 – '''Games & Fun''': games, console emulators etc.<br />
* 5 – '''Internet & Network''': browsers, IM clients, FTP software, Remote desktop etc.<br />
* 6 – '''Office''': office suites and similar<br />
* 7 – '''Development''': IDEs, debuggers, compilers and anything related to software development<br />
* 8 – '''Edutainment''': software related to education & teaching, like dictionaries and translators<br />
* 9 – '''Engineering''': CAD, FEM, numerical computation etc.<br />
* 10 – '''Finance''': balances management, warehouse software, trade monitors etc.<br />
* 11 – '''Science''': programs for simulation, advanced calculus, chemistry, physics and similar<br />
* 12 – '''Tools''': utilities like archiving software, disc burning utilities etc.<br />
* 13 – '''Drivers''': device drivers<br />
* 14 – '''Libraries''': libraries and runtimes, usually needed to run/develope other programs<br />
* 15 – '''Themes''': themes for ReactOS or Windows<br />
* 16 – '''Other''': programs that do not fit in above categories<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program. <br />
Scripted download are not supported yet, so ensure it is a direct link to a file.<br />
HTTPS is not mandatory but recommended.<br />
<br />
''The following fields are optional (but recommended).''<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does.<br />
<br />
=== License ===<br />
The license under which the software is released, for example Apache, GPL, MIT...<br />
Non-libre software is usually released under a End-User License Agreement (EULA) shipped with the software.<br />
<br />
<br />
=== Icon ===<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', and include the .ico extension.<br />
The icon itself should be placed in the `icons` folder in the rapps-db repository.<br />
Alternatively, if the filename of the .txt file matches the filename of an .ico file, that icon will also be displayed.<br />
<br />
=== RegName ===<br />
Name in Registry<br />
<br />
=== SHA1 === <br />
SHA1 checksum, to verify the download.<br />
By standard SHA1 is case-insensitive.<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
On Windows systems usually both nominal size and size on disk are reported, in this case use the former.<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
HTTPS is not mandatory but recommended.<br />
<br />
=== Version ===<br />
This is the version of the program. <br />
In the code it is treated as a zero terminated string, so the decimal separator shouldn't matter, RAPPS should only check if the string of the latest available version is different from the installed one.<br />
<br />
== Deprecated fields ==<br />
<br />
=== LicenseInfo ===<br />
For a while the wiki erroneously reported LicenseInfo instead of LicenseType. If it is found in a file, please simply replace it with LicenseType.<ref>https://jira.reactos.org/browse/CORE-17771</ref><br />
<br />
=== Size ===<br />
The Size parameter was used before the introduction of SizeBytes. It has now been removed<ref>https://github.com/reactos/rapps-db/pull/153</ref>.<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not included yet in the current stable (0.4.13), and are only available in development (0.4.15-dev).<br />
<br />
These work well enough to be tested and used but might still be subject to changes before being merged in stable.<br />
<br />
== Architecture-based Sections ==<br />
[[ReactOS ports|As ReactOS has several ports]] (at different stages of completions), it is already possible to define different sections for different architectures.<br />
Some files in Rapps-db already include different entries, but at the moment (0.4.13 release) the x86 port is the only one working.<br />
<br />
If not differently specified, all entries are assumed to be x86.<br />
<br />
These are the possible values for the architecture<ref>https://github.com/reactos/reactos/blob/master/base/applications/rapps/include/misc.h</ref>:<br />
* [Section.x86] - i586. Can be omitted, by default all entries are supposed to be for x86.<br />
* [Section.amd64] - x86_64/x64<br />
* [Section.arm] - ARM<br />
* [Section.arm64] - ARM64<br />
* [Section.ia64] - Itanium<br />
* [Section.ppc] - PowerPC<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a necessary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
<br />
== New Sections Fields ==<br />
<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseType === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
* 1 - "Open Source"<br />
* 2 - "Freeware" <br />
* 3 - "Demo/Trial"<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...)<br />
<br />
Currently, only first Screenshot is used. Ensure the URL is a direct link to the image, not a page containing the image (e.g. Imgur links).<br />
It is also preferred to include the screenshot taken on ReactOS, not on Windows.<br />
<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
; Example of a current application in RAPPS with a screenshot<br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
Version = 17.12<br />
License = GPLv3<br />
Description = An open source, cross-platform, powerful IDE. It does not contain a compiler.<br />
Category = 7<br />
URLSite = http://www.codeblocks.org/<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
* Documentation<br />
** [https://doxygen.reactos.org/dir_f72badb8674797321b701dde383e2467.html RAPPS generated documentation (Doxygen)]<br />
** [https://github.com/reactos/reactos/blob/master/base/applications/rapps/README.ENG RAPPS Readme on GitHub]<br />
* Forum topics<br />
** Tutorials<br />
*** [https://reactos.org/forum/viewtopic.php?f=22&t=11015 RAPPS - For those that want more from it.]<br />
* GSoCs that involved RAPPS<br />
** [https://reactos.org/tags/rapps/ rapps | ReactOS Project]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=53197RAPPS2021-10-03T19:36:51Z<p>Learn more: </p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program located in "C:\Reactos\System32" that allows users to download, install and update multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
The official list of downloadable programs (an archive "rappmgr.cab"), is kept on a public ReactOS server and synced every time RAPPS is launched for the first time.<br />
Once the rappmgr.cab is downloaded to %appdata%\rapps, RAPPS extracts it using cabinet.dll inside %appdata%\rapps\rapps, after that, it will parse all the *.txt files contained therein.<br />
<br />
Every subsequent time the program tries to access the local .txt files until a database update is manually triggered by the user.<br />
<br />
If the rappmgr.cab file is moved or just missing, RAPPS will download it again.<br />
<br />
Each program entry consists of a text file formatted with an INI-like syntax. Every .txt file describes a program, the filename is used as a unique identifier and should correspond to the software it "contains".<br />
<br />
= Submitting New Applications =<br />
It is possible to submit new application creating a txt file according to the file schema, forking the [https://github.com/reactos/rapps-db rapps-db repository on GitHub] and sending your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
Before submitting the Pull Request, test the files by pasting the document in <code>/rapps</code> folder and clicking "Refresh" in the GUI.<br />
<br />
Description files need to be saved in UTF-16 LE (Little Endian) in the rapps folder on disk. Without this, characters out of the ANSI range will display broken mojibake, some editors like Notepad++ call this format UCS-2 Little Endian.<br />
Line endings must be set as Windows format (<code>\r\n</code>). At the end of the file, there must be one empty line.<br />
<br />
If included in the ReactOS source code versioning entries are stored in UTF-8 without BOM (Byte Order Mask) for VCS friendliness.<br />
They get automatically converted to UTF-16 when creating the compressed rappmgr.cab package.<br />
<br />
It is suggested that the commits to be squashed into one commit before a PR. If the reviewers asked for changes, ensure that the commits are squashed afterwards.<br />
<br />
= File Schema =<br />
<br />
== Sections ==<br />
RAPPS can show different programs' information accordingly to the host system language: to achieve this, the INI files used by RAPPS are divided in section.<br />
<br />
Each section begins with ''[Section.XXXX]'', where ''XXXX'' is a four-digit ''Locale ID'', that uniquely identifies a language.<br />
A list of Locale IDs can be found [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c on Microsoft Docs] (last four digits of the ''Language ID'' column).<br />
To avoid "colliding" codes (same ID used for multiple languages), also check [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f MS-LCID Reference], for example in the [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d-210407.pdf 14.1 protocol revision (obsolete)] see Language ID at page 9.<br />
<br />
An exception is made for the default entry, that is only defined as ''[Section]'': this should contain information in English.<br />
<br />
If there is no entry for the host system language, the default entry is chosen. <br />
For example if the system is set to Spanish and there is no Spanish entry of a program, then software description etc. will be displayed in English.<br />
<br />
Note that every field in a section can be customized for a language, not only the description (for example if a program offers different download links for different localizations).<br />
Fields that are not customized for a language will use the default entry in ''[Section]''.<br />
<br />
Here is a minimal example of a multilanguage file:<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My Program Name<br />
Category = 16<br />
URLDownload = https://example.com/MyProgram.exe<br />
<br />
; Russian language<br />
[Section.0419]<br />
Name = Имя моей программы <br />
URLDownload = https://example.com/MyProgram_LocalizedRussian.exe<br />
</syntaxhighlight><br />
<br />
RAPPS also accepts neutral language codes, meaning that you can do things like this<ref>https://github.com/reactos/rapps-db</ref>:<br />
<syntaxhighlight lang="ini"><br />
; Default English fallback, used if everything else fails.<br />
[Section]<br />
Name = Name in English<br />
<br />
; Neutral Spanish, used if the specific variant of Spanish does not match.<br />
[Section.0a]<br />
Name = Name in Generic Spanish<br />
<br />
; Spanish from Spain, used if the system is configured for it.<br />
[Section.0c0a]<br />
Name = Name in Castilian Spanish<br />
</syntaxhighlight><br />
<br />
Note that is possible to create a file without an English entry, so that the program would be only shown to systems set to determinate languages, but it is discouraged, as users aren't able yet to choose the languages they want to visualize (so for example if a French-speaking user would set the system to English, RAPPS would not show eventual French-only entries, even if the user is potentially able to use them). <br />
<br />
RAPPS behaviour on systems with multiple languages has not been documented yet.<br />
<br />
== Sections Fields ==<br />
<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
; Mandatory fields<br />
Name = My fun stuff-o-matic<br />
Category = 5<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
<br />
; Optional fields in alphabetical order (no experimental features)<br />
Description = Shortish description giving some additional background information about what it does.<br />
Icon = SomeIcon.ico<br />
License = GPL<br />
RegName = Name in Registry<br />
SHA1 = 47480394167aca4869b7bf330af6c6fc5ca4ac25<br />
SizeBytes = 10485760<br />
URLSite = https://example.org/<br />
Version = 1.1.1<br />
</syntaxhighlight><br />
<br />
Let's analyze it from top to the bottom.<br />
''The following fields are mandatory.''<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. <br />
Currently on ReactOS 0.4.13 there are 15 + 1 categories:<br />
* 1 – '''Audio''': Software for recording, playing, modifying, converting sounds<br />
* 2 – '''Video''': as above but applied to videos and movies<br />
* 3 – '''Graphics''': a above, but applied to graphics and images<br />
* 4 – '''Games & Fun''': games, console emulators etc.<br />
* 5 – '''Internet & Network''': browsers, IM clients, FTP software, Remote desktop etc.<br />
* 6 – '''Office''': office suites and similar<br />
* 7 – '''Development''': IDEs, debuggers, compilers and anything related to software development<br />
* 8 – '''Edutainment''': software related to education & teaching, like dictionaries and translators<br />
* 9 – '''Engineering''': CAD, FEM, numerical computation etc.<br />
* 10 – '''Finance''': balances management, warehouse software, trade monitors etc.<br />
* 11 – '''Science''': programs for simulation, advanced calculus, chemistry, physics and similar<br />
* 12 – '''Tools''': utilities like archiving software, disc burning utilities etc.<br />
* 13 – '''Drivers''': device drivers<br />
* 14 – '''Libraries''': libraries and runtimes, usually needed to run/develope other programs<br />
* 15 – '''Themes''': themes for ReactOS or Windows<br />
* 16 – '''Other''': programs that do not fit in above categories<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program. <br />
Scripted download are not supported yet, so ensure it is a direct link to a file.<br />
HTTPS is not mandatory but recommended.<br />
<br />
''The following fields are optional (but recommended).''<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does.<br />
<br />
=== License ===<br />
The license under which the software is released, for example Apache, GPL, MIT...<br />
Non-libre software is usually released under a End-User License Agreement (EULA) shipped with the software.<br />
<br />
<br />
=== Icon ===<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', and include the .ico extension.<br />
The icon itself should be placed in the `icons` folder in the rapps-db repository.<br />
Alternatively, if the filename of the .txt file matches the filename of an .ico file, that icon will also be displayed.<br />
<br />
=== RegName ===<br />
Name in Registry<br />
<br />
=== SHA1 === <br />
SHA1 checksum, to verify the download.<br />
By standard SHA1 is case-insensitive.<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
On Windows systems usually both nominal size and size on disk are reported, in this case use the former.<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
HTTPS is not mandatory but recommended.<br />
<br />
=== Version ===<br />
This is the version of the program. <br />
In the code it is treated as a zero terminated string, so the decimal separator shouldn't matter, RAPPS should only check if the string of the latest available version is different from the installed one.<br />
<br />
== Deprecated fields ==<br />
<br />
=== LicenseInfo ===<br />
For a while the wiki erroneously reported LicenseInfo instead of LicenseType. If it is found in a file, please simply replace it with LicenseType.<ref>https://jira.reactos.org/browse/CORE-17771</ref><br />
<br />
=== Size ===<br />
The Size parameter was used before the introduction of SizeBytes. It has now been removed<ref>https://github.com/reactos/rapps-db/pull/153</ref>.<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not included yet in the current stable (0.4.13), and are only available in development (0.4.15-dev).<br />
<br />
These work well enough to be tested and used but might still be subject to changes before being merged in stable.<br />
<br />
== Architecture-based Sections ==<br />
[[ReactOS ports|As ReactOS has several ports]] (at different stages of completions), it is already possible to define different sections for different architectures.<br />
Some files in Rapps-db already include different entries, but at the moment (0.4.13 release) the x86 port is the only one working.<br />
<br />
If not differently specified, all entries are assumed to be x86.<br />
<br />
These are the possible values for the architecture<ref>https://github.com/reactos/reactos/blob/master/base/applications/rapps/include/misc.h</ref>:<br />
* [Section.x86] - i586. Can be omitted, by default all entries are supposed to be for x86.<br />
* [Section.amd64] - x86_64/x64<br />
* [Section.arm] - ARM<br />
* [Section.arm64] - ARM64<br />
* [Section.ia64] - Itanium<br />
* [Section.ppc] - PowerPC<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a necessary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
<br />
== New Sections Fields ==<br />
<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseType === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
* 1 - "Open Source"<br />
* 2 - "Freeware" <br />
* 3 - "Demo/Trial"<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...)<br />
<br />
Currently, only first Screenshot is used. Ensure the URL is a direct link to the image, not a page containing the image (e.g. Imgur links).<br />
It is also preferred to include the screenshot taken on ReactOS, not on Windows.<br />
<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
; Example of a current application in RAPPS with a screenshot<br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
Version = 17.12<br />
License = GPLv3<br />
Description = An open source, cross-platform, powerful IDE. It does not contain a compiler.<br />
Category = 7<br />
URLSite = http://www.codeblocks.org/<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
* Documentation<br />
** [https://doxygen.reactos.org/dir_f72badb8674797321b701dde383e2467.html RAPPS generated documentation (Doxygen)]<br />
** [https://github.com/reactos/reactos/blob/master/base/applications/rapps/README.ENG RAPPS Readme on GitHub]<br />
* Forum topics<br />
** Tutorials<br />
*** [https://reactos.org/forum/viewtopic.php?f=22&t=11015 RAPPS - For those that want more from it.]<br />
* GSoCs that involved RAPPS<br />
** [https://reactos.org/tags/rapps/ rapps | ReactOS Project]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=53172RAPPS2021-09-30T20:06:16Z<p>Learn more: Update for recent changes</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program located in "C:\Reactos\System32" that allows users to download, install and update multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
The official list of downloadable programs (an archive "rappmgr.cab"), is kept on a public ReactOS server and synced every time RAPPS is launched for the first time.<br />
Once the rappmgr.cab is downloaded to %appdata%\rapps, RAPPS extracts it using cabinet.dll inside %appdata%\rapps\rapps, after that, it will parse all the *.txt files contained therein.<br />
<br />
Every subsequent time the program tries to access the local .txt files until a database update is manually triggered by the user.<br />
<br />
If the rappmgr.cab file is moved or just missing, RAPPS will download it again.<br />
<br />
Each program entry consists of a text file formatted with an INI-like syntax. Every .txt file describes a program, the filename is used as a unique identifier and should correspond to the software it "contains".<br />
<br />
= Submitting New Applications =<br />
It is possible to submit new application creating a txt file according to the file schema, forking the [https://github.com/reactos/rapps-db rapps-db repository on GitHub] and sending your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
Before submitting the Pull Request, test the files by pasting the document in <code>/rapps</code> folder and clicking "Refresh" in the GUI.<br />
<br />
Description files need to be saved in UTF-16 LE (Little Endian) in the rapps folder on disk. Without this, characters out of the ANSI range will display broken mojibake, some editors like Notepad++ call this format UCS-2 Little Endian.<br />
Line endings must be set as Windows format (<code>\r\n</code>). At the end of the file, there must be one empty line.<br />
<br />
If included in the ReactOS source code versioning entries are stored in UTF-8 without BOM (Byte Order Mask) for VCS friendliness.<br />
They get automatically converted to UTF-16 when creating the compressed rappmgr.cab package.<br />
<br />
It is suggested that the commits to be squashed into one commit before a PR. If the reviewers asked for changes, ensure that the commits are squashed afterwards.<br />
<br />
= File Schema =<br />
<br />
== Sections ==<br />
RAPPS can show different programs' information accordingly to the host system language: to achieve this, the INI files used by RAPPS are divided in section.<br />
<br />
Each section begins with ''[Section.XXXX]'', where ''XXXX'' is a four-digit ''Locale ID'', that uniquely identifies a language.<br />
A list of Locale IDs can be found [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c on Microsoft Docs] (last four digits of the ''Language ID'' column).<br />
To avoid "colliding" codes (same ID used for multiple languages), also check [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f MS-LCID Reference], for example in the [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d-210407.pdf 14.1 protocol revision (obsolete)] see Language ID at page 9.<br />
<br />
An exception is made for the default entry, that is only defined as ''[Section]'': this should contain information in English.<br />
<br />
If there is no entry for the host system language, the default entry is chosen. <br />
For example if the system is set to Spanish and there is no Spanish entry of a program, then software description etc. will be displayed in English.<br />
<br />
Note that every field in a section can be customized for a language, not only the description (for example if a program offers different download links for different localizations).<br />
Fields that are not customized for a language will use the default entry in ''[Section]''.<br />
<br />
Here is a minimal example of a multilanguage file:<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My Program Name<br />
Category = 16<br />
URLDownload = https://example.com/MyProgram.exe<br />
<br />
; Russian language<br />
[Section.0419]<br />
Name = Имя моей программы <br />
URLDownload = https://example.com/MyProgram_LocalizedRussian.exe<br />
</syntaxhighlight><br />
<br />
RAPPS also accepts neutral language codes, meaning that you can do things like this<ref>https://github.com/reactos/rapps-db</ref>:<br />
<syntaxhighlight lang="ini"><br />
; Default English fallback, used if everything else fails.<br />
[Section]<br />
Name = Name in English<br />
<br />
; Neutral Spanish, used if the specific variant of Spanish does not match.<br />
[Section.0a]<br />
Name = Name in Generic Spanish<br />
<br />
; Spanish from Spain, used if the system is configured for it.<br />
[Section.0c0a]<br />
Name = Name in Castilian Spanish<br />
</syntaxhighlight><br />
<br />
Note that is possible to create a file without an English entry, so that the program would be only shown to systems set to determinate languages, but it is discouraged, as users aren't able yet to choose the languages they want to visualize (so for example if a French-speaking user would set the system to English, RAPPS would not show eventual French-only entries, even if the user is potentially able to use them). <br />
<br />
RAPPS behaviour on systems with multiple languages has not been documented yet.<br />
<br />
== Sections Fields ==<br />
<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
; Mandatory fields<br />
Name = My fun stuff-o-matic<br />
Category = 5<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
<br />
; Optional fields in alphabetical order (no experimental features)<br />
Description = Shortish description giving some additional background information about what it does.<br />
License = GPL<br />
RegName = Name in Registry<br />
SHA1 = 47480394167aca4869b7bf330af6c6fc5ca4ac25<br />
SizeBytes = 10485760<br />
URLSite = https://example.org/<br />
Version = 1.1.1<br />
</syntaxhighlight><br />
<br />
Let's analyze it from top to the bottom.<br />
''The following fields are mandatory.''<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. <br />
Currently on ReactOS 0.4.13 there are 15 + 1 categories:<br />
* 1 – '''Audio''': Software for recording, playing, modifying, converting sounds<br />
* 2 – '''Video''': as above but applied to videos and movies<br />
* 3 – '''Graphics''': a above, but applied to graphics and images<br />
* 4 – '''Games & Fun''': games, console emulators etc.<br />
* 5 – '''Internet & Network''': browsers, IM clients, FTP software, Remote desktop etc.<br />
* 6 – '''Office''': office suites and similar<br />
* 7 – '''Development''': IDEs, debuggers, compilers and anything related to software development<br />
* 8 – '''Edutainment''': software related to education & teaching, like dictionaries and translators<br />
* 9 – '''Engineering''': CAD, FEM, numerical computation etc.<br />
* 10 – '''Finance''': balances management, warehouse software, trade monitors etc.<br />
* 11 – '''Science''': programs for simulation, advanced calculus, chemistry, physics and similar<br />
* 12 – '''Tools''': utilities like archiving software, disc burning utilities etc.<br />
* 13 – '''Drivers''': device drivers<br />
* 14 – '''Libraries''': libraries and runtimes, usually needed to run/develope other programs<br />
* 15 – '''Themes''': themes for ReactOS or Windows<br />
* 16 – '''Other''': programs that do not fit in above categories<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program. <br />
Scripted download are not supported yet, so ensure it is a direct link to a file.<br />
HTTPS is not mandatory but recommended.<br />
<br />
''The following fields are optional (but recommended).''<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does.<br />
<br />
=== License ===<br />
The license under which the software is released, for example Apache, GPL, MIT...<br />
Non-libre software is usually released under a End-User License Agreement (EULA) shipped with the software.<br />
<br />
=== RegName ===<br />
Name in Registry<br />
<br />
=== SHA1 === <br />
SHA1 checksum, to verify the download.<br />
By standard SHA1 is case-insensitive.<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
On Windows systems usually both nominal size and size on disk are reported, in this case use the former.<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
HTTPS is not mandatory but recommended.<br />
<br />
=== Version ===<br />
This is the version of the program. <br />
In the code it is treated as a zero terminated string, so the decimal separator shouldn't matter, RAPPS should only check if the string of the latest available version is different from the installed one.<br />
<br />
== Deprecated fields ==<br />
<br />
=== LicenseInfo ===<br />
For a while the wiki erroneously reported LicenseInfo instead of LicenseType. If it is found in a file, please simply replace it with LicenseType.<ref>https://jira.reactos.org/browse/CORE-17771</ref><br />
<br />
=== Size ===<br />
The Size parameter was used before the introduction of SizeBytes. It has now been removed<ref>https://github.com/reactos/rapps-db/pull/153</ref>.<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not included yet in the current stable (0.4.13), and are only available in development (0.4.15-dev).<br />
<br />
These work well enough to be tested and used but might still be subject to changes before being merged in stable.<br />
<br />
== Architecture-based Sections ==<br />
[[ReactOS ports|As ReactOS has several ports]] (at different stages of completions), it is already possible to define different sections for different architectures.<br />
Some files in Rapps-db already include different entries, but at the moment (0.4.13 release) the x86 port is the only one working.<br />
<br />
If not differently specified, all entries are assumed to be x86.<br />
<br />
These are the possible values for the architecture<ref>https://github.com/reactos/reactos/blob/master/base/applications/rapps/include/misc.h</ref>:<br />
* [Section.x86] - i586. Can be omitted, by default all entries are supposed to be for x86.<br />
* [Section.amd64] - x86_64/x64<br />
* [Section.arm] - ARM<br />
* [Section.arm64] - ARM64<br />
* [Section.ia64] - Itanium<br />
* [Section.ppc] - PowerPC<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a necessary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
<br />
== New Sections Fields ==<br />
<br />
=== Icon ===<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section', and include the .ico extension.<br />
The icon itself should be placed in the `icons` folder in the rapps-db repository.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseType === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
* 1 - "Open Source"<br />
* 2 - "Freeware" <br />
* 3 - "Demo/Trial"<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...)<br />
<br />
Currently, only first Screenshot is used. Ensure the URL is a direct link to the image, not a page containing the image (e.g. Imgur links).<br />
It is also preferred to include the screenshot taken on ReactOS, not on Windows.<br />
<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
; Example of a current application in RAPPS with a screenshot<br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
Version = 17.12<br />
License = GPLv3<br />
Description = An open source, cross-platform, powerful IDE. It does not contain a compiler.<br />
Category = 7<br />
URLSite = http://www.codeblocks.org/<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
* Documentation<br />
** [https://doxygen.reactos.org/dir_f72badb8674797321b701dde383e2467.html RAPPS generated documentation (Doxygen)]<br />
** [https://github.com/reactos/reactos/blob/master/base/applications/rapps/README.ENG RAPPS Readme on GitHub]<br />
* Forum topics<br />
** Tutorials<br />
*** [https://reactos.org/forum/viewtopic.php?f=22&t=11015 RAPPS - For those that want more from it.]<br />
* GSoCs that involved RAPPS<br />
** [https://reactos.org/tags/rapps/ rapps | ReactOS Project]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=53111RAPPS2021-09-15T12:59:32Z<p>Learn more: /* Submitting New Applications */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program located in "C:\Reactos\System32" that allows users to download, install and update multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
The official list of downloadable programs (an archive "rappmgr.cab"), is kept on a public ReactOS server and synced every time RAPPS is launched for the first time.<br />
Once the rappmgr.cab is downloaded to %appdata%\rapps, RAPPS extracts it using cabinet.dll inside %appdata%\rapps\rapps, after that, it will parse all the *.txt files contained therein.<br />
<br />
Every subsequent time the program tries to access the local .txt files until a database update is manually triggered by the user.<br />
<br />
If the rappmgr.cab file is moved or just missing, RAPPS will download it again.<br />
<br />
Each program entry consists of a text file formatted with an INI-like syntax. Every .txt file describes a program, the filename is used as a unique identifier and should correspond to the software it "contains".<br />
<br />
= Submitting New Applications =<br />
It is possible to submit new application creating a txt file according to the file schema, forking the [https://github.com/reactos/rapps-db rapps-db repository on GitHub] and sending your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
Before submitting the Pull Request, test the files by pasting the document in <code>/rapps</code> folder and clicking "Refresh" in the GUI.<br />
<br />
Description files need to be saved in UTF-16 LE (Little Endian) in the rapps folder on disk. Without this, characters out of the ANSI range will display broken mojibake, some editors like Notepad++ call this format UCS-2 Little Endian.<br />
Line endings must be set as Windows format (<code>\r\n</code>). At the end of the file, there must be one empty line.<br />
<br />
If included in the ReactOS source code versioning entries are stored in UTF-8 without BOM (Byte Order Mask) for VCS friendliness.<br />
They get automatically converted to UTF-16 when creating the compressed rappmgr.cab package.<br />
<br />
It is suggested that the commits to be squashed into one commit before a PR. If the reviewers asked for changes, ensure that the commits are squashed afterwards.<br />
<br />
= File Schema =<br />
<br />
== Sections ==<br />
RAPPS can show different programs' information accordingly to the host system language: to achieve this, the INI files used by RAPPS are divided in section.<br />
<br />
Each section begins with ''[Section.XXXX]'', where ''XXXX'' is a four-digit ''Locale ID'', that uniquely identifies a language.<br />
A list of Locale IDs can be found [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c on Microsoft Docs] (last four digits of the ''Language ID'' column).<br />
To avoid "colliding" codes (same ID used for multiple languages), also check [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f MS-LCID Reference], for example in the [https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-LCID/%5bMS-LCID%5d-210407.pdf 14.1 protocol revision (obsolete)] see Language ID at page 9.<br />
<br />
An exception is made for the default entry, that is only defined as ''[Section]'': this should contain information in English.<br />
<br />
If there is no entry for the host system language, the default entry is chosen. <br />
For example if the system is set to Spanish and there is no Spanish entry of a program, then software description etc. will be displayed in English.<br />
<br />
Note that every field in a section can be customized for a language, not only the description (for example if a program offers different download links for different localizations).<br />
Fields that are not customized for a language will use the default entry in ''[Section]''.<br />
<br />
Here is a minimal example of a multilanguage file:<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My Program Name<br />
Category = 16<br />
URLDownload = https://example.com/MyProgram.exe<br />
<br />
; Russian language<br />
[Section.0419]<br />
Name = Имя моей программы <br />
URLDownload = https://example.com/MyProgram_LocalizedRussian.exe<br />
</syntaxhighlight><br />
<br />
RAPPS also accepts neutral language codes, meaning that you can do things like this<ref>https://github.com/reactos/rapps-db</ref>:<br />
<syntaxhighlight lang="ini"><br />
; Default English fallback, used if everything else fails.<br />
[Section]<br />
Name = Name in English<br />
<br />
; Neutral Spanish, used if the specific variant of Spanish does not match.<br />
[Section.0a]<br />
Name = Name in Generic Spanish<br />
<br />
; Spanish from Spain, used if the system is configured for it.<br />
[Section.0c0a]<br />
Name = Name in Castilian Spanish<br />
</syntaxhighlight><br />
<br />
Note that is possible to create a file without an English entry, so that the program would be only shown to systems set to determinate languages, but it is discouraged, as users aren't able yet to choose the languages they want to visualize (so for example if a French-speaking user would set the system to English, RAPPS would not show eventual French-only entries, even if the user is potentially able to use them). <br />
<br />
RAPPS behaviour on systems with multiple languages has not been documented yet.<br />
<br />
== Sections Fields ==<br />
<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
; Mandatory fields<br />
Name = My fun stuff-o-matic<br />
Category = 5<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
<br />
; Optional fields in alphabetical order (no experimental features)<br />
Description = Shortish description giving some additional background information about what it does.<br />
License = GPL<br />
RegName = Name in Registry<br />
SHA1 = 47480394167aca4869b7bf330af6c6fc5ca4ac25<br />
SizeBytes = 10485760<br />
URLSite = https://example.org/<br />
Version = 1.1.1<br />
</syntaxhighlight><br />
<br />
Let's analyze it from top to the bottom.<br />
''The following fields are mandatory.''<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. <br />
Currently on ReactOS 0.4.13 there are 15 + 1 categories:<br />
* 1 – '''Audio''': Software for recording, playing, modifying, converting sounds<br />
* 2 – '''Video''': as above but applied to videos and movies<br />
* 3 – '''Graphics''': a above, but applied to graphics and images<br />
* 4 – '''Games & Fun''': games, console emulators etc.<br />
* 5 – '''Internet & Network''': browsers, IM clients, FTP software, Remote desktop etc.<br />
* 6 – '''Office''': office suites and similar<br />
* 7 – '''Development''': IDEs, debuggers, compilers and anything related to software development<br />
* 8 – '''Edutainment''': software related to education & teaching, like dictionaries and translators<br />
* 9 – '''Engineering''': CAD, FEM, numerical computation etc.<br />
* 10 – '''Finance''': balances management, warehouse software, trade monitors etc.<br />
* 11 – '''Science''': programs for simulation, advanced calculus, chemistry, physics and similar<br />
* 12 – '''Tools''': utilities like archiving software, disc burning utilities etc.<br />
* 13 – '''Drivers''': device drivers<br />
* 14 – '''Libraries''': libraries and runtimes, usually needed to run/develope other programs<br />
* 15 – '''Themes''': themes for ReactOS or Windows<br />
* 16 – '''Other''': programs that do not fit in above categories<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program. <br />
Scripted download are not supported yet, so ensure it is a direct link to a file.<br />
HTTPS is not mandatory but recommended.<br />
<br />
''The following fields are optional (but recommended).''<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does.<br />
<br />
=== License ===<br />
The license under which the software is released, for example Apache, GPL, MIT...<br />
Non-libre software is usually released under a End-User License Agreement (EULA) shipped with the software.<br />
<br />
=== RegName ===<br />
Name in Registry<br />
<br />
=== SHA1 === <br />
SHA1 checksum, to verify the download.<br />
By standard SHA1 is case-insensitive.<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
On Windows systems usually both nominal size and size on disk are reported, in this case use the former.<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
HTTPS is not mandatory but recommended.<br />
<br />
=== Version ===<br />
This is the version of the program. <br />
In the code it is treated as a zero terminated string, so the decimal separator shouldn't matter, RAPPS should only check if the string of the latest available version is different from the installed one.<br />
<br />
== Deprecated fields ==<br />
<br />
=== LicenseInfo ===<br />
For a while the wiki erroneously reported LicenseInfo instead of LicenseType. If it is found in a file, please simply replace it with LicenseType.<ref>https://jira.reactos.org/browse/CORE-17771</ref><br />
<br />
=== Size ===<br />
The Size parameter was used before the introduction of SizeBytes. It has now been deprecated<ref>https://github.com/reactos/rapps-db/pull/146</ref>.<br />
<br />
== Undocumented fields ==<br />
=== CDPath ===<br />
[https://reactos.org/forum/viewtopic.php?f=22&t=11015 Undocumented on the forum], apparently it is used in RAPPS source in 0.4.13, but it is no longer present in RAPPS source on master (0.4.15-dev)<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not included yet in the current stable (0.4.13), and are only available in development (0.4.15-dev).<br />
<br />
These work well enough to be tested and used but might still be subject to changes before being merged in stable.<br />
<br />
== Architecture-based Sections ==<br />
[[ReactOS ports|As ReactOS has several ports]] (at different stages of completions), it is already possible to define different sections for different architectures.<br />
Some files in Rapps-db already include different entries, but at the moment (0.4.13 release) the x86 port is the only one working.<br />
<br />
If not differently specified, all entries are assumed to be x86.<br />
<br />
These are the possible values for the architecture<ref>https://github.com/reactos/reactos/blob/master/base/applications/rapps/include/misc.h</ref>:<br />
* [Section.x86] - i586. Can be omitted, by default all entries are supposed to be for x86.<br />
* [Section.amd64] - x86_64/x64<br />
* [Section.arm] - ARM<br />
* [Section.arm64] - ARM64<br />
* [Section.ia64] - Itanium<br />
* [Section.ppc] - PowerPC<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a necessary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
<br />
== New Sections Fields ==<br />
<br />
=== Icon ===<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section', and include the .ico extension.<br />
The icon itself should be placed in the `icons` folder in the rapps-db repository.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseType === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
* 1 - "Open Source"<br />
* 2 - "Freeware" <br />
* 3 - "Demo/Trial"<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...)<br />
<br />
Currently, only first Screenshot is used. Ensure the URL is a direct link to the image, not a page containing the image (e.g. Imgur links).<br />
It is also preferred to include the screenshot taken on ReactOS, not on Windows.<br />
<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
; Example of a current application in RAPPS with a screenshot<br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
Version = 17.12<br />
License = GPLv3<br />
Description = An open source, cross-platform, powerful IDE. It does not contain a compiler.<br />
Size = 35.6 MiB<br />
Category = 7<br />
URLSite = http://www.codeblocks.org/<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
* Documentation<br />
** [https://doxygen.reactos.org/dir_f72badb8674797321b701dde383e2467.html RAPPS generated documentation (Doxygen)]<br />
** [https://github.com/reactos/reactos/blob/master/base/applications/rapps/README.ENG RAPPS Readme on GitHub]<br />
* Forum topics<br />
** Tutorials<br />
*** [https://reactos.org/forum/viewtopic.php?f=22&t=11015 RAPPS - For those that want more from it.]<br />
* GSoCs that involved RAPPS<br />
** 2020<br />
*** [https://reactos.org/blogs/gsoc-2020-rapps-final-report/ Rapps Enhancement final report - GSoC 2020]<br />
*** [https://reactos.org/blogs/gsoc-2020-rapps-stage12/ Rapps Enhancement stage 1 & 2 - GSoC 2020]<br />
*** [https://reactos.org/blogs/gsoc-2020-rapps/ Rapps Enhancement - GSoC 2020]<br />
** 2017<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-volume-5/ RAPPS Enchancements: GSoC 2017 Edition Volume 5]<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-volume-3-and-4/ RAPPS Enchancements: GSoC 2017 Edition Volume 3 and 4]<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-volume-21/ RAPPS Enchancements: GSoC 2017 Edition Volume 2.1]<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-volume-2-2/ RAPPS Enchancements: GSoC 2017 Edition Volume 2]<br />
*** [https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-0/ RAPPS Enchancements: GSoC 2017 Edition]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Google_Summer_of_Code_2021&diff=52185Google Summer of Code 20212021-03-22T19:11:15Z<p>Learn more: /* Reach us out */</p>
<hr />
<div>[[File:GSoC-logo2016.png|frameless|center|600px|link=https://summerofcode.withgoogle.com/organizations/5375811286204416/]]<br />
<br />
== What is GSOC? ==<br />
Google Summer of Code is a global program focused on bringing more student developers into open source software development. Students work with an open-source organization on a 3-month programming project during their break from school.<br />
<br />
<!-- Commented out; accepted students are now listed<br />
== Potential Students ==<br />
This is the list of potential students who want to participate in ReactOS GSoC 2021. The list is maintained by the community and interested students, and does not reflect official developers position or opinion.<br />
<br />
Your official proposals should be sent via Google's GSoC interface, details are described below.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Student !! Area of interest !! Links & Contacts !! Small contribution<br />
|}<br />
--><br />
<br />
== Student's checklist ==<br />
<br />
=== Choose the area you're most interested in ===<br />
ReactOS is a large project, it involves many areas of software development - kernel development, graphics, networking, sound, build tools and more. The earlier you know which area you would like to work in, the more time you have for actual coding. You can check the [[Google Summer of Code 2021 Ideas]] page for some an inspiration, and feel free to ask mentors for help too.<br />
<br />
=== Reach out to us ===<br />
Effective communication is a key requirement for a successful project. Our main communication platform is Mattermost, and you are advised to join our [https://chat.reactos.org/reactos/channels/development Development channel] there (there is also a bridged [irc://irc.freenode.net/#reactos-dev #reactos-dev] channel on Freenode’s IRC network)<br />
<br />
Ask questions, look for possible mentors and discuss your proposal. '''Note: proposals which don't have prior discussion with mentors and the team in general have less chances to succeed'''<br />
<br />
=== Get familiar with the code ===<br />
Every student new to ReactOS should begin by obtaining the code through our [https://github.com/reactos/reactos GitHub] repository and performing the first build using our [https://www.reactos.org/wiki/ReactOS_Build_Environment build environment]. This environment ensures consistent build results, eliminates the need to set up your own toolchain and makes ReactOS one of the easiest operating systems to build.<br />
<br />
Creating a fork of the ReactOS repository on GitHub is recommended for most students. This enables the use of branches and pull requests for contributions.<br />
<br />
=== Make a small contribution === <br />
Before your application can be accepted, it is expected that you submit a patch proposing a code change to the project, and work through the process of getting it merged into the master branch. Check out the [https://jira.reactos.org/issues/?filter=14803 starter-project label] on JIRA for ideas, or ask the chat providing your area of interest. You are not required to complete these steps in solitude, and we are happy to help with any part of the process if asked. Please note that while translations, documentation or comment fixes are an easy way to validate your workflow, they do not count towards this requirement.<br />
<br />
Go through [[Development Introduction]] to get started with your contribution.<br />
<br />
=== Fill out your application ===<br />
See the [[#Student Application Form|Student Application Form]] below.<br />
<br />
=== Read the documentation ===<br />
MSDN and plenty of available Windows publications serve as the primary reference for functionality ReactOS seeks to implement. However, there are parts of Windows that are poorly documented or completely undocumented. In these instances, the ReactOS [[Techwiki]] may possess descriptions of the data structures or interfaces. If no documentation exists, students may have to conduct their own research and document the results – following project guidelines on respecting intellectual property. Our mentors can help guide this research process.<br />
<br />
== Our GSoC Adminstrators ==<br />
* [[Colin Finck]]<br />
* [[Victor Perevertkin]]<br />
<br />
== Our Potential Mentors ==<br />
* TBA<br />
<br />
== Student Application Form ==<br />
Students apply via the [https://summerofcode.withgoogle.com/ Google Summer of Code web site].<br />
Please see the information found there about how GSoC works for students, the timeline, and other details.<br />
<br />
=== General Information ===<br />
* '''Full Name'''<br />
* '''Languages You Speak'''<br />
* '''Timezone'''<br />
* '''ReactOS website Account Name'''<br />
* '''IRC Nickname on Freenode'''<br />
<br />
=== Time Commitment ===<br />
You are required to outline any additional obligations you may have during the summer and how much of your time you will be able to commit to your GSoC project.<br />
Failure to do so will result in a rejection of your application.<br />
<br />
=== Proposed Project ===<br />
Please provide a brief description, in your own words, of the project you are interested in<br />
<br />
=== Proposed Milestones ===<br />
Please propose milestones that can be used to gauge progress on the project.<br />
<br />
=== Legal Requirements ===<br />
Students are required to affirm that the following is true.<br />
I hereby swear that I have not used nor seen the source code to any version of the Windows operating system nor any Microsoft product that may be related to the proposed project that is under a license incompatible with contribution to ReactOS, including but not limited to the leaked Windows 2000 source code and the Windows Research Kernel.<br />
<br />
== FAQ ==<br />
;Why do you want a code contribution before I'm accepted?<br />
<br />
This serves several purposes. It displays that you have the most basic skills that are required: building ReactOS from source, running it either natively or inside a VM, and using tools for online collaboration (GitHub, chat, etc.). More importantly, it provides our mentors with some insight into each individual student's motivation and abilities. It is an opportunity for you, the student, to showcase yourself and to convince us that you are indeed the right person for the job.<br />
'''The code contribution is a very important part of your application.'''<br />
<br />
;What criteria do you use for passing or failing students?<br />
<br />
As you know, Google Summer of Code has three monthly evaluation points. If you happen to receive a failing mark at either point, you are not paid that portion and your internship comes to an abrupt end. There are two areas that are considered during the evaluation: '''code output''' and '''communication/interactions'''.<br />
<br />
A word of caution -- do not expect to make miracles during the week of mid-term or final evaluations. Instead, expect your mentor to evaluate your progress on the first day of the window.<br />
* '''Code'''. This includes everything from 'commit worthy' patches to all the code (and non-code, such as design documents or pseudo code) leading up to the patch. In other words, if for some reason you and your mentor pursue an approach that turns out to be a dead end you will not be punished.<br />
* '''Communication'''. This mostly includes speaking with the team in chat, discussions in GitHub PR reviews and writing blog posts about your progress. (check out [https://reactos.org/tags/gsoc/ posts] from our former students)<br />
<br />
In other words, you will be writing code and talking with one or more mentors at least a couple times a week. Anything less may hurt your mid-term and final evaluation! Do not expect to be able to cram days, weeks, or months of work into a shorter period and receive a passing evaluation.<br />
<br />
;What is your plan for dealing with disappearing students?<br />
<br />
While every effort will be made to select students who are unlikely to disappear, we recognize that unpredictable circumstances are always possible. As such, we will require that all students provide backup contact information that we will verify as a failsafe in case students drop out of contact and are unable to inform us directly. Based on the situation, we will try to work with the student to accommodate any special circumstances that arise to ensure a project’s success, but if a student is unable to complete their project we will contact the GSoC team to consider any necessary actions, including marking a project as failed.<br />
<br />
;What is your plan for dealing with disappearing mentors?<br />
<br />
While the mentor candidates we have selected are considered highly reliable, we again recognize that life can result in unexpected circumstances. As noted above, the mentor candidates we have selected are knowledgeable in more than just one specific part of Windows NT, and we will encourage students to consult with not just their assigned mentor but also others taking part in the GSoC program. As such, students will always have advisers available to them even if their assigned mentor is unable to continue with the project thanks to the fact that pretty much all our active contributors are wide-coverage developers.<br />
<br />
;Besides my mentor, who else is available to help me?<br />
<br />
Besides developers not directly involved as mentors, we encourage all of our mentors to interact with students. As such, consider any mentor or developer as a resource to field questions and help as needed.<br />
<br />
== Links ==<br />
; [https://reactos.org/tags/gsoc/ Status reports from former GSoC students on our blog]<br />
; [https://google.github.io/gsocguides/student/ GSoC Student Guide: What is Google Summer of Code?]<br />
; [https://developers.google.com/open-source/gsoc/resources/ Google Summer of Code Resources]<br />
<br />
[[Category:Google Summer of Code]]<br />
[[Category:Community]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=52184Developing ReactOS with Visual Studio2021-03-22T10:25:30Z<p>Learn more: /* Creating the Solution */</p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
''This workflow is mainly for working on usermode applications.''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>cmake --version</pre><br />
#* The result should be: '''''<tt>cmake version 3.17.1-ReactOS</tt>'''''<br />
# Ensure that BISON and M4 are correctly configured:<br />
#* <pre>set M4</pre> and <pre>set BISON_PKGDATADIR</pre><br />
#* The output should be: '''''<tt>M4=C:\RosBE\Bin\m4.exe</tt>''''' and '''''<tt>BISON_PKGDATADIR=C:\RosBE\share\bison</tt>'''''<br />
#* IF THESE ARE NOT SET OR NOT SET CORRECTLY, ADD THEM MANUALLY:<br />
#* <pre>set BISON_PKGDATADIR=C:\RosBE\share\bison</pre><pre>set M4=C:\RosBE\Bin\m4.exe</pre><br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]<br />
<br />
__FORCETOC__</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51759RAPPS2020-12-23T10:42:14Z<p>Learn more: /* Size */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
You can fork the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My fun stuff-o-matic<br />
RegName = Name in Registry<br />
Version = 1.1.1<br />
License = GPL<br />
Description = Shortish description giving some additional background information about what it does.<br />
SizeBytes = 10485760<br />
Category = 5<br />
URLSite = https://example.org/<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
Screenshot1 = Screenshot URL<br />
Icon = Icon filename in icons folder (with .ico extension)<br />
<br />
[Section.0419] ; 0419 - for Russian language<br />
Description = Description in Russian language<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Version ===<br />
This is the version of the program.<br />
<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source. Or more specifically, GPL, MIT and so on.<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does..<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...) Currently, only first Screenshot is used.<br />
<br />
=== Icon ===<br />
Icon filename in icons folder (with .ico extension)<br />
<br />
== [Section.0419] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
== Icon and Screenshot Support ==<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section'.<br />
The icon itself should be placed in the `icons` folder.<br />
<br />
There is also support for a screenshot, which should be uploaded to an image host.<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Icon=codeblocks.ico<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51240RAPPS2020-10-03T16:20:43Z<p>Learn more: /* File Schema */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
You can fork the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is an example description file.<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = My fun stuff-o-matic<br />
RegName = Name in Registry<br />
Version = 1.1.1<br />
License = GPL<br />
Description = Shortish description giving some additional background information about what it does.<br />
SizeBytes = 10485760<br />
Category = 5<br />
URLSite = https://example.org/<br />
URLDownload = https://ftp.example.org/pub/installer.exe<br />
Screenshot1 = Screenshot URL<br />
Icon = Icon filename in icons folder (with .ico extension)<br />
<br />
[Section.0419] ; 0419 - for Russian language<br />
Description = Description in Russian language<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
<br />
=== Name ===<br />
This is the program name that is displayed.<br />
<br />
=== Version ===<br />
This is the version of the program.<br />
<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source. Or more specifically, GPL, MIT and so on.<br />
<br />
=== Description ===<br />
The description of the program giving some additional background information about what it does..<br />
<br />
=== Size ===<br />
Size of the program. Template: NUMBERUNIT For example "10 MB".<br />
<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
=== ScreenshotN ===<br />
Screenshot URL link. (N = 1, 2, 3 ...) Currently, only first Screenshot is used.<br />
<br />
=== Icon ===<br />
Icon filename in icons folder (with .ico extension)<br />
<br />
== [Section.0419] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
Current available options are listed below:<br />
*<code>/?</code> - display the usage of RAPPS commandline<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7zip akelpad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7zip<br />
Install=akelpad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as the filename in database textfiles.<br />
<br />
*<code>/FIND</code> - accepts multiple strings and find all corresponding apps contains the strings in the name or description.<br />
Example: <code>rapps /FIND Firefox "Python 3"</code><br />
*<code>/INFO</code> - accepts multiple package-name and display apps information correspond with the package-name.<br />
Example: <code>rapps /INFO rosbe codeblocks</code><br />
== Icon and Screenshot Support ==<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section'.<br />
The icon itself should be placed in the `icons` folder.<br />
<br />
There is also support for a screenshot, which should be uploaded to an image host.<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Icon=codeblocks.ico<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Debugging&diff=51094Debugging2020-09-17T14:29:23Z<p>Learn more: gflags +sls</p>
<hr />
<div>This page describes different methods of debugging ReactOS and the steps necessary to debug ReactOS.<br />
<br />
= Introduction =<br />
To be able to help ReactOS development, whether this is participating in the development of the source code or taking part in crucial testing, you are going to need knowledge of how to generate useful debug logs.<br />
<br />
Useful debug logs are essential pieces of information that the developer needs to quickly pinpoint and identify exactly what the operating system is doing. Many people know how to get default debug output from the operating system, but this is generally not particularly useful for locating problems, especially bugs.<br />
<br />
This article aims to give users knowledge not only on how to generate a debug log, but on how to generate a useful debug log which can be used directly to assess what the operating system is doing.<br />
<br />
= Available debugging methods =<br />
There are various methods to debug ReactOS, some require more knowledge than others. These are listed below.<br />
<br />
== Debugging through text messages ==<br />
This is the easiest method for receiving debug information from ReactOS.<br />
<br />
=== Serial Port ===<br />
The serial port is the most common method used for receiving debug messages from ReactOS.<br />
The method used for receiving data from the serial port depends on whether you run ReactOS in a virtual machine or on a real computer.<br />
If you plan to use virtual machine, you might want to consider using [[Com0com]] instead of named pipe for connecting with virtual serial port. <br />
Also, you may try to test the serial port with [http://www.eltima.com/rs232-testing-software/ RS232 test software].<br />
<br />
==== Virtual machines ====<br />
How to handle serial output from virtual machines can be found on the VM specific debugging pages:<br />
* [[QEMU#Grabbing_debug_messages|QEMU]]<br />
* [[VirtualBox#Getting_debug_output|VirtualBox]]<br />
* [[VMware#Getting_debug_output|VMware]]<br />
<br />
==== Real computer: Physical serial cable ====<br />
You will need a physical serial cable if you want to receive debug messages from a real computer through the serial port. This method also requires two computers (one on which you test ReactOS and another one for receiving the debug messages). The ReactOS test computer must have a serial port. Note that a USB-serial adapter is unsuitable, but a PCI serial card should work.<br />
<br />
The cable needed for this debugging method is a ''Null-Modem serial cable''. You should find it in many computer shops for less than 10 dollars. If you don't have one ready, you can also [http://jesusnjim.com/electronics/reactos-debug-cable.html build one]:<br />
<br />
DTE1_______________________________________________DTE 2<br />
<br />
9pol 25pol (female)__________________________25pol 9pol (female)<br />
5 7 ---GND---------------------GND------- 7 5<br />
<br />
2 3 ---RxD--------. ,----------RxD------- 3 2<br />
X<br />
3 2 ---TxD--------' `----------TxD------- 2 3<br />
<br />
7 4 ---RTS--------. ,----------RTS------- 4 7<br />
X<br />
8 5 ---CTS--------' `----------CTS------- 5 8<br />
<br />
4 20 ---DTR--------. ,----------DTR------- 20 4<br />
X<br />
6 6 ---DSR--o-----' `-------o--DSR------- 6 6<br />
| |<br />
1 8 ---DCD--' `--DCD------- 8 1<br />
<br />
Connect the cable to the first serial port of both computers.<br />
<br />
Then use a Terminal application like [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY] or Windows HyperTerminal on the computer for receiving the debug messages.<br />
Set it up to listen to the first serial port (COM1 [3F8/IRQ4]) and a baud rate of 115200. <br />
<br />
After that, boot ''ReactOS (Debug)'' on the test computer and you should receive debug messages. If this doesn't work, check your hardware and your freeldr.ini configuration.<br />
<br />
Serial hardware can be tricky to get right, but be persistent. There are a few things to remember:<br />
*Plan which connections are DTE and which DCE, and which gender each has. Know which serial port (1 or 2) you're connecting on each computer.<br />
*If you use a PCI serial card, it could be necessary to pass the serial port address to the kernel (for details see below).<br />
*Get the right kind of null modem. There are a few ways to make them and not all are the same.<br />
*Use shorter cables as much as possible.<br />
*Use a serial terminal program such as HyperTerminal or Minicom to observe the remote computer. If you don't see data you can recognize, then something is wrong.<br />
*GDB remote commands start with $ and end with ;. You'll be able to recognize them that way.<br />
*Note: use these settings (In HyperTerminal)<br />
** Bits per second: 115200<br />
** Data bits: 8<br />
** Parity: None<br />
** Stop bits: 1<br />
** Flow control: Hardware<br />
*Note: Some older BIOSes may have problems with a baud rate 115200. Try instead 9600 on test computer by editing the file freeldr.ini and use parameter /BAUDRATE=9600. Of course, you have to change the baudrate also to 9600 on the receiving computer.<br />
<br />
==== How to start Serial terminal on Linux ====<br />
* Firstly you need to have installed '''cu''' terminal program, for rpm-based systems '''cu''' is in '''uucp-V.V.V.rpm''' package. <br />
** on '''yum'''-based system run: ''sudo yum -y install uucp''<br />
** on '''apt'''-based system run: ''sudo apt-get install uucp''<br />
* Some Linux distributions require the next change in ''/etc/group'' file: add your user (or maybe ''root'') to group ''dialout''<br />
* Then run:<br />
<syntaxhighlight lang="bash"><br />
sudo cu -s 115200 --parity=none -l /dev/ttyS0<br />
</syntaxhighlight><br />
Here <br />
* /dev/ttyS0 is your COM port name, you could find its name by reading '''dmesg|grep tty''' command output.<br />
* also "-e -o" keys could be used instead of --parity=none<br />
<br />
====Troubleshooting====<br />
In case of "Line in use"/"Permission denied" error:<br />
<syntaxhighlight lang="bash"><br />
user1~ # cu -s 115200 --parity=none -l /dev/ttyS4<br />
cu: open (/dev/ttyS4): Permission denied<br />
cu: /dev/ttyS4: Line in use<br />
user1~ #<br />
</syntaxhighlight><br />
make sure you have included your '''user1''' to '''dialout''' group.<br />
<br />
====Serial terminal through FreeBSD====<br />
''cu'' goes preinstalled in FreeBSD.<br />
<br />
Run in console:<br />
<syntaxhighlight lang="bash"><br />
sudo cu -s 115200 -e -o -t -l /dev/cuau0<br />
</syntaxhighlight><br />
here /dev/cuau0 is your serial port (COM) device name, find right name of your COM port in in the output of dmesg command.<br />
And for other keys:<br />
* "-e -o" options together mean no-parity<br />
* -l /dev/Xdev specifies COM device name<br />
* -t denotes connection is hardwired to a host on a dial-up line (not sure is this key really needed).<br />
<br />
And to collect log output into a file for sending, run this script:<br />
<syntaxhighlight lang="bash"><br />
DATE=`date +"%F_%H%M%S"`<br />
screen -dmS ROSlogger script MyMachine1-ROS-debug-$DATE.log sudo cu -s 115200 -e -o -t -l /dev/cuau0<br />
</syntaxhighlight><br />
It will write log into file named MyMachine1-ROS-debug-$DATE.log, here $DATE will be the time when script was started.<br />
You could change here MyMachine1 to your machine name.<br />
<br />
=== Named Pipe ===<br />
<br />
To debug via named pipe, do the following:<br />
<br />
1. Set the named pipe in the VM's settings via the Serial section of it.<br />
<br />
2. Run Pipe2Sock (available at https://github.com/Zero3K/Pipe2Sock/releases) with the command line options similar to pipe2sock -a 127.0.0.1 -p 1001 \\.\pipe\ros (replacing the 1001 with whatever port you want to use and the \\.\pipe\ros with whatever named pipe you set in the settings). You can hide the console window by adding -n before the named pipe address.<br />
<br />
3. Open a terminal program (such as PuTTY or Dave's Terminal) and connect to 127.0.0.1 at whatever port you assigned.<br />
<br />
=== Debug text output to file ===<br />
Choose ''ReactOS (Log file)'' in the boot menu. The debug messages will go to a file called ''debug.log''. This method has some limitations. Fatal system error messages will not appear in the log file. To redirect the output into another file, edit the kernel parameter /DEBUGPORT=FILE in freeldr.ini. For example:<br />
<pre><br />
Options=/DEBUG /DEBUGPORT=FILE:\Device\Harddisk0\Partition1\debug.log /SOS<br />
</pre><br />
Or:<br />
<pre><br />
Options=/DEBUG /DEBUGPORT=FILE:\ArcName\multi(0)disk(0)fdisk(0)\debug.log /SOS<br />
</pre><br />
<br />
=== Debug text output to screen ===<br />
Choose ''ReactOS (Screen)'' in the boot menu.<br />
<br />
Or edit freeldr.ini to contain an entry like the following:<br />
<syntaxhighlight lang="ini"><br />
[ReactOS_Debug]<br />
BootType=Windows2003<br />
SystemPath=multi(0)disk(0)rdisk(0)partition(1)\ReactOS<br />
Options=/DEBUG /DEBUGPORT=SCREEN /SOS<br />
</syntaxhighlight><br />
<br />
<br />
==== Advanced option: Debugging the debug logger ====<br />
Sometimes things go wrong and it becomes necessary to debug the debug logger, say SCREEN logger. To do this, it is possible<br />
to turn on more than one logger, by specifying it on kernel command line options like this:<br />
Edit freeldr.ini to contain an entry like the following:<br />
<syntaxhighlight lang="ini"><br />
[ReactOS_Debug2]<br />
BootType=Windows2003<br />
SystemPath=multi(0)disk(0)rdisk(0)partition(1)\ReactOS<br />
Options=/DEBUG /DEBUGPORT=SCREEN /DEBUGPORT=COM1 /SOS<br />
</syntaxhighlight><br />
<br />
=== Changing the BAUD rate ===<br />
If you think that 115200 is way too slow and your serial connection supports higher speeds, like virtual com ports do, you can change it. Note that some BIOSes on older test computer may have a problem with 115200. In that case, use 9600 instead.<br />
<br />
1. Open the freeldr.ini in the ReactOS installation's root folder.<br />
<br />
2. Locate the "[ReactOS_Debug]" section<br />
<br />
3. Change setting to something like "/BAUDRATE=921600" (tested to work with hyperterminal and putty)<br />
<br />
4. Save file.<br />
<br />
5. Change your terminal's BAUD rate.<br />
<br />
=== Changing the serial port address ===<br />
Edit the kernel parameter /DEBUGPORT=COM. <br />
This could be necessary if you use a PCI, PCIe, PCMCIA, or ExpressCard serial card on real hardware. These cards are used with notebook computers without a built-in serial port.<br />
For example:<br />
<pre><br />
Options=/DEBUG /DEBUGPORT=COM:0xCC00 /BAUDRATE=115200 /SOS<br />
</pre><br />
<br />
'''See also:''' [http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/serial-debugging-howto#TOC-Appendix-A:-How-to-find-alternate-IO-and-MMIO-addresses-for-your-UART Chromium OS Serial Debugging HOWTO] on how to determine the I/O address of inserted extension card.<br />
<br />
'''Note:''' ReactOS does not (yet!) support memory mapped I/O (MMIO) based (modern) serial extension cards.<br />
<br />
== KDBG ==<br />
See [[kdbg|kdbg command reference]] for more information about the built-in kernel debugger.<br />
<br />
== GDB ==<br />
To use GDB as a kernel debugger, see [[GDB]].<br />
<br />
Needed Items:<br />
*GDB (included in ReactOS [[Build Environment]])<br />
*[[QEMU]]<br />
<br />
Start QEMU as you normally would, but add the following command line parameters:<br />
-s -S<br />
<br />
This is done so that QEMU starts in the STOPPED state, and allows you to connect using GDB. <br />
Now it's time to get GDB off the ground.<br />
* (Assuming you are in the RosBE command line), enter “gdb” to start GDB.<br />
* Enter “file ./output-i386/ntoskrnl/ntoskrnl.exe” to tell GDB where to load information about the kernel.<br />
* If you prefer Intel syntax then enter “set disassembly-flavor intel”.<br />
* Enter “target remote localhost:1234” to connect GDB to QEMU.<br />
* Enter “c” (for “continue“) to have GDB instruct QEMU to start/continue execution of the emulation.<br />
* To manually pause execution, make sure your GDB window has focus and simply enter <CTRL>+<C><br />
<br />
== WinDbg ==<br />
{{Main|WinDBG}}<br />
<br />
To take full advantage of WinDBG, you need to compile ReactOS with MSVC to get PDB symbols. For MSVC builds this is the default debugging style. If you want to use gcc builds, you need to compile with WINKD option set to TRUE (you can either use CMake-GUI and edit the value after configuring and then reconfigure, or you can edit the default value in the options.cmake file)<br />
Another possibility is to replace ntoskrnl.exe and kdcom.dll built with the WINKD = TRUE option. You can also replace kdcom.dll with the one from Windows 2003, which has a few more features such as reconnect and break-in which do not work properly with ReactOS's own kdcom.<br />
<br />
For more information on setting up WinDBG checkout [[WinDbg_Tutorial|[Link]]]<br />
<br />
= Generating even more output =<br />
<br />
In order to get meaningful debug output it is sometimes necessary to enable extra verbosity.<br />
<br />
== Turning on verbosity at compile time ==<br />
<br />
===ReactOS Style===<br />
Nearly all ReactOS modules use the built-in "ReactOS style" debugging functionality. This style is characterized by:<br />
<br />
*Verbosity level is usually defined per file.<br />
*Only 2 message levels:<br />
**always enabled (DPRINT1)<br />
**only enabled when NDEBUG is not defined (DPRINT)<br />
<br />
Files that follow this style can easily be spotted by this code:<br />
<syntaxhighlight lang="c"><br />
#define NDEBUG<br />
#include <debug.h><br />
</syntaxhighlight><br />
To enable full verbosity just comment out the "#define NDEBUG", and remember to uncomment it when submitting patches.<br />
<br />
If you are getting an error like '''undefined reference to DbgPrint''', head to the target's '''CMakeLists.txt''' and add '''ntdll''' at the end of the line beginning with '''add_importlibs'''.<br />
<br />
Example:<br />
<syntaxhighlight><br />
add_importlibs(3dtext user32 gdi32 opengl32 glu32 advapi32 msvcrt kernel32 ntdll)<br />
</syntaxhighlight><br />
<br />
==== Adding own debug messages ====<br />
Be sure that you included debug.h<br />
<syntaxhighlight lang="c"><br />
#include <debug.h><br />
</syntaxhighlight><br />
And use DPRINT / DPRINT1, both work like <tt>printf</tt>, but have some [[DPRINT codes|different codes]].<br />
<br />
===WINE Style===<br />
<br />
sample line to enable debug channels in usermode applications, in file:<br />
<br />
boot/bootdata/hivesys.inf<br />
<br />
<pre><br />
; Debug channels<br />
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","DEBUGCHANNEL",0x00020000,"+ole,+rpc"<br />
</pre><br />
<br />
== Turning on verbosity at runtime ==<br />
The easiest way to turn on debug verbosity on any particular component is to use DEBUGCHANNEL environment variable. For example, to get all debug messages from MSI, simply run in CMD:<br />
<br />
<pre><br />
set DEBUGCHANNEL=+msi<br />
</pre><br />
<br />
To check the current value of condition variable DEBUGCHANNEL you can run this command in CMD:<br />
<pre><br />
ECHO %DEBUGCHANNEL% <br />
</pre><br />
<br />
Then, run the app you wish to test '''from the same CMD prompt'''. You can add debug messages from multiple components, for example:<br />
<br />
<pre><br />
set DEBUGCHANNEL=+msi,+rpc,+ole<br />
</pre><br />
<br />
You can find a complete list of the debuggable components [http://wiki.winehq.org/DebugChannels here].<br />
<br />
'''After closing down CMD, debug verbosity will change to default.'''<br />
<br />
The syntax of the DEBUGCHANNEL environment variable is:<br />
<pre><br />
DEBUGCHANNEL=[class]+xxx,[class]-yyy,...<br />
</pre><br />
For example:<br />
<pre><br />
DEBUGCHANNEL=+all,warn-heap<br />
</pre><br />
turns on all messages except warning heap messages.<br />
<br />
The available message classes are: err, warn, fixme, trace.<br />
<br />
<br />
== Configure logging format ==<br />
Debug logging in ReactOS does not include function names by default. To change the format at runtime use the environment variable '''DEBUGFORMAT'''.<br />
To set the wine format:<br />
<pre><br />
set DEBUGFORMAT=wine<br />
</pre><br />
To set the extended format:<br />
<pre><br />
set DEBUGFORMAT=ext<br />
</pre><br />
or:<br />
<pre><br />
set DEBUGFORMAT=extended<br />
</pre><br />
If no format or an invalid one is specified, the fall-back default format is used instead.<br />
<br />
== Breaking into the built-in kernel debugger ==<br />
Bugchecks occur when the operating system can no longer operate safely and to avoid corrupting data, it halts operation. This will normally throw up a Blue Screen Of Death, but if you have the kernel debugger activated, it will drop you into the prompt giving you access to explore the system state. By default ReactOS debug builds have the integrated kernel debugger ([[kdbg]]) enabled. Release builds do NOT have this feature enabled and will only display a blue screen.<br />
<br />
There are two ways for forcing a bugcheck, each one employing a different method:<br />
<br />
=== Dynamic ===<br />
If you have a debug build and want to halt the system for any given reason and break into the the kernel debugger, you can force a bugcheck from the keyboard by simply typing:<br />
{{Keyboard|TAB}}+{{Keyboard|K}}<br />
<br />
<br />
Remember that kdbg output goes out through the serial port, but it receives input from the keyboard by default.<br />
<br />
To allow input through the serial port as well start with ReactOS with the boot option "ReactOS (RosDbg)" or add the command /KDSERIAL to your freeldr.ini boot options.<br />
<br />
==== Breaking on user mode Exceptions ====<br />
For each type of exception known by KDB you can set the condition when KDB should be entered individually for first and last chance. The possible settings for the conditions are ''never'', ''umode'', ''kmode'' and ''always''.<br />
* ''never'': kdbg won't be entered when exceptions are raised<br />
* ''umode'': kdbg will be entered when the exception was raised in usermode<br />
* ''kmode'': kdbg will be entered when the exception was raised in kernel mode<br />
* ''always'' kdbg will be entered on every exception<br />
<br />
To change the condition to enter KDB on all exceptions to "always" (default is "kmode"), enter the debugger and type:<br />
<br />
<pre><br />
set condition * first always<br />
</pre><br />
<br />
Type "cont" to continue normal execution.<br />
<br />
==== Sampling the Stack ====<br />
If the system shows very high CPU usage or appears frozen, it may be possible to find the culprit by sampling the processor's call stack.<br />
<br />
To obtain a simple sampling profile using the kernel debugger,<br />
* break into the debugger using {{Keyboard|TAB}}+{{Keyboard|K}} during a time of high CPU usage,<br />
* issue the <code>bt</code> command to print a stack backtrace (see [[#Generating a backtrace]]),<br />
* issue the <code>cont</code> command to continue execution,<br />
* repeat this process until you've obtained 3-5 backtraces, or the period of high CPU usage stops.<br />
<br />
The backtrace samples obtained this way often show where processor time is being spent, and can pinpoint functions that have bugs or require optimization.<br />
<br />
Please note that backtraces are of limited use if they have not been translated. When showing them to other people, be sure to [[#Translating Addresses|translate the addresses]], or include the exact binary files you used (or a link to the iso) to allow others to perform the translation.<br />
<br />
=== Static ===<br />
This is useful when you want to halt the operating system when it hits a particular area of code you might be debugging. This is especially useful as you can get an immediate backtrace to see where the code flow came before the bugcheck was forced.<br />
<br />
This is done by using KeBugCheck() or ASSERT() in the code.<br />
<br />
== Generating a backtrace ==<br />
In order to generate a backtrace, you must break into the KDBG prompt.<br />
<br />
Enter 'bt' and hit {{Keyboard|RETURN}}, you should see something similar to the following:<br />
<pre><br />
(drivers\filesystems\vfat\rw.c:809) <\ReactOS\system32\kernel32.dll><br />
Entered debugger on embedded INT3 at 0x0008:0x800935f2.<br />
kdb:> bt<br />
Eip:<br />
<ntoskrnl.exe:935f3 (lib\rtl\i386\debug_asm.S:31 (DbgBreakPoint@0))><br />
Frames:<br />
<vfatfs.sys:97de (drivers/filesystems/vfat/misc.c:111 (VfatDispatchRequest))><br />
<vfatfs.sys:9b25 (drivers/filesystems/vfat/misc.c:167 (VfatBuildRequest))><br />
<ntoskrnl.exe:3ab23 (ntoskrnl/io/iomgr/irp.c:1088 (IofCallDriver))><br />
<ntoskrnl.exe:36206 (ntoskrnl/io/iomgr/iofunc.c:686 (IoSynchronousPageWrite))><br />
<ntoskrnl.exe:59daa (ntoskrnl/mm/section.c:6330 (MmspWriteDataSectionPages))><br />
<ntoskrnl.exe:244c6 (ntoskrnl/ex/work.c:162 (ExpWorkerThreadEntryPoint))><br />
<ntoskrnl.exe:70e90 (ntoskrnl/ps/thread.c:134 (PspSystemThreadStartup))><br />
<ntoskrnl.exe:7b142 (ntoskrnl\ke\i386\ctxswitch.S:258 (KiThreadStartup@156))><br />
kdb:> <br />
</pre><br />
<br />
The bt command will show a backtrace of the currently attached thread, so it may be necessary to use the 'thread attach' command, please refer to the [[kdbg]] manual for more details.<br />
<br />
Examining this in more detail, we can see that the bugcheck occurred via the INT3 operation which then dropped us into kdb. The next line shows us Eip which is the instruction pointer, and this points to the last address before the system halted.<br />
<br />
Following on from that are the frames. This is the important part of generating our backtrace and it contains all the function addresses in the buildup to the bugcheck. This is the crucial information developers need to understand the codeflow before the bugcheck.<br />
<br />
== Translating Addresses ==<br />
<br />
Occasionally, there will come a time when you will need to manually translate addresses.<br />
When kdbg is not enabled and a bugcheck occurs, you will be presented with a stack trace similar to the following:<br />
<br />
(subsystems\win32\csrss\win32csr\conio.c:1101) Console_Api Ctrl-C <BR><br />
*** Fatal System Error: 0x00000001<br />
(0x80079279,0x00000000,0x0000FFFF,0x00000000) <BR><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 29bb><br />
<\SystemRoot\System32\HAL.DLL: 4749><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 54cb4><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 582bf><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 583fd><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 89956><br />
<\SystemRoot\system32\drivers\videoprt.sys: 2417><br />
<\SystemRoot\system32\drivers\vbemp.sys: 17f5><br />
<\SystemRoot\system32\drivers\vbemp.sys: 19cf><br />
<\SystemRoot\system32\drivers\videoprt.sys: 1c48><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 34c17><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 21e0><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 2908><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 29bb><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 85fa8><br />
<br />
As you can see, this is largely the same as the information presented when issuing a 'bt' command in kdbg. The problem here, however, is that only the addresses are given. As these addresses are different for everyone's builds, this information is useless for anyone trying to follow what events occurred in the lead up towards to bugcheck.<br />
<br />
The solution here is to translate the addresses into human-readable function names. This is done via a tool named 'raddr2line' which is a modified version of the Unix tool 'addr2line'. This tool will translate the addresses given to it into file names and line numbers. It does this by using debug information in the executable files to associate the address with this human-friendly info and outputs it into the console. This information can be pasted into the above debug log alongside the addresses providing the developers with a detailed stack trace.<br />
<br />
raddr2line is included in the ReactOS Build Environment. It is invoked in the following way :<br />
<br />
raddr2line <file> <address><br />
<br />
So taking the bottom address in the above stack trace :<br />
<br />
C:\Users\Ged\MyFiles\ReactOS\clean_source>raddr2line ntoskrnl.exe 85fa8<br />
<br />
C:\Users\Ged\MyFiles\ReactOS\clean_source\output-i386\ntoskrnl\ntoskrnl.exe<br />
obj-i386\ntoskrnl\ex\zw.S:253 (ZwClearEvent)<br />
<br />
we can see here that the address translation for 0x85fa8 is line 253 in file ntoskrnl\ex\zw.S (this will differ if you try it on your build)<br />
<br />
This information can now be added into the above stack trace as follows :<br />
<br />
<\SystemRoot\System32\NTOSKRNL.EXE: 29bb> <enter next one here><br />
<\SystemRoot\System32\NTOSKRNL.EXE: 85fa8> obj-i386\ntoskrnl\ex\zw.S:253 (ZwClearEvent)<br />
<br />
== Enabling Kernel Tracing ==<br />
Refer to [[Enable kernel tracing|'''this article''']] for instructions on how to enable kernel tracing.<br />
<br />
== Debug Page Heap (DPH) ==<br />
<br />
Based on the functionality of Windows Page Heap Verification, this mechanism is useful for more in-depth debugging of user mode Heap issues (crashes in ntdll:heap functions). It can be enabled per application or globally (for the whole system).<br />
<br />
To enable DPH per particular application, gflags.exe is needed. This program is a part of the packages Debugging Tools for Windows and Windows Support Tools. Be sure to download the 32-bit package. GFlags.exe must be executed from ReactOS with the following syntax: "gflags /p /enable application.exe /full" and the application executed afterward. Debug can be disabled by rerunning gflags with /disable switch or by rebooting.<br />
<br />
To enable DPH system-wide, you need to apply the following patch to the ReactOS source : <br />
<syntaxhighlight lang="diff"><br />
Index: lib/rtl/heap.c<br />
===================================================================<br />
--- lib/rtl/heap.c (revision 64030)<br />
+++ lib/rtl/heap.c (working copy)<br />
@@ -1234,6 +1234,8 @@<br />
NTSTATUS Status;<br />
ULONG MaxBlockSize;<br />
<br />
+ RtlpPageHeapEnabled = TRUE;<br />
+<br />
/* Check for a special heap */<br />
if (RtlpPageHeapEnabled && !Addr && !Lock)<br />
{<br />
@@ -1254,6 +1256,8 @@<br />
Flags &= HEAP_CREATE_VALID_MASK;<br />
}<br />
<br />
+ if (!Addr) Flags |= HEAP_FLAG_PAGE_ALLOCS;<br />
+<br />
/* TODO: Capture parameters, once we decide to use SEH */<br />
if (!Parameters) Parameters = &SafeParams;<br />
</syntaxhighlight><br />
<br />
When using WinDbg, you can also use the "!gflag +hpa" command, which will enable DPH for any processes started after the command was issued.<br />
<br />
== Special Pool ==<br />
Special Pool is the debug version of the kernel pool and helps detect overruns (optionally underruns) as well as uses after free.<br />
<br />
The following constraints apply to the use of Special Pool:<br />
* Only allocations of 4088 bytes and smaller can use special pool.<br />
* Many Memory Manager structures rely on residing in specific memory regions, so they cannot be placed in Special Pool. Unless specifically trying to solve an Mm issue it is best to avoid placing any Mm allocations in Special Pool.<br />
* There is only a limited number of pages in the virtual address space reserved for Special Pool, and every allocation occupies two pages. Hence you may run out of pages quickly if you direct too many allocations to use special pool. This will be indicated by a "Special pool: No PTEs left!" debug print, and the allocations will fall back to regular pool. When enabling special pool on all allocations, this already happens at boot.<br />
<br />
To enable Special Pool:<br />
* To use Special Pool for a single pool tag, set a value for <code>MmSpecialPoolTag</code> in ntoskrnl/mm/ARM3/pool.c. All allocations using this tag will be placed in Special Pool as long as PTEs are available.<br />
* To enable Special Pool for all allocations, set <code>MmSpecialPoolTag</code> to <code>'*'</code>.<br />
* To enable it for more than one tag, set <code>MmSpecialPoolTag</code> to anything exceept 0 or -1 and modify <code>MmUseSpecialPool</code> in ntoskrnl/mm/ARM3/special.c (e.g. to return <code>TRUE</code> for mutliple tags).<br />
<br />
Tips & Tricks:<br />
* You can change the value of MmSpecialPool tag at any time &mdash; the only constraint is that it must not be 0 or -1 at boot, or Special Pool will never be initialized. Example WinDbg command: <code>ed nt!MmSpecialPoolTag 'DCBA'</code><br />
<br />
== Show loader snaps ==<br />
<br />
Loader snaps show (very) verbose information about how ReactOS loads dll's.<br />
<br />
It can be enabled using the following steps:<br />
<br />
# Find the process name (for this example, assume it is test.exe)<br />
# In a command prompt, enter: gflags -i test.exe +sls<br />
# Run the application that has a problem (test.exe)<br />
# Compress the debug log, and attach it to the jira issue<br />
<br />
<br />
== How to read/debug BugCheck messages ==<br />
* BugCheckCode parameter hex values are defined in:<br />
\include\reactos\mc\bugcodes.mc<br />
or, generated .h-version for i386: \obj-i386\include\reactos\bugcodes.h<br />
<br />
* Some messages have useful instructions<br />
<br />
[[Category:Testing]]<br />
[[Category:Tutorial]]<br />
<br />
== Log api calls to a specific ReactOS dll ==<br />
ReactOS has a (compile-time enabled) api logging mechanism built in.<br />
When enabling this for a specific dll, all calls to this dll (and the results) are logged.<br />
<br />
To enable this, open the <code>'''CMakeLists.txt'''</code> for the dll you want to add the logging to, and find the line with <code>'''spec2def'''</code>, and add <code>'''WITH_RELAY'''</code>.<br />
<br />
Recompile, and when your dll is called, the output will be in the <code>debugchannel '''relay'''</code> (see [[#Turning on verbosity at runtime]]).<br />
<br />
===Example===<br />
This line:<br />
spec2def(apphelp.dll apphelp.spec ADD_IMPORTLIB)<br />
Should be edited to:<br />
spec2def(apphelp.dll apphelp.spec ADD_IMPORTLIB WITH_RELAY)<br />
<br />
<br />
===Example output===<br />
<nowiki>apphelp.dll: SdbOpenDatabase('E:\sdb\game.sdb',0x0)<br />
apphelp.dll: SdbOpenDatabase: retval = 0x390770<br />
apphelp.dll: SdbFindFirstTag(0x00390770,0x0,0x7001)<br />
apphelp.dll: SdbFindFirstTag: retval = 0x108<br />
apphelp.dll: SdbFindFirstTag(0x00390770,0x108,0x6001)<br />
apphelp.dll: SdbFindFirstTag: retval = 0x11e<br />
apphelp.dll: SdbGetStringTagPtr(0x00390770,0x11e)<br />
apphelp.dll: SdbGetStringTagPtr: retval = 0x3909a8<br />
apphelp.dll: SdbFindFirstTag(0x00390770,0x108,0x7007)<br />
apphelp.dll: SdbFindFirstTag: retval = 0x146<br />
apphelp.dll: SdbFindFirstTag(0x00390770,0x146,0x6001)<br />
apphelp.dll: SdbFindFirstTag: retval = 0x14c<br />
apphelp.dll: SdbGetStringTagPtr(0x00390770,0x14c)<br />
apphelp.dll: SdbGetStringTagPtr: retval = 0x3909e6<br />
</nowiki></div>Learn morehttps://reactos.org/wiki/index.php?title=Building_ReactOS&diff=51090Building ReactOS2020-09-12T18:44:13Z<p>Learn more: /* Windows or ReactOS */</p>
<hr />
<div><!-- '''NOTE: This page is deprecated and is purely here for archival purposes. For instructions on building ReactOS, please see the [http://www.reactos.org/development/build-environment build environment] page of the development guide.''' --><br />
This page describes the steps necessary to build ReactOS.<br />
<br />
== Getting all you need ==<br />
=== Setting up a Build Environment ===<br />
For building ReactOS you also need the official [[ReactOS Build Environment]]. Please download and install it from that page.<br />
<br />
Make sure that no interfering build environment (such as MSYS) is in your PATH environment variable when building.<br />
<br />
<!-- {{Notice|Due to a current bug, the build environment can not use a build folder that contains spaces in its path name.<br /><br />
Under Windows XP and 2003 you must change the default location of "C:\Documents and Settings\[username]\reactos\".}} --><br />
=== Optional: Set Up Visual Studio ===<br />
If you want to use Visual Studio to compile ReactOS, you need to get one of the supported version, which is VS2015 and later. You can download the free Community Edition of Visual Studio 2015 (or later). To compile with VS, open the appropriate VS command prompt and follow the same instructions as for building with the GCC based ReactOS build environment. Note that you still need the ReactOS build environment, which contains CMake and some additional tools, or you can install the latest version of CMake yourself, but that is not recommended. If you experience problems with the configure stage, e.g. the compiler is reported to not be working, please check if you have installed any additional Windows SDKs or WDK and try again after removing them.<br />
<br />
=== Getting a Working Copy ===<br />
The first step in building ReactOS is getting a copy of the source code.<br />
<br />
You can use the exported release source code, but since you are reading this, you are probably interested in keeping up to date with the latest changes, so you will want a "working copy" of ReactOS.<br />
To get a working copy of ReactOS, please read the [[ReactOS_Git_For_Dummies|ReactOS Git For Dummies]] page.<br />
<br />
You need to have [https://git-scm.com/ Git] installed on your system. The command<br />
git clone https://github.com/reactos/reactos.git <br />
from within the command prompt will download it.<br />
<br />
== Prerequisites ==<br />
For building ReactOS you will need at least 2 GB of RAM, preferably 4 GB.<br />
If you are [[Building ReactOS on a cloud node instance|building on a cloud server instance]] having less than 2 GB of RAM, you might find that your SSH connection to the cloud node is forcibly closed during the "./configure" step. This is usually caused by running out-of-memory during the CMake configure step.<br />
<br />
{{Notice|It is recommended to temporarily disable your antivirus before proceeding, because some of them detect some of ReactOS' system files (in particular, crtdll.dll) as being infected.}}<br />
<br />
Before building either the tools or ReactOS itself the output location must be created and prepared. This is an easy step and involves only one command. This command is located in the root of recent revisions of the source code and can be run either from the root directory itself or any other directory you want the build your sources in. Please make sure you are running it from '''within ReactOS BE''':<br />
<br />
=== Linux/Unix ===<br />
First, open the ReactOS Build Environment by executing:<br />
<syntaxhighlight lang="bash"><br />
/usr/RosBE/RosBE.sh /path/to/reactos/repo<br />
</syntaxhighlight><br />
<br />
Run:<br />
<syntaxhighlight lang="bash"><br />
configure.sh<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
<br />
=== Windows or ReactOS ===<br />
First, open the ReactOS Build Environment from the start menu.<br />
<br />
Enter the following commands in there:<br />
<syntaxhighlight lang="dos"><br />
configure.cmd<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
After executing, folder <tt>output-MinGW-i386</tt> will be created in root of ReactOS tree. You will be redirected to it.<br />
If you want to build in a different folder, cd to that folder first and then execute<br />
<syntaxhighlight lang="dos"><br />
<path_to_source>\configure.cmd<br />
</syntaxhighlight><br />
<br />
configure.cmd currently supports the following options:<br />
* <code>/?</code> displays help<br />
* <code>Codeblocks</code> creates a CodeBlocks solution<br />
* <code>Eclipse</code> creates an Eclipse solution<br />
* <code>Makefiles</code> creates (n)make files<br />
* <code>clang</code> Uses clang instead of gcc<br />
* <code>VSSolution</code> Creates a Visual Studio solution<br />
<br />
You can additionally specify any number of cmake command line options, like "-DSYMBOL=VALUE".<br />
<br />
=== Building ReactOS on Windows or ReactOS* ===<br />
From the build folder (e.g. reactos\output-MinGW-i386) enter the following command:<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
<small>* Perhaps, some functions of RosBE may not work on ReactOS. If so, please have a look on our [http://jira.reactos.org/ Jira] page whether this problem is already reported or not.</small><br />
<br />
=== Building ReactOS on Unix/Linux ===<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
Combining the above steps together:<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
== Commands ==<br />
<br />
After you have started a Build Environment Command Prompt, there are certain commands available.<br />
<br />
=== Invoking a build ===<br />
<br />
<code>'''ninja'''</code> or <code>'''ninja all'''</code><br />
<br />
This command builds all binaries of ReactOS. They will be placed in the created output directory created by the configure command. (default: ''output-MinGW-i386/reactos'')<br />
All source files, which did not change since the last build, will not be built again.<br />
<br />
<code>'''ninja bootcd'''</code><br />
<br />
This command works like ''make'', but also generates a bootable ReactOS ISO file (''bootcd.iso'') placed into the output directory.<br />
It is wise to tag your Boot-CDs with the revision they were built from if you need to keep many ReactOS ISOs.<br />
<br />
<code>'''ninja livecd'''</code><br />
<br />
This command generates ''livecd.iso'' in the output directory. This is the ReactOS Live-CD that runs completely from the CD-ROM.<br />
<br />
<code>'''ninja hybridcd'''</code><br />
<br />
This command generates ''hybridcd.iso'' in the output directotry. This is a hybrid cd of ReactOS<br />
<br />
<!--<br />
=== Other ===<br />
<br />
'''clean'''<br />
This command cleans all files of your working copy except the generated ISO files (if any). The next build you make will be completely clean then. Any parameters will recognized as module name and only this module will be cleaned then. --><br />
<!-- to be continued --><br />
<br />
== Adding modules to the build process ==<br />
<br />
There are several modules you can add to the build process. For example ''rosapps'' contains some additional applications not included by default.<br />
<br />
The page [[Building Modules]] describes, which modules exist and how to add them to the build process.<br />
<br />
== See also ==<br />
* [[Building with MSVC]]<br />
* [[Building MINGW-w64]]<br />
* [http://www.reactos.org/forum/viewtopic.php?f=22&t=11000 Building with Ninja] latest build method, RosBE v2.1<br />
<br />
[[Category:Building]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Building_ReactOS&diff=51089Building ReactOS2020-09-12T18:43:47Z<p>Learn more: /* Prerequisites */</p>
<hr />
<div><!-- '''NOTE: This page is deprecated and is purely here for archival purposes. For instructions on building ReactOS, please see the [http://www.reactos.org/development/build-environment build environment] page of the development guide.''' --><br />
This page describes the steps necessary to build ReactOS.<br />
<br />
== Getting all you need ==<br />
=== Setting up a Build Environment ===<br />
For building ReactOS you also need the official [[ReactOS Build Environment]]. Please download and install it from that page.<br />
<br />
Make sure that no interfering build environment (such as MSYS) is in your PATH environment variable when building.<br />
<br />
<!-- {{Notice|Due to a current bug, the build environment can not use a build folder that contains spaces in its path name.<br /><br />
Under Windows XP and 2003 you must change the default location of "C:\Documents and Settings\[username]\reactos\".}} --><br />
=== Optional: Set Up Visual Studio ===<br />
If you want to use Visual Studio to compile ReactOS, you need to get one of the supported version, which is VS2015 and later. You can download the free Community Edition of Visual Studio 2015 (or later). To compile with VS, open the appropriate VS command prompt and follow the same instructions as for building with the GCC based ReactOS build environment. Note that you still need the ReactOS build environment, which contains CMake and some additional tools, or you can install the latest version of CMake yourself, but that is not recommended. If you experience problems with the configure stage, e.g. the compiler is reported to not be working, please check if you have installed any additional Windows SDKs or WDK and try again after removing them.<br />
<br />
=== Getting a Working Copy ===<br />
The first step in building ReactOS is getting a copy of the source code.<br />
<br />
You can use the exported release source code, but since you are reading this, you are probably interested in keeping up to date with the latest changes, so you will want a "working copy" of ReactOS.<br />
To get a working copy of ReactOS, please read the [[ReactOS_Git_For_Dummies|ReactOS Git For Dummies]] page.<br />
<br />
You need to have [https://git-scm.com/ Git] installed on your system. The command<br />
git clone https://github.com/reactos/reactos.git <br />
from within the command prompt will download it.<br />
<br />
== Prerequisites ==<br />
For building ReactOS you will need at least 2 GB of RAM, preferably 4 GB.<br />
If you are [[Building ReactOS on a cloud node instance|building on a cloud server instance]] having less than 2 GB of RAM, you might find that your SSH connection to the cloud node is forcibly closed during the "./configure" step. This is usually caused by running out-of-memory during the CMake configure step.<br />
<br />
{{Notice|It is recommended to temporarily disable your antivirus before proceeding, because some of them detect some of ReactOS' system files (in particular, crtdll.dll) as being infected.}}<br />
<br />
Before building either the tools or ReactOS itself the output location must be created and prepared. This is an easy step and involves only one command. This command is located in the root of recent revisions of the source code and can be run either from the root directory itself or any other directory you want the build your sources in. Please make sure you are running it from '''within ReactOS BE''':<br />
<br />
=== Linux/Unix ===<br />
First, open the ReactOS Build Environment by executing:<br />
<syntaxhighlight lang="bash"><br />
/usr/RosBE/RosBE.sh /path/to/reactos/repo<br />
</syntaxhighlight><br />
<br />
Run:<br />
<syntaxhighlight lang="bash"><br />
configure.sh<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
<br />
=== Windows or ReactOS ===<br />
First, open the ReactOS Build Environment from the start menu.<br />
Enter the following commands in there:<br />
Run:<br />
<syntaxhighlight lang="dos"><br />
configure.cmd<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
After executing, folder <tt>output-MinGW-i386</tt> will be created in root of ReactOS tree. You will be redirected to it.<br />
If you want to build in a different folder, cd to that folder first and then execute<br />
<syntaxhighlight lang="dos"><br />
<path_to_source>\configure.cmd<br />
</syntaxhighlight><br />
<br />
configure.cmd currently supports the following options:<br />
* <code>/?</code> displays help<br />
* <code>Codeblocks</code> creates a CodeBlocks solution<br />
* <code>Eclipse</code> creates an Eclipse solution<br />
* <code>Makefiles</code> creates (n)make files<br />
* <code>clang</code> Uses clang instead of gcc<br />
* <code>VSSolution</code> Creates a Visual Studio solution<br />
<br />
You can additionally specify any number of cmake command line options, like "-DSYMBOL=VALUE".<br />
<br />
=== Building ReactOS on Windows or ReactOS* ===<br />
From the build folder (e.g. reactos\output-MinGW-i386) enter the following command:<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
<small>* Perhaps, some functions of RosBE may not work on ReactOS. If so, please have a look on our [http://jira.reactos.org/ Jira] page whether this problem is already reported or not.</small><br />
<br />
=== Building ReactOS on Unix/Linux ===<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
Combining the above steps together:<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
== Commands ==<br />
<br />
After you have started a Build Environment Command Prompt, there are certain commands available.<br />
<br />
=== Invoking a build ===<br />
<br />
<code>'''ninja'''</code> or <code>'''ninja all'''</code><br />
<br />
This command builds all binaries of ReactOS. They will be placed in the created output directory created by the configure command. (default: ''output-MinGW-i386/reactos'')<br />
All source files, which did not change since the last build, will not be built again.<br />
<br />
<code>'''ninja bootcd'''</code><br />
<br />
This command works like ''make'', but also generates a bootable ReactOS ISO file (''bootcd.iso'') placed into the output directory.<br />
It is wise to tag your Boot-CDs with the revision they were built from if you need to keep many ReactOS ISOs.<br />
<br />
<code>'''ninja livecd'''</code><br />
<br />
This command generates ''livecd.iso'' in the output directory. This is the ReactOS Live-CD that runs completely from the CD-ROM.<br />
<br />
<code>'''ninja hybridcd'''</code><br />
<br />
This command generates ''hybridcd.iso'' in the output directotry. This is a hybrid cd of ReactOS<br />
<br />
<!--<br />
=== Other ===<br />
<br />
'''clean'''<br />
This command cleans all files of your working copy except the generated ISO files (if any). The next build you make will be completely clean then. Any parameters will recognized as module name and only this module will be cleaned then. --><br />
<!-- to be continued --><br />
<br />
== Adding modules to the build process ==<br />
<br />
There are several modules you can add to the build process. For example ''rosapps'' contains some additional applications not included by default.<br />
<br />
The page [[Building Modules]] describes, which modules exist and how to add them to the build process.<br />
<br />
== See also ==<br />
* [[Building with MSVC]]<br />
* [[Building MINGW-w64]]<br />
* [http://www.reactos.org/forum/viewtopic.php?f=22&t=11000 Building with Ninja] latest build method, RosBE v2.1<br />
<br />
[[Category:Building]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51071RAPPS2020-09-05T10:50:24Z<p>Learn more: /* Icon & Screenshot Support */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small GUI program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
After a description file is created, it has to be submitted to [https://jira.reactos.org JIRA].<br />
* For the category, choose 'Core ReactOS'<br />
* Name it something along the lines of: 'Add xxx to Rapps'.<br />
* To make the inclusion process faster, include some screenshots of your application running on ReactOS.<br />
<br />
'''NEW! :''' You can now clone the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is a description file that corresponds to the DosBox program:<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = DOSBox<br />
Version = 0.74-2<br />
License = GPL<br />
Description = An open-source DOS emulator.<br />
Category = 16<br />
URLSite = http://www.dosbox.com/<br />
URLDownload = http://download.sourceforge.net/project/dosbox/dosbox/0.74-2/DOSBox0.74-2-win32-installer.exe<br />
SHA1 = 06f23be4ceba35c8c547a98f1b327da20082b483<br />
SizeBytes = 1453151<br />
<br />
[Section.0407]<br />
Description = DOSBox ist ein DOS Emulator.<br />
<br />
[Section.040a]<br />
Description = DOSBox es un emulador de DOS.<br />
<br />
[Section.040c]<br />
Description = DOSBox est un émulateur DOS.<br />
<br />
[Section.0415]<br />
Description = DOSBox – emulator DOSa.<br />
<br />
[Section.0422]<br />
Description = DOSBox - емулятор DOSу.<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
=== Name ===<br />
This is the program name that is displayed in the list, and in the lower grey description field.<br />
=== Version ===<br />
This is the version of the program, also displayed in the list and in the lower field.<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source.<br />
=== Description ===<br />
The description of the program For example : "A program that emulates older hardware to run older games".<br />
<br />
Size of the program. Template: NUMBERUNIT For example "223 MB".<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
<br />
== [Section.0407] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
There are two keys now:<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7-Zip AkelPad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7-Zip<br />
Install=AkelPad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as in the <code>Name</code> field in the database textfiles.<br />
<br />
== Icon and Screenshot Support ==<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section'.<br />
The icon itself should be placed in the `icons` folder.<br />
<br />
There is also support for a screenshot, which should be uploaded to an image host.<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Icon=codeblocks.ico<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight><br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51070RAPPS2020-09-05T10:49:45Z<p>Learn more: /* Icon Support */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small GUI program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
After a description file is created, it has to be submitted to [https://jira.reactos.org JIRA].<br />
* For the category, choose 'Core ReactOS'<br />
* Name it something along the lines of: 'Add xxx to Rapps'.<br />
* To make the inclusion process faster, include some screenshots of your application running on ReactOS.<br />
<br />
'''NEW! :''' You can now clone the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is a description file that corresponds to the DosBox program:<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = DOSBox<br />
Version = 0.74-2<br />
License = GPL<br />
Description = An open-source DOS emulator.<br />
Category = 16<br />
URLSite = http://www.dosbox.com/<br />
URLDownload = http://download.sourceforge.net/project/dosbox/dosbox/0.74-2/DOSBox0.74-2-win32-installer.exe<br />
SHA1 = 06f23be4ceba35c8c547a98f1b327da20082b483<br />
SizeBytes = 1453151<br />
<br />
[Section.0407]<br />
Description = DOSBox ist ein DOS Emulator.<br />
<br />
[Section.040a]<br />
Description = DOSBox es un emulador de DOS.<br />
<br />
[Section.040c]<br />
Description = DOSBox est un émulateur DOS.<br />
<br />
[Section.0415]<br />
Description = DOSBox – emulator DOSa.<br />
<br />
[Section.0422]<br />
Description = DOSBox - емулятор DOSу.<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
=== Name ===<br />
This is the program name that is displayed in the list, and in the lower grey description field.<br />
=== Version ===<br />
This is the version of the program, also displayed in the list and in the lower field.<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source.<br />
=== Description ===<br />
The description of the program For example : "A program that emulates older hardware to run older games".<br />
<br />
Size of the program. Template: NUMBERUNIT For example "223 MB".<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
<br />
== [Section.0407] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
There are two keys now:<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7-Zip AkelPad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7-Zip<br />
Install=AkelPad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as in the <code>Name</code> field in the database textfiles.<br />
<br />
== Icon & Screenshot Support ==<br />
RAPPS supports 'per app' icons, that will be shown instead of the generic 'application' icon.<br />
The icon can be specified with the field name 'Icon', which should be placed in the main 'Section'.<br />
The icon itself should be placed in the `icons` folder.<br />
<br />
There is also support for a screenshot, which should be uploaded to an image host.<br />
This screenshot can be specified with the field 'Screenshot1'.<br />
<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = Code::Blocks (without compiler)<br />
URLDownload = https://download.sourceforge.net/project/codeblocks/Binaries/17.12/Windows/codeblocks-17.12-setup.exe<br />
SHA1 = 05ad095b5e04de243df736c060aea25a554dad94<br />
SizeBytes = 37372176<br />
Icon=codeblocks.ico<br />
Screenshot1=https://i.imgur.com/FykFrzz.png<br />
</syntaxhighlight<br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51069RAPPS2020-09-05T10:46:10Z<p>Learn more: /* Icon Support */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small GUI program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
After a description file is created, it has to be submitted to [https://jira.reactos.org JIRA].<br />
* For the category, choose 'Core ReactOS'<br />
* Name it something along the lines of: 'Add xxx to Rapps'.<br />
* To make the inclusion process faster, include some screenshots of your application running on ReactOS.<br />
<br />
'''NEW! :''' You can now clone the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is a description file that corresponds to the DosBox program:<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = DOSBox<br />
Version = 0.74-2<br />
License = GPL<br />
Description = An open-source DOS emulator.<br />
Category = 16<br />
URLSite = http://www.dosbox.com/<br />
URLDownload = http://download.sourceforge.net/project/dosbox/dosbox/0.74-2/DOSBox0.74-2-win32-installer.exe<br />
SHA1 = 06f23be4ceba35c8c547a98f1b327da20082b483<br />
SizeBytes = 1453151<br />
<br />
[Section.0407]<br />
Description = DOSBox ist ein DOS Emulator.<br />
<br />
[Section.040a]<br />
Description = DOSBox es un emulador de DOS.<br />
<br />
[Section.040c]<br />
Description = DOSBox est un émulateur DOS.<br />
<br />
[Section.0415]<br />
Description = DOSBox – emulator DOSa.<br />
<br />
[Section.0422]<br />
Description = DOSBox - емулятор DOSу.<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
=== Name ===<br />
This is the program name that is displayed in the list, and in the lower grey description field.<br />
=== Version ===<br />
This is the version of the program, also displayed in the list and in the lower field.<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source.<br />
=== Description ===<br />
The description of the program For example : "A program that emulates older hardware to run older games".<br />
<br />
Size of the program. Template: NUMBERUNIT For example "223 MB".<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
<br />
== [Section.0407] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
There are two keys now:<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7-Zip AkelPad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7-Zip<br />
Install=AkelPad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as in the <code>Name</code> field in the database textfiles.<br />
<br />
== Icon Support ==<br />
RAPPS supports 'per app' icons, that can be loaded from <code>AppData/rapps/rapps/icons</code> folder (that's where the database entries are).<br />
<br />
The icon can be specified with the field name 'Icon':<br />
<pre><br />
Icon=codeblocks.ico<br />
</pre><br />
<br />
The icon itself should be placed in the `icons` folder.<br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=51068RAPPS2020-09-04T22:20:30Z<p>Learn more: /* New [Section] Fields */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small GUI program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
After a description file is created, it has to be submitted to [https://jira.reactos.org JIRA].<br />
* For the category, choose 'Core ReactOS'<br />
* Name it something along the lines of: 'Add xxx to Rapps'.<br />
* To make the inclusion process faster, include some screenshots of your application running on ReactOS.<br />
<br />
'''NEW! :''' You can now clone the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is a description file that corresponds to the DosBox program:<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = DOSBox<br />
Version = 0.74-2<br />
License = GPL<br />
Description = An open-source DOS emulator.<br />
Category = 16<br />
URLSite = http://www.dosbox.com/<br />
URLDownload = http://download.sourceforge.net/project/dosbox/dosbox/0.74-2/DOSBox0.74-2-win32-installer.exe<br />
SHA1 = 06f23be4ceba35c8c547a98f1b327da20082b483<br />
SizeBytes = 1453151<br />
<br />
[Section.0407]<br />
Description = DOSBox ist ein DOS Emulator.<br />
<br />
[Section.040a]<br />
Description = DOSBox es un emulador de DOS.<br />
<br />
[Section.040c]<br />
Description = DOSBox est un émulateur DOS.<br />
<br />
[Section.0415]<br />
Description = DOSBox – emulator DOSa.<br />
<br />
[Section.0422]<br />
Description = DOSBox - емулятор DOSу.<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
=== Name ===<br />
This is the program name that is displayed in the list, and in the lower grey description field.<br />
=== Version ===<br />
This is the version of the program, also displayed in the list and in the lower field.<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source.<br />
=== Description ===<br />
The description of the program For example : "A program that emulates older hardware to run older games".<br />
<br />
Size of the program. Template: NUMBERUNIT For example "223 MB".<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
<br />
== [Section.0407] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
There are two keys now:<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7-Zip AkelPad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7-Zip<br />
Install=AkelPad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as in the <code>Name</code> field in the database textfiles.<br />
<br />
== Icon Support ==<br />
RAPPS supports 'per app' icons, that can be loaded from <code>AppData/rapps/rapps/icons</code> folder (that's where the database entries are).<br />
<br />
The filename should match the <code>Name</code> field in the database plus the extension. Only .ICO format icons are supported.<br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial".<br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Programming_Guidelines&diff=50803Programming Guidelines2020-06-16T16:17:33Z<p>Learn more: /* Remember Unicode/non-Unicode */</p>
<hr />
<div>{{Outdated|reason=The style currently used and encouraged by most project members is in direct contrast to some of these guidelines, so please take them with a grain of salt and double-check.}}<br />
<br />
Here are some hints to write good code, originally collected in the context of the ReactOS project.<br />
<br />
For advice on writing secure code please see [[Secure Programming]].<br />
<br />
== It's more important to be correct than to be fast ==<br />
''Premature optimization is the root of all evil.''<br />
<br />
With respect to writing time and memory efficient programs, I would put forward that one should not concern themselves with execution speed while building code. Such concerns will be mostly a waste of time. Build the program to be robust and easily maintainable, then if it exhibits performance that is not acceptable, profile it and improve only those sections that most need to be optimized. -RexJolliff<br />
<br />
== Small and smart solutions to solve a problem aren't a shame ==<br />
<br />
Make your code small and smart while preserving its readability and understandability. Follow the guide line "less code – less bugs – more readable – easier to review". Think twice about your solution. Don't misunderstand this rule as optimization rule; maybe it affects the speed and size of the resulting application/driver/library, but that is not the (primary) intended reason. If the smart solution needs more changes, try to adapt as much as possible to make it smarter and more readable. Your credit is not derived from the count of lines you wrote.<br />
<br />
== Write thread-safe code ==<br />
Especially be aware of this if you write a library; your library may be used by an MT-application. This applies anyway to the kernel, since the kernel is a library which has to be thread-safe per se.<br />
<br />
What differentiates thread-safe code from thread unsafe code is the use of global variables. Thread-safe code avoids nearly all global variables. This includes also local static variables and class variables. One has to decide carefully whether a variable or data structure is local, thread-global or process-global. Try to eliminate global variables. If this isn't possible and you need a thread-global variable then thread-local storage (TLS) is the right thing. If you need a process global variable, then the right thing is a classic global variable. However, don't forget to declare it with the volatile modifier. If you don't declare it as volatile, it may happen that two threads hold a copy of the variable in their contexts. So data consistency may not be guaranteed.<br />
<br />
Global data structures are a little more difficult. A thread-global structure like a list is no problem since only the owning thread knows about it. However, a process-global structure which gets accessed by multiple threads needs more care. You have to synchronize the accesses of the threads with so-called synchronization objects the kernel provides. These help your threads to guarantee a mutual exclusive access to common used data structures. The Mutex is commonly used for this purpose. One Mutex per list is mostly okay. However, if such a structure gets accessed very hard, one should consider using more than one Mutex. One per element is a waste of resources. So using Mutexes for several ranges would be a good compromise.<br />
<br />
The same applies to kernel-mode. It's just harder to do and one uses spinlocks to even synchronize threads over multiple processors.<br />
<syntaxhighlight lang="c"><br />
volatile int really_global_i;<br />
DWORD tlsi = TlsAlloc();<br />
TlsSetValue( tlsi, 95 );<br />
</syntaxhighlight><br />
Short:<br />
* Avoid global variables.<br />
* Use TLS for thread-global variables.<br />
* Find the right synchronization granularity for global structures.<br />
* Write multiprocessor-aware code.<br />
<br />
== Use multithreading where possible and useful but judicious ==<br />
Multithreading is not the holy grail. However, there exist multiple examples out in the world where MT would have been appropriate. Win32-GUI apps usually have one GUI-thread and a bunch of workingthreads. It's also possible to have many GUI-threads but this gets complex very fast; if you don't take precautions it is not allowed to touch the GUI from more than one thread.<br />
<br />
It's not that simple to write MT-GUI-apps. However some things are just intuitively threadable, so have a try.<br />
<br />
Another thing are server applications. It's just a have to for server apps to be multi-threaded. Fortunately, it is no big problem to make a server use multiple threads. However using too many threads is not good, either, a better strategy is to have a pool of sleeping server threads. If a request arrives, it is queued and dispatched to one of the threads. Win32 provides for this purpose the so-called I/O-Completion ports. Using this mechanism, all this dispatch and queue work is a minor matter for you.<br />
<br />
Using multiple threads which execute the same code in parallel leads us to another problem. If such a program is run on an SMP or an SMT capable system, a so-called cache-aliasing happens. Processor caches are organized in so-called cache lines, each of which consists of 32, 64 or more bytes. These lines are circular mapped to memory addresses. The result is that addresses that map to the same cache line, repeat all 8&nbsp;MB or so.<br />
<br />
On SMT systems this means that two threads with the same memory access pattern hinder each other. Same memory access pattern happens if the same code was started nearly at the same time and the memory places are 8&nbsp;MB off.<br />
<br />
On SMT systems this means that if a thread reads a byte, the processor loads the whole cache line. The same happens on the other virtual processor but some MB off (which maps to the same cache-line). Next time the first processor accesses its address again.<br />
Now, these two processors have to sync their caches with each other. This happens again and again. The result is that such a program runs faster on a uniprocessor system :-( This gets even worse on SMT-systems, because the two virtual processors share the same cache.<br />
This means also SMT and Cache-aliasing.<br />
<br />
== Try to open files shared (esp. SHAREMODE_DELETE) ==<br />
== Make programs support multiple instances ==<br />
== Avoid data corruption on crashes ==<br />
It's not a nice thing if your application (or the system) crashes, and the user is left with corrupted files.<br />
<br />
For the system, the bugcheck functions make sure the system stops, hopefully before damage is done. Use sanity checks to make sure you catch corruptions. For generic applications, it's nice to keep backup files so you have something to go back to in case of problems.<br />
<br />
== Write preemptive code ==<br />
== Use spinlocks rarely but where needed ==<br />
== Raise IRQL as short as possible – think of writing an DPC ==<br />
<br />
== Remember Unicode/non-Unicode ==<br />
<br />
Prefer UNICODE over ANSI functions.<br />
Use WCHAR and the Winapi functions with the 'W' suffix.<br />
Prefix strings with an `L` like so: <code>LPCWSTR String = L"Your text here";</code><br />
To calculate length in characters use _countof, ARRAYSIZE, or RTL_NUMBER_OF.<br />
<br />
== Don't hardcode English phrases into source code – if you must, collect them in one place (easier to localize) ==<br />
<br />
1 – An approach is to first write hardcoded phrases like we all usually use to do:<br />
:this should be the first step when dealing with badly written code.<br />
:let's forget unicode/nounicode now<br />
<syntaxhighlight lang="c"><br />
printf("my hardcoded string");<br />
</syntaxhighlight><br />
<br />
2 – Then make them macros like this:<br />
<syntaxhighlight lang="c"><br />
#define HARDSTRING "my hardcoded string"<br />
printf(HARDSTRING);<br />
</syntaxhighlight><br />
<br />
3 – and finally:<br />
<syntaxhighlight lang="c"><br />
char* AllStrings[NUMSTRINGS];<br />
#define HARDSTRING AllStrings[1]<br />
<br />
printf(HARDSTRING); // <--- not touched anymore<br />
</syntaxhighlight><br />
<br />
You could skip directly to step 2 when developing to save yourself some time by not having to search for strings in your code later.<br />
<br />
== Don't create a thread per connected user, use I/O Completion Ports instead ==<br />
<br />
Having one thread to serve all users is a bad idea. It forces users to wait an undefined time rather than being served slower. A solution is to create one thread for every user. However, this is a bad idea, too. It's OK if you serve a determinable maximum of queries. But if you can't determine how many queries will arrive, you better use the comfortable I/O Completion Ports. The thing with creating one and another server thread is: Mostly your thread does I/O operations (HD access). Invoking too many threads doesn't hurt the OS but your I/O subsystem. You get something like thrashing. The single thread's I/Os hinder each other to be finished and the whole thing gets slower and capacity melts.<br />
<br />
So restricting to a number of server threads is the best idea. One could program such a behavior by hand or use the I/O completion ports.<br />
Example:<br />
<br />
I/O completion ports are a great multithreaded model made to be fast and efficient. Put it this way. You create the threads once and they just wait there until they are required to do some job. They will eat 0 CPU time when waiting and will only wake up when needed. On the other side, it gets the benefit of multithreaded code that won't cause delays when some operation blocks and then you could serve all those threads using only one thread for CPU. That means it won't be slower than having only one thread, even more, your code probably behaves faster in SMP systems. They are of course harder to use than single threaded code or to create threads for each action or to have a pool of threads that wake from time to time checking for a job but actually, the increase in complexity pays off.<br />
<br />
== Think of changing writing directions ==<br />
Left to right reading order is not the only direction to read and write text throughout the world. There also exists a right to left reading order as in Hebrew and a top to down reading order as in Japanese. Whereas one legal reading order in Japanese is also left to right. So you can restrict yourself to these two orders. Having different reading orders means you may encounter many formatting styles, so please be mindful of this. <help me><br />
<br />
== Create a GUI with layoutmanager rather than pixel positioning of controls ==<br />
If you use pixel positioning of controls, your GUI will no longer look right if the texts change due to localization, if the user selects a font you didn't expect (like large fonts for the visually impaired) and if the writing direction changes. Also probably your dialogs will not be resizable.<br />
<br />
== Write time and memory efficient programs ==<br />
This conflicts with the earlier statement about optimizations. Keep in mind that that statement does not mean you should waste memory or cycles though.<br />
<br />
Memory sizes get always bigger and processors get always faster. But programs continually become less efficient. OK, enough. This seems to be just advice because everyone has to decide and design their own application themselves. At least consider these hints: Keep in mind that you can use memory-mapped files. This gives you easier access to your file data and you do not have to rebuild the whole data world in memory. This is a thing you should always avoid: like some bad games, occupy one gig on HD and if started, the same amount in swap space. If you work object-oriented, use references for object parameters. This avoids a copy constructor to be called twice. One time for the temporal object, one time for the higher-level variable. Avoid copying of redundant data through an object hierarchy. This means, do not pass a set of variables to the next deeper object and so on but use an intelligent design with pointers.<br />
<br />
== Avoid memory leaks ==<br />
Easier said than done. Memory leaks are always an offense. There's nothing one can really do to never have a memory leak. However, take these hints. You can use a language which has a garbage collector, like Eiffel. In C, your only option is to be more careful and always write pairs of malloc and free or use reference counting. If you use C++ there exist the techniques of auto pointers and smart pointers. For how to use them, see the corresponding literature.<br />
<br />
-- There are [http://www.hpl.hp.com/personal/Hans_Boehm/gc/ garbage collectors for C and C++] – Jakov<br />
<br />
== Put plenty of comments into your code ==<br />
* Think of block comments which explain a whole module and the play tog.<br />
<br />
== Find the right balance between abstraction and straight forward ==<br />
Abstraction is a useful programming concept. It's easy to overdo it though.<br />
<br />
== Don't make redundant copies of program data ==<br />
If you copy a piece of code you will have to maintain the code twice. Typically people working on your code will only work on one of the copies, so you have to make sure they keep in sync.<br />
<br />
* to be continued.......<br />
<br />
== If using assembler, always implement an alternative way in C or what you use ==<br />
ReactOS is or will be a multi-platform OS. Having nice fast assembler pieces for time-critical operations is good. However, there has to be an alternative written in C, always. Only this guarantee enables ROS to compile on all of its target platforms. At last one hint: The first goal is always to make a piece of code running. If we find this piece to be a bottleneck, we'll optimize it and possibly write it in assembler.<br />
<br />
== Preserve the meta information of files you use ==<br />
On ReactOS file systems, files may have lots of additional information. This includes timestamps, attributes, access control lists, multiple file streams, and extended attributes. Not every file system provides every feature. But if it does, it is annoying for a user who works with these pieces of information, if a program destroys the meta-information. At most this happens when copying or packing files or when saving a file. These programs just create a new file and store the content from the old one to the new. Afterwards, they delete the old and rename the new one. Generally, the optimal way would be to memory map the original and use its mapped data to directly for r/o access. If changes are required, because the user works with the program, a self-made copy-on-write mechanism goes on and makes a working copy. If the user wants to save his changes, the changed structures are written back through the memory mapping.<br />
<br />
If this is not an alternative for you, remember to use the parameter hTemplateFile of the CreateFile call.<br />
<br />
== Do not use absolute paths; don't imply path names ==<br />
Ever used one of these programs that can only be installed on the C drive? Obvious but quite annoying, isn't it?<br />
<br />
As you know, drive letters (what a pain) vary from system to system. So including drive letters in paths is bad. Rather use relative paths or local paths. Also, paths are no axioms on windows systems. The „Program Files“-directory, for example, changes it's spelling from localization to localization. On Win32 there do exist the functions GetWindowsDirectory, GetSystemDirectory, SHGetPathFromIDList, SHGetSpecialFolderPath and SHGetFolderPath. With these functions, you can resolve the differences between the single installations and localizations.<br />
<br />
You can use environment variables too.<br />
<br />
== Avoid directly assigning allocated memory to a pointer ==<br />
Avoid things like this:<br />
<syntaxhighlight lang="c"><br />
char *ptr;<br />
ptr = malloc(size);<br />
</syntaxhighlight><br />
functions like malloc can return NULL anytime and unfortunately, it will happen when you least expect it. Remember that in kernel mode there are malloc equivalents that behave the same way and that means a BSOD.<br />
<br />
One suggestion is to call a function that always check for null before calling malloc like functions, that throws an exception back so you don't forget about the check. Of course, you have to remember now to write the exception handler but this way you cover large blocks and save yourself some code and make the compiler throw a lot less conditional jumps. That means you write less code, with more chances to be correct and also faster!<br />
<br />
== Beware with the C syntax ==<br />
One thing C syntax never needed is the possibility to write code like this:<br />
<syntaxhighlight lang="c"><br />
if (a = 5)<br />
{<br />
...<br />
}<br />
</syntaxhighlight><br />
What does that means! To a programmer used to C that is very simple but for beginners is really confusing.<br />
<br />
But the worst side effect is that probably you wanted to simply test if a was equal to 5 and is a common error to not write it the way you really wanted.<br />
<syntaxhighlight lang="c"><br />
if (a == 5)<br />
{<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
== Hungarian Notation Prefixes ==<br />
{{Main|Hungarian Notation}}<br />
<br />
Large projects with many folks working on them should have common ground. The Hungarian notation prefix naming convention provides marvelous consistency and self documentation.<br />
{| class="wikitable"<br />
|-<br />
! Type !! Prefix !! Example<br />
|-<br />
| int || n || nCount<br />
|-<br />
| float || f || fBaby<br />
|-<br />
| double || d || dRoot<br />
|-<br />
| char || c || cKey<br />
|-<br />
| string (null terminated) || sz || szInput[]<br />
|-<br />
| global || g_ || g_nScore<br />
|-<br />
| pointer || p (always first) || *pnArray<br />
|-<br />
| struct || S || SCast<br />
|-<br />
| long || l || lHours<br />
|-<br />
| unsigned || u || uAge<br />
|}<br />
<br />
== See also ==<br />
* [http://www.microsoft.com/resources/practices Microsoft patterns & practices]<br />
* [[Secure Programming]]<br />
* [[Coding Style]]<br />
* [[Documentation Guidelines]]<br />
<br />
__NOTOC__<br />
[[Category:Development]]<br />
[[Category:Documentation]]<br />
[[Category:Quality]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=50718Developing ReactOS with Visual Studio2020-05-28T13:39:24Z<p>Learn more: force a toc</p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
''This workflow is mainly for working on usermode applications.''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>cmake --version</pre><br />
#* The result should be: '''''<tt>cmake version 3.17.1-ReactOS</tt>'''''<br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]<br />
<br />
__FORCETOC__</div>Learn morehttps://reactos.org/wiki/index.php?title=RAPPS&diff=50684RAPPS2020-05-21T20:29:42Z<p>Learn more: /* File Schema */</p>
<hr />
<div>'''RAPPS''', previously known as '''Download!''', is a small GUI program that allows users to download multiple programs without hassle.<br />
<br />
It has its own application list that can be expanded by the user and the community. Applications that are included in the list by default are tested and most likely work on ReactOS.<br />
<br />
= How It Works =<br />
When you first start RAPPS, it will automatically connect to the internet, and it will seek for the file "rappmgr.cab". Then, it will extract the contents of this archive file to the same location where the main RAPPS executable is, creating a folder called "rapps".<br />
The contents of the archive are just '''UTF-8''' .txt files.<br />
<br />
Every single file that is on download list in RAPPS, has it's own "description" file.<br />
<br />
Custom files must be placed in <code>/rapps</code> folder created after .CAB file download.<br />
TXT file names should correspond to the software they are relative to.<br />
<br />
RAPPS also has experimental support for icons for application list. See [[#Experimental Features|Experimental Features]] for details.<br />
<br />
= Submitting New Applications =<br />
Some people may complain that his/her favourite application is not in the RAPPS list.<br />
The description files can be created by anyone. (See [[#File Schema|File Schema]] for a detailed breakdown).<br />
<br />
''Description files need to be saved in UTF-8 format, or some specific languages will be displayed strangely.''<br />
<br />
After a description file is created, it has to be submitted to [https://jira.reactos.org JIRA].<br />
* For the category, choose 'Core ReactOS'<br />
* Name it something along the lines of: 'Add xxx to Rapps'.<br />
* To make the inclusion process faster, include some screenshots of your application running on ReactOS.<br />
<br />
'''NEW! :''' You can now clone the https://github.com/reactos/rapps-db repository and send your submission as a [[Commiting Changes|Pull-Request]].<br />
<br />
= File Schema =<br />
Here is a description file that corresponds to the DosBox program:<br />
<syntaxhighlight lang="ini"><br />
[Section]<br />
Name = DOSBox<br />
Version = 0.74-2<br />
License = GPL<br />
Description = An open-source DOS emulator.<br />
Category = 15<br />
URLSite = http://www.dosbox.com/<br />
URLDownload = http://download.sourceforge.net/project/dosbox/dosbox/0.74-2/DOSBox0.74-2-win32-installer.exe<br />
SHA1 = 06f23be4ceba35c8c547a98f1b327da20082b483<br />
SizeBytes = 1453151<br />
<br />
[Section.0407]<br />
Description = DOSBox ist ein DOS Emulator.<br />
<br />
[Section.040a]<br />
Description = DOSBox es un emulador de DOS.<br />
<br />
[Section.040c]<br />
Description = DOSBox est un émulateur DOS.<br />
<br />
[Section.0415]<br />
Description = DOSBox – emulator DOSa.<br />
<br />
[Section.0422]<br />
Description = DOSBox - емулятор DOSу.<br />
</syntaxhighlight><br />
Let's analyze it from top to the bottom.<br />
== [Section] ==<br />
This is the beginning of the area that is read when the user clicks on the name of the program that he chooses to download. It consists of several things:<br />
=== Name ===<br />
This is the program name that is displayed in the list, and in the lower grey description field.<br />
=== Version ===<br />
This is the version of the program, also displayed in the list and in the lower field.<br />
=== License ===<br />
The license that the program is based on. Typical options are : Trial, Demo, Freeware, Open-Source.<br />
=== Description ===<br />
The description of the program For example : "A program that emulates older hardware to run older games".<br />
<br />
Size of the program. Template: NUMBERUNIT For example "223 MB".<br />
=== SizeBytes ===<br />
The actual size of the download in bytes. Used to display size value in the application info as well as while downloading.<br />
=== Category ===<br />
The category of the program. Category name corresponds to the number. There are 15 categories for now:<br />
*1 – Sound – Software for recording, playing, modify, convert sound<br />
*2 – Video – As above but applies to video and movies<br />
*3 – Graphics – As above, but graphics and images<br />
*4 – Games and Entertainment – There are games, emulators for games<br />
*5 – Internet and Networks – Browsers, IM clients, FTP software, Remote desktop...<br />
*6 – Office stuff – Software that is used in the Office, for example, Open Office<br />
*7 – Development/programming – programs used for compiling, and source writing, for example, Dev C++<br />
*8 – Education – Programs that help in teaching, learning. For example dictionaries, translators<br />
*9 – Engineering – Programs similar to CAD, SolidWorks (TM)<br />
*10 – Financial – Programs for financial stuff, TRade monitors, database systems for warehouses e.t.c<br />
*11 – Science – For programs that make simulations, helps in the Chemistry, Physics...<br />
*12 – Tools – Utilities for users, for example, archiving software<br />
*13 – Drivers – Files for the devices that are installed in the system<br />
*14 – Libraries – Files that are needed to run some programs like Visual Basic and .NET<br />
*15 – Themes - Themes for ReactOS or Windows (for example: watercolor, classic, luna, etc)<br />
*16 – Other – programs that did not fit in above categories<br />
<br />
=== URLSite ===<br />
Main web site where the program can be found.<br />
<br />
=== URLDownload ===<br />
Direct link to the installer/program.<br />
<br />
<br />
== [Section.0407] ==<br />
The specific language of the description, based on the host system language settings. <br />
<br />
When host language is different than languages in the file, English is chosen by default (If you talk Spanish, and there is no such entry available in the file, software description will be displayed in English).<br />
<br />
Locale IDs (that number in Section.xxxx) can be found [http://msdn.microsoft.com/en-us/goglobal/bb964664 here] (numbers from the left column).<br />
<br />
[http://www.reactos.org/forum/viewtopic.php?f=22&t=11015 Thanks to the author, wojo664]<br />
<br />
= Experimental Features =<br />
RAPPS has some experimental features that are not refined enough and/or not used yet. They are still subject to change, therefore are not yet adopted in the main database.<br />
<br />
However, these features are present in the codebase and work well enough to be tested and used.<br />
<br />
== Command Line Support ==<br />
Apart from the graphical interface, RAPPS features command-line options that can be used to install apps.<br />
They will install exactly as if selected in the app itself.<br />
<br />
There are two keys now:<br />
*<code>/INSTALL</code> - accepts multiple apps as values and installs them if they are available.<br />
Example: <code>rapps /INSTALL 7-Zip AkelPad</code><br />
*<code>/SETUP</code> - accepts a full path to the .inf file, where in <code>[RAPPS]</code> block you can specify which apps to install using one Install= key per single app.<br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
[Version]<br />
Signature = $Windows NT$<br />
ClassGUID = {00000000-0000-0000-0000-000000000000}<br />
<br />
[RAPPS]<br />
Install=7-Zip<br />
Install=AkelPad<br />
</syntaxhighlight ><br />
<code>[Version]</code> section is a nessesary header for .INF files. <code>[RAPPS]</code> is a section where you specify the needed apps.<br />
Apps should be added in .INF one-by-one, as can be seen in the example. <br />
<br />
Names used are same as in the <code>Name</code> field in the database textfiles.<br />
<br />
== Icon Support ==<br />
RAPPS supports 'per app' icons, that can be loaded from <code>AppData/rapps/rapps/icons</code> folder (that's where the database entries are).<br />
<br />
The filename should match the <code>Name</code> field in the database plus the extension. Only .ICO format icons are supported.<br />
<br />
== New [Section] Fields ==<br />
There are two experimental fields in the database files - '''Languages''' and '''LicenseInfo'''.<br />
<br />
=== Languages ===<br />
This field is used to inform the user whether the app is available in their language.<br />
<br />
You should place all the language codes app supports separated by <code>|</code> there. Multiline parameters are also supported. <br />
<br />
Example:<br />
<syntaxhighlight lang="ini"><br />
Languages=0C09|0813|0422 \\English|Dutch|Ukrainian<br />
</syntaxhighlight><br />
<br />
=== LicenseInfo === <br />
This is a field in the DB which, when present, changes the way License field in the info is shown.<br />
<br />
Application license types correspond to a number:<br />
*1 - "Open Source"<br />
*2 - "Freeware" <br />
*3 - "Demo/Trial". <br />
<br />
= See Also =<br />
<!-- *[http://www.fileden.com/files/2012/3/22/3281665/rapps.7z Brent's RAPPS entries (228 programs)] link is down --><br />
*[https://reactos.org/blogs/rapps-enchancements-gsoc-2017-edition-final-report RAPPS GSoC 2017 Final Report]<br />
<br />
= References =<br />
<references/><br />
<br />
[[Category:ReactOS Components]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=50672Developing ReactOS with Visual Studio2020-05-16T18:01:25Z<p>Learn more: cmake</p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
''This workflow is mainly for working on usermode applications.''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>cmake --version</pre><br />
#* The result should be: '''''<tt>cmake version 3.17.1-ReactOS</tt>'''''<br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=50663Developing ReactOS with Visual Studio2020-05-16T16:56:33Z<p>Learn more: </p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
''This workflow is mainly for working on usermode applications.''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>where cmake</pre><br />
#* The first entry should be: '''''<tt>C:\RosBE\bin\cmake.exe</tt>'''''<br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=50662Developing ReactOS with Visual Studio2020-05-16T16:10:52Z<p>Learn more: Have fun</p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>where cmake</pre><br />
#* The first entry should be: '''''<tt>C:\RosBE\bin\cmake.exe</tt>'''''<br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
# '''''Have fun!'''''<br />
#: [[File:RApps in Win10.png|RApps running in Windows 10]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Developing_ReactOS_with_Visual_Studio&diff=50661Developing ReactOS with Visual Studio2020-05-16T16:07:21Z<p>Learn more: Build RApps in VS 2019 CE</p>
<hr />
<div>'''Before reporting problems, ensure you have followed every step!'''<br />
<br />
For this example we are going to see how to build [https://github.com/reactos/reactos/tree/master/base/applications/rapps rapps] from Visual Studio 2019.<br />
<br />
=== Installation ===<br />
# Download the Visual studio 2019 community edition.<br />
#* When selecting the options, be sure to at least include '''''<tt>Desktop development with C++</tt>'''''<br />
#*: [[File:Desktop development.png|Desktop development]]<br />
# Ensure you have started visual studio at least once, and you are able to create a working c++ project.<br />
#* To validate this, choose '''''<tt>Create a new project</tt>''''', choose '''''<tt>Console App</tt>''''', and use all default options<br />
# Install the latest [[RosBE]] (Preferrably in '''''<tt>C:\RosBE\</tt>''''')<br />
#* Tick the option '''''<tt>Add BIN folder to PATH variable</tt>''''' (If you do not want this, you can later add it manually)<br />
#*: [[File:RosBE BIN folder.png]]<br />
# Get the source<br />
#* See for example [[ReactOS_Git_For_Dummies#Cloning_the_repository]]<br />
<br />
<br />
=== Creating the Solution ===<br />
<br />
# Open the '''''<tt>x86 Native Tools Command Prompt for VS 2019 Community Edition</tt>'''''<br />
#: [[File:x86 Native Tools Command Prompt for VS 2019.png]]<br />
# If you did not add the '''''<tt>BIN</tt>''''' folder to the PATH during RosBE setup, add it now manually:<br />
#* <pre>set PATH=C:\RosBE\Bin;%PATH%</pre><br />
# Create a folder where you want your solution to be created, and navigate towards that:<br />
#* <pre>pushd r:\build\wip\devenv_2019</pre><br />
# Validate that RosBE is correctly setup:<br />
#* <pre>where cmake</pre><br />
#* The first entry should be: '''''<tt>C:\RosBE\bin\cmake.exe</tt>'''''<br />
# Generate the solution (the source directory is '''''<tt>R:\src\wip</tt>''''' for this example):<br />
#* <pre>R:\src\wip\configure.cmd VSSolution -DENABLE_ROSTESTS=1 -DENABLE_ROSAPPS=1</pre><br />
#** The switch '''''<tt>-DENABLE_ROSTESTS=1</tt>''''' enables the testsuite<br />
#** The switch '''''<tt>-DENABLE_ROSAPPS=1</tt>''''' enables extra applications to be included that are also present on a release<br />
# If all went well, the message '''''<tt>Configure script complete! You can now use msbuild or open REACTOS.sln.</tt>''''' appears.<br />
#* There should now be a REACTOS.sln in '''''<tt>R:\build\wip\devenv_2019</tt>''''' (Which contains ALL projects!)<br />
#* Since rapps has the cmake [[https://git.reactos.org/?p=reactos.git&a=search&h=HEAD&st=grep&s=project%28rapps%29 '''''<tt>project(rapps)</tt>''''']] macro, there will also be a smaller solution just for rapps: '''''<tt>R:\build\wip\devenv_2019\base\applications\rapps\rapps.sln</tt>'''''<br />
#* Open this solution, and expand '''''<tt>base\rapplications\rapps</tt>'''''<br />
#* Right click rapps, choose '''''<tt>Set as Startup Project</tt>'''''<br />
#*: [[File:Set as Startup Project.png]]<br />
#* Press '''''<tt>Debug->Start Debugging</tt>''''' in the menu, or the hotkey that is displayed behind it (F5 for me)<br />
#* '''''Have fun!'''''<br />
#*: [[File:RApps in Win10.png|RApps running in Windows 10]]</div>Learn morehttps://reactos.org/wiki/index.php?title=File:Set_as_Startup_Project.png&diff=50660File:Set as Startup Project.png2020-05-16T16:00:28Z<p>Learn more: Set as Startup Project</p>
<hr />
<div>== Summary ==<br />
Set as Startup Project</div>Learn morehttps://reactos.org/wiki/index.php?title=File:RosBE_BIN_folder.png&diff=50659File:RosBE BIN folder.png2020-05-16T15:47:42Z<p>Learn more: RosBE BIN folder</p>
<hr />
<div>== Summary ==<br />
RosBE BIN folder</div>Learn morehttps://reactos.org/wiki/index.php?title=File:X86_Native_Tools_Command_Prompt_for_VS_2019.png&diff=50658File:X86 Native Tools Command Prompt for VS 2019.png2020-05-16T15:44:18Z<p>Learn more: x86 Native Tools Command Prompt for VS 2019</p>
<hr />
<div>== Summary ==<br />
x86 Native Tools Command Prompt for VS 2019</div>Learn morehttps://reactos.org/wiki/index.php?title=File:Desktop_development.png&diff=50657File:Desktop development.png2020-05-16T15:39:32Z<p>Learn more: Learn more uploaded a new version of File:Desktop development.png</p>
<hr />
<div>== Summary ==<br />
Visual Studio 2019 Community Edition option</div>Learn morehttps://reactos.org/wiki/index.php?title=File:Desktop_development.png&diff=50656File:Desktop development.png2020-05-16T15:38:15Z<p>Learn more: Visual Studio 2019 Community Edition option</p>
<hr />
<div>== Summary ==<br />
Visual Studio 2019 Community Edition option</div>Learn morehttps://reactos.org/wiki/index.php?title=File:RApps_in_Win10.png&diff=50655File:RApps in Win10.png2020-05-16T15:35:10Z<p>Learn more: RApps running in Win10</p>
<hr />
<div>== Summary ==<br />
RApps running in Win10</div>Learn morehttps://reactos.org/wiki/index.php?title=Building_ReactOS&diff=50654Building ReactOS2020-05-16T10:51:27Z<p>Learn more: /* Optional: Set Up Visual Studio */</p>
<hr />
<div><!-- '''NOTE: This page is deprecated and is purely here for archival purposes. For instructions on building ReactOS, please see the [http://www.reactos.org/development/build-environment build environment] page of the development guide.''' --><br />
This page describes the steps necessary to build ReactOS.<br />
<br />
== Getting all you need ==<br />
=== Setting up a Build Environment ===<br />
For building ReactOS you also need the official [[ReactOS Build Environment]]. Please download and install it from that page.<br />
<br />
Make sure that no interfering build environment (such as MSYS) is in your PATH environment variable when building.<br />
<br />
<!-- {{Notice|Due to a current bug, the build environment can not use a build folder that contains spaces in its path name.<br /><br />
Under Windows XP and 2003 you must change the default location of "C:\Documents and Settings\[username]\reactos\".}} --><br />
=== Optional: Set Up Visual Studio ===<br />
If you want to use Visual Studio to compile ReactOS, you need to get one of the supported version, which is VS2015 and later. You can download the free Community Edition of Visual Studio 2015 (or later). To compile with VS, open the appropriate VS command prompt and follow the same instructions as for building with the GCC based ReactOS build environment. Note that you still need the ReactOS build environment, which contains CMake and some additional tools, or you can install the latest version of CMake yourself, but that is not recommended. If you experience problems with the configure stage, e.g. the compiler is reported to not be working, please check if you have installed any additional Windows SDKs or WDK and try again after removing them.<br />
<br />
=== Getting a Working Copy ===<br />
The first step in building ReactOS is getting a copy of the source code.<br />
<br />
You can use the exported release source code, but since you are reading this, you are probably interested in keeping up to date with the latest changes, so you will want a "working copy" of ReactOS.<br />
To get a working copy of ReactOS, please read the [[ReactOS_Git_For_Dummies|ReactOS Git For Dummies]] page.<br />
<br />
You need to have [https://git-scm.com/ Git] installed on your system. The command<br />
git clone https://github.com/reactos/reactos.git <br />
from within the command prompt will download it.<br />
<br />
== Prerequisites ==<br />
For building ReactOS you will need at least 2 GB of RAM, preferably 4 GB.<br />
If you are [[Building ReactOS on a cloud node instance|building on a cloud server instance]] having less than 2 GB of RAM, you might find that your SSH connection to the cloud node is forcibly closed during the "./configure" step. This is usually caused by running out-of-memory during the CMake configure step.<br />
<br />
{{Notice|It is recommended to temporarily disable your antivirus before proceeding, because some of them detect some of ReactOS' system files (in particular, crtdll.dll) as being infected.}}<br />
<br />
Before building either the tools or ReactOS itself the output location must be created and prepared. This is an easy step and involves only one command. This command is located in the root of recent revisions of the source code and can be run either from the root directory itself or any other directory you want the build your sources in. Please make sure you are running it from within ReactOS BE:<br />
<br />
=== Linux/Unix ===<br />
Run:<br />
<syntaxhighlight lang="bash"><br />
configure.sh<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
<br />
=== Windows or ReactOS ===<br />
Run:<br />
<syntaxhighlight lang="dos"><br />
configure.cmd<br />
cd output-MinGW-i386<br />
</syntaxhighlight><br />
After executing, folder <tt>output-MinGW-i386</tt> will be created in root of ReactOS tree. You will be redirected to it.<br />
If you want to build in a different folder, cd to that folder first and then execute<br />
<syntaxhighlight lang="dos"><br />
<path_to_source>\configure.cmd<br />
</syntaxhighlight><br />
<br />
configure.cmd currently supports the following options:<br />
* <code>/?</code> displays help<br />
* <code>Codeblocks</code> creates a CodeBlocks solution<br />
* <code>Eclipse</code> creates an Eclipse solution<br />
* <code>Makefiles</code> creates (n)make files<br />
* <code>clang</code> Uses clang instead of gcc<br />
* <code>VSSolution</code> Creates a Visual Studio solution<br />
<br />
You can additionally specify any number of cmake command line options, like "-DSYMBOL=VALUE".<br />
<br />
=== Building ReactOS on Windows or ReactOS* ===<br />
From the build folder (e.g. reactos\output-MinGW-i386) enter the following command:<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
<small>* Perhaps, some functions of RosBE may not work on ReactOS. If so, please have a look on our [http://jira.reactos.org/ Jira] page whether this problem is already reported or not.</small><br />
<br />
=== Building ReactOS on Unix/Linux ===<br />
<syntaxhighlight lang="dos"><br />
ninja COMMANDS<br />
</syntaxhighlight><br />
Combining the above steps together:<br />
Replace "COMMANDS" with the desired build commands, such as <code>bootcd</code> or <code>livecd</code>, listed below:<br />
<br />
== Commands ==<br />
<br />
After you have started a Build Environment Command Prompt, there are certain commands available.<br />
<br />
=== Invoking a build ===<br />
<br />
<code>'''ninja'''</code> or <code>'''ninja all'''</code><br />
<br />
This command builds all binaries of ReactOS. They will be placed in the created output directory created by the configure command. (default: ''output-MinGW-i386/reactos'')<br />
All source files, which did not change since the last build, will not be built again.<br />
<br />
<code>'''ninja bootcd'''</code><br />
<br />
This command works like ''make'', but also generates a bootable ReactOS ISO file (''bootcd.iso'') placed into the output directory.<br />
It is wise to tag your Boot-CDs with the revision they were built from if you need to keep many ReactOS ISOs.<br />
<br />
<code>'''ninja livecd'''</code><br />
<br />
This command generates ''livecd.iso'' in the output directory. This is the ReactOS Live-CD that runs completely from the CD-ROM.<br />
<br />
<code>'''ninja hybridcd'''</code><br />
<br />
This command generates ''hybridcd.iso'' in the output directotry. This is a hybrid cd of ReactOS<br />
<br />
<!--<br />
=== Other ===<br />
<br />
'''clean'''<br />
This command cleans all files of your working copy except the generated ISO files (if any). The next build you make will be completely clean then. Any parameters will recognized as module name and only this module will be cleaned then. --><br />
<!-- to be continued --><br />
<br />
== Adding modules to the build process ==<br />
<br />
There are several modules you can add to the build process. For example ''rosapps'' contains some additional applications not included by default.<br />
<br />
The page [[Building Modules]] describes, which modules exist and how to add them to the build process.<br />
<br />
== See also ==<br />
* [[Building with MSVC]]<br />
* [[Building MINGW-w64]]<br />
* [http://www.reactos.org/forum/viewtopic.php?f=22&t=11000 Building with Ninja] latest build method, RosBE v2.1<br />
<br />
[[Category:Building]]<br />
[[Category:Tutorial]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Google_Summer_of_Code_2020&diff=50389Google Summer of Code 20202020-03-10T18:00:04Z<p>Learn more: </p>
<hr />
<div>[[File:GSoC-logo2016.png|frameless|center|600px|link=https://summerofcode.withgoogle.com/organizations/5375811286204416/]]<br />
<br />
== What is GSOC? ==<br />
Google Summer of Code is a global program focused on bringing more student developers into open source software development. Students work with an open-source organization on a 3-month programming project during their break from school. [[Google_Summer_of_Code_2020#How_To_Apply| How to apply?]]<br />
<br />
== Potential Students ==<br />
This is the list of potential students who want to participate in ReactOS GSoC 2020. The list is maintained by the community and interested students, and does not reflect official developers position or opinion.<br />
<br />
Your official proposals should be sent via Google's GSoC interface, details are described below.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Student !! Area of interest !! Links & Contacts !! Small contribution<br />
|-<br />
| Suraj K Suresh || Kernel, SEH, Fuzzing || [https://chat.reactos.org/reactos/pl/ku8gsgbnotby3mtse8i8xydjyy Message in chat]<br> Mattermost: <code>@Freakston</code> || [https://github.com/reactos/reactos/pull/2161 PR #2161]<br />
|-<br />
| Nguyen Trung Khanh || Drivers? || [https://chat.reactos.org/reactos/pl/61wytbuq9pnozybsamobzxojaw Message in chat]<br> Mattermost: <code>@khanhnt</code> || [https://github.com/reactos/reactos/pull/2403 PR #2403]<br />
|-<br />
| Chaitanya Gadgil || RAPPS || [https://reactos.org/pipermail/ros-dev/2020-March/019118.html ros-dev e-mail]<br> [https://chat.reactos.org/reactos/pl/3qrxnoue1b8c3r46mhxd86thah Message in chat]<br> Mattermost: <code>@chaitanya710</code> || <br />
|}<br />
<br />
== Accepted Projects ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Project !! Student !! Nick in Mattermost !! Mentor(s)<br />
|-<br />
|}<br />
<br />
== How To Apply ==<br />
See the [[Google Summer of Code 2020 Ideas]] page for more information about possible projects.<br />
<br />
=== Get familiar with the code ===<br />
Every student new to ReactOS should begin by obtaining the code through our [https://github.com/reactos/reactos GitHub] repository and performing the first build using our [https://www.reactos.org/wiki/ReactOS_Build_Environment build environment]. This environment ensures consistent build results, eliminates the need to set up your own toolchain and makes ReactOS one of the easiest operating systems to build.<br />
<br />
Creating a fork of the ReactOS repository on GitHub is recommended for most students. This enables the use of branches and pull requests for contributions.<br />
<br />
=== Make a small contribution === <br />
Before your application can be accepted, it is expected that you submit a patch proposing a code change to the project, and work through the process of getting it merged into the master branch. Check out the [https://jira.reactos.org/issues/?filter=14803 starter-project label] on JIRA for some ideas of what to work on. You are not required to complete these steps in solitude, and we are happy to help with any part of the process if asked. Please note that while translations, documentation or comment fixes are an easy way to validate your workflow, they do not count toward this requirement.<br />
<br />
Go through [[Development Introduction]] to get started with your contribution.<br />
<br />
=== Reach out ===<br />
Effective communication is a key requirement for a successful project. Students should subscribe to the [http://www.reactos.org/mailman/listinfo/ros-dev ros-dev] mailing list and optionally could join the [https://chat.reactos.org/reactos/channels/development Development channel] on our Mattermost chat server for a live discussion with developers. There is also [irc://irc.freenode.net/#reactos-dev #reactos-dev] channel on Freenode’s IRC network which is bridged with the development channel, but mattermost is preferred.<br />
<br />
'''Please ensure you've discussed your proposal with a project member on the chat or on the mailing list before final submission. The developers will have invaluable feedback regarding your project's scope and your approach to it, and your proposal is unlikely to succeed without that feedback.<br />
'''<br />
<br />
=== Fill out your application ===<br />
See the [[#Student Application Form|Student Application Form]] below.<br />
<br />
=== Read the documentation ===<br />
MSDN and plenty of available Windows publications serve as the primary reference for functionality ReactOS seeks to implement. However, there are parts of Windows that are poorly documented or completely undocumented. In these instances, the ReactOS [[Techwiki]] may possess descriptions of the data structures or interfaces. If no documentation exists, students may have to conduct their own research and document the results – following project guidelines on respecting intellectual property. Our mentors can help guide this research process.<br />
<br />
== Our GSoC Adminstrators ==<br />
* [[Colin Finck]]<br />
* [[Amine Khaldi]]<br />
* [[Mark Jansen]]<br />
<br />
== Our Potential Mentors ==<br />
* [[Giannis Adamopoulos]]<br />
* [[Hermes Belusca-Maito]]<br />
* [[Mark Jansen]]<br />
* [[Timo Kreuzer]] (former GSoC Student)<br />
* [[Victor Perevertkin]] (former GSoC Student)<br />
<br />
== Student Application Form ==<br />
Students apply via the [https://summerofcode.withgoogle.com/ Google Summer of Code web site].<br />
Please see the information found there about how GSoC works for students, the timeline, and other details.<br />
<br />
=== General Information ===<br />
* '''Full Name'''<br />
* '''Languages You Speak'''<br />
* '''Timezone'''<br />
* '''ReactOS website Account Name'''<br />
* '''IRC Nickname on Freenode'''<br />
<br />
=== Time Commitment ===<br />
You are required to outline any additional obligations you may have during the summer and how much of your time you will be able to commit to your GSoC project.<br />
Failure to do so will result in a rejection of your application.<br />
<br />
=== Proposed Project ===<br />
Please provide a brief description, in your own words, of the project you are interested in<br />
<br />
=== Proposed Milestones ===<br />
Please propose milestones that can be used to gauge progress on the project.<br />
<br />
=== Legal Requirements ===<br />
Students are required to affirm that the following is true.<br />
I hereby swear that I have not used nor seen the source code to any version of the Windows operating system nor any Microsoft product that may be related to the proposed project that is under a license incompatible with contribution to ReactOS, including but not limited to the leaked Windows 2000 source code and the Windows Research Kernel.<br />
<br />
== FAQ ==<br />
;What criteria did you use to select the individuals who will act as mentors for your organization?<br />
<br />
Our mentors were selected based on availability and familiarity with various parts of the NT architecture including but not limited to networking, filesystems, graphics, the registry, and hardware interfaces. In addition we place emphasis on the ability of a developer to act in a teaching role, who know how to guide students but provide enough freedom to allow the student to explore and learn how to achieve their goals through their own efforts. We will also encourage our mentors to be available to not just their assigned students but also other students that have projects under ReactOS. Many of our mentor candidates are knowledgeable about a wide range of topics and can provide advice for topics beyond their assigned student’s project.<br />
<br />
;What is your plan for dealing with disappearing students?<br />
<br />
While every effort will be made to select students who are unlikely to disappear, we recognize that unpredictable circumstances are always possible. As such, we will require that all students provide backup contact information that we will verify as a failsafe in case students drop out of contact and are unable to inform us directly. Based on the situation, we will try to work with the student to accommodate any special circumstances that arise to ensure a project’s success, but if a student is unable to complete their project we will contact the GSoC team to consider any necessary actions, including marking a project as failed.<br />
<br />
;What is your plan for dealing with disappearing mentors?<br />
<br />
While the mentor candidates we have selected are considered highly reliable, we again recognize that life can result in unexpected circumstances. As noted above, the mentor candidates we have selected are knowledgeable in more than just one specific part of Windows NT, and we will encourage students to consult with not just their assigned mentor but also others taking part in the GSoC program. As such, students will always have advisers available to them even if their assigned mentor is unable to continue with the project thanks to the fact that pretty much all our active contributors are wide-coverage developers.<br />
<br />
;What steps will you take to encourage students to interact with your project's community before and during the program?<br />
<br />
Students whose projects are selected will be introduced to the greater ReactOS community by their mentors. They will also be put in touch with several community members that are actively engaged in regression and feature testing, whom will be invaluable in helping students find a wider audience for testing their code. Students will also be required to provide status updates to the community, which will provide opportunities for feedback and further engagement. Even after a project is completed, a student will have learned a great deal about Windows development and will know that the ReactOS project is available as a resource for any future development work they may pursue on Windows.<br />
<br />
;Besides my mentor, who else is available to help me?<br />
<br />
Besides developers not directly involved as mentors, we encourage all of our mentors to interact with students. As such, consider any mentor or developer as a resource to field questions and help as needed.<br />
<br />
[[Category:Google Summer of Code]]<br />
[[Category:Community]]</div>Learn morehttps://reactos.org/wiki/index.php?title=Google_Summer_of_Code&diff=50293Google Summer of Code2020-02-20T19:29:11Z<p>Learn more: </p>
<hr />
<div>*;'''[[Google Summer of Code 2020]]''' (accepted)<br />
----<br />
*'''[[Google Summer of Code 2019]]''' (accepted)<br />
*'''[[Google Summer of Code 2018]]''' (accepted)<br />
*'''[[Google Summer of Code 2017]]''' (accepted)<br />
*'''[[Google Summer of Code 2016]]''' (accepted)<br />
*[[Google Summer of Code 2015]]<br />
*[[Google Summer of Code 2014]]<br />
*[[Google Summer of Code 2013]]<br />
*[[Google Summer of Code 2012]]<br />
*'''[[Google Summer of Code 2011]]''' (accepted)<br />
*[[Google Summer of Code 2010]]<br />
*[[Google Summer of Code 2009]]<br />
*[[Google Summer of Code 2007]]<br />
*'''[[Google Summer of Code 2006]]''' (accepted)<br />
<br />
[[Category:Google Summer of Code]]</div>Learn more