by hbelusca | February 27, 2017

Hello everyone, I'm summarizing here my latest progress towards making Word 2010 running in ReactOS.

After having paused a little my ReactOS development during the first two weeks of February (due to personal matters), I started reviewing Samuel Serapión's NTLM code (in the "sspi-bringup" branch) and first focused on trying to convert his NTLM tests into something that can be included into our apitest framework. This is still work-in-progress because his original tests are interactive, and I need to find the good way of turning them into automated tests and finding a way to store the test results (for comparison purposes), as the tests are modeled around a client/server architecture.

In addition I was warned that somebody in our team wanted to make a presentation of ReactOS to a group of people, including a presentation of Word 2010 running in ReactOS, at the very end of February. Since the NTLM implementation of Samuel could not be obviously ready for such an extremely short time lapse, I tried to think about the possibility of importing the Wine's NTLM code layer into our codebase, as an interim solution until Samuel's proper implementation would be ready. As I indicated in a previous blog report, Wine implements NTLM as a layer around Samba's "ntlm_auth" helper utility, in other words, this NTLM layer is dependent on a 3rd-party program that should be already installed. As such this is not satisfactory for ReactOS for the long-term; however I nonetheless explored the possibility of temporarily adding this NTLM layer into ReactOS, as also advocated by other people.

After two days of work I had the Wine's NTLM code layer integrated into ReactOS (with a modification concerning the way how the 3rd-party "ntlm_auth" helper utility is started), and the layer was added in revision r73868. The "only" problem now was to find a Windows build of Samba that could be downloaded & installed inside ReactOS. Fortunately I've found one on the Internet, at http://smithii.com/samba . This is a build of Samba 3.0.23c , which is quite old now, but is actually enough to make the Word/Office 2010 installation working. One of the minor modifications that I added to the Wine NTLM layer was to lower the required version of Samba (which was originally of 3.0.25) down to 3.0.23 to make this build version usable. The other solution would have been to create a Windows build of a more recent version of Samba, but this would have needed me to install Cygwin & bring modifications to Samba's code. My aim being not to play with Samba but to improve our support for Word in ReactOS, I chose the simplest solution to find an existing build on the Internet. I invite you to read the commit log of revision r73868 for the details of installation of this Windows build of Samba in ReactOS; alternatively you can find a pre-packaged installer of this Samba build in our RAPPS repository (under the section "Internet").

Everything was good and nice so far, the Word/Office 2010 installation successfully passing through the steps that required this NTLM authentication support (read my previous blog reports for the details), however the installation continued to fail at the very last step, with the following error:

err:(dll\win32\msi\action.c:528):msi:ITERATE_Actions Execution halted, action L"InstallFinalize" returned 1603

So, what was happening? I enabled extended debug tracing in msi.dll, and noticed the following (debug snippets):

err:(H:\trunk\reactos_clean\dll\win32\msi\action.c:489):msi:ITERATE_Actions Starting action: L"InstallFinalize" trace:(H:\trunk\reactos_clean\dll\win32\msi\action.c:7818):msi:ACTION_PerformAction Performing action (L"InstallFinalize") [...] trace:(H:\trunk\reactos_clean\dll\win32\msi\action.c:7818):msi:ACTION_PerformAction Performing action (L"[\"\" \"C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OfficeSoftwareProtectionPlatform\\OSPPWMI.MOF\"<=>S-1-5-21-830519046-1312593930-835119747-500<=>{90140000-003D-0000-0000-0000000FF1CE}]InstallOSppMof.x86") [...] trace:(H:\trunk\reactos_clean\dll\win32\msi\custom.c:1212):msi:ACTION_CustomAction Handling custom action L"InstallOSppMof.x86" (e01 L"WixCA" L"CAQuietExec") [...] trace:(H:\trunk\reactos_clean\dll\win32\msi\package.c:2117):msi:msi_get_property returning L"\"\" \"C:\\Program Files\\Fichiers communs\\Microsoft Shared\\OfficeSoftwareProtectionPlatform\\OSPPWMI.MOF\"" for property L"InstallOSppMof.x86" [...] trace:(H:\trunk\reactos_clean\dll\win32\msi\custom.c:669):msi:HANDLE_CustomType1 Calling function L"CAQuietExec" from L"C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\msi7A7B.tmp" trace:(H:\trunk\reactos_clean\dll\win32\msi\custom.c:412):msi:wait_thread_handle waiting for L"InstallOSppMof.x86" trace:(H:\trunk\reactos_clean\dll\win32\msi\custom.c:616):msi:DllThread custom action (380) started [...] trace:(H:\trunk\reactos_clean\dll\win32\msi\custom.c:620):msi:DllThread custom action (380) returned 1603 [...] err:(H:\trunk\reactos_clean\dll\win32\msi\action.c:521):msi:ITERATE_Actions Action: L"InstallFinalize" finished with error code 1603 err:(H:\trunk\reactos_clean\dll\win32\msi\action.c:532):msi:ITERATE_Actions Execution halted, action L"InstallFinalize" returned 1603 < From there on, the failed installation rolls back... >

So what is happening there? It happens that the very last step of the Office/Word 2010 installation consists in installing new WMI ("Windows Management Instrumentation") classes for helping managing different aspects of the Office installation. This is done by compiling the "Managed Object Format" (MOF) file OSPPWMI.MOF (see also this article) using the MOF compiler mofcomp.exe, which exists in native Windows installations (starting Windows 2000), in the System32\wbem directory. As it turned out, this application did not exist in the ReactOS code base, while it exists in Wine's (stubbed out). This explains why the Word installation succeeded in Wine, while it failed in ReactOS!! (see also JIRA report CORE-12811).

With this knowledge I imported the mofcomp stub from Wine into our source tree (in revision 73867). The Office installation actually does not care about the actual result of the MOF compilation; what it wants is just to be able to find and start the compiler, therefore the stub is sufficient for our purposes.

The end result: Word (and more generally, Office) 2010 can be installed & started inside ReactOS!

Word 2010 on ReactOS r73854

Excel and Word 2010 running on ReactOS r73868.

WARNING #1: The apparent "beauty" of these pictures actually hide another problem that exists only in ReactOS, namely that we currently still suffer from strange graphical bugs. Indeed if you happen to move the graphics shown in the Excel window (or, any figure drawn inside Word), the moved object is drawn upside-down (inversion of y-coordinates), and black rectangular areas appear at the places where the object should actually appear.