Difference between revisions of "Arwinss"

From ReactOS Wiki
Jump to: navigation, search
m (TODO list)
 
(148 intermediate revisions by 24 users not shown)
Line 1: Line 1:
=== Arwinss ===
+
{{outdated}}
 +
'''Arwinss''' is an alternative implementation of the core Win32 subsystem components. Technical information about implementation details is available at this page: [[Arwinss technical]].
  
An alternative implementation of core Win32 subsystem components. This is NOT designed to replace the ReactOS Win32 subsystem, instead it is a temporary solution that may become irrelevant when the Win32 subsystem is finished.
+
== Usage ==
  
== Usage ==
+
Before continuing, I'd recommend a separate build folder for building Arwinss. Otherwise you'll have to revert the Arwinss changes and rebuild ReactOS.
  
Checkout the arwinss branch (svn://svn.reactos.org/reactos/branches/arwinss/reactos), and compile using following command:
+
Checkout the arwinss branch ([https://git.reactos.org/?p=reactos.git;a=shortlog;h=refs/heads/arwinss cgit]/[https://github.com/reactos/reactos/tree/arwinss github]; <code>git clone https://github.com/reactos/reactos -b arwinss</code>), into a folder that can really be anywhere. Copy the arwinss (and win32csr?) folder and trunk.diff into your dedicated build folder containing the "normal" ReactOS code. Apply trunk.diff and hope that it applies with no problem. Afterwards, you can compile using the normal build commands:
  makex user32 gdi32 win32k winent win32csr freetype kernel32 explorer winlogon
+
  ninja
 +
ninja bootcd
 +
ninja livecd
 +
ninja hybridcd
  
This will build you all needed modules of a new subsystem, which you need to copy over to the installed ReactOS version. Modified kernel32.dll is needed only for a compatible global atoms support.
+
This will build a copy of trunk with the alternate subsystem enabled.
  
If you want to build winex11 module, you need to firstly copy lib/3rdparty/libX11/libX11.a file from your working copy to the obj-i386/lib/3rdparty/libX11 directory (creating it if it doesn't exist). This will fix the winex11.drv linking issues, and you can just type
+
If you want to build the winex11 module, you must first copy the <tt>lib/3rdparty/libX11/libX11.a</tt> file from your working copy to the <tt>obj-i386/lib/3rdparty/libX11</tt> directory (creating it if it does not exist). This will fix the winex11.drv linking issues, and you can just type
  makex winex11
+
  ninja winex11
 
to build this optional module.
 
to build this optional module.
  
IMPORTANT: Set your display bit depth to 32bpp and resolution to 800x600.
+
If the patch fail to apply, watch this page for updates. You may also have some luck with applying it to its contemporary (~2015) ReactOS code and rebasing the newer changes in, in light of some changes to how the code is organized. (Most notably with win32csr being refactored and moved around.) Remember to post your updates here if you got it to work.
  
 
== Architecture ==
 
== Architecture ==
  
Arwinss uses parts of Wine architecture, and parts of Windows NT architecture in appropriate places and in a good way. A detailed description is provided on a standalone page called [[Arwinss architecture]].
+
Arwinss uses parts of the [[Wine]] architecture and parts of Windows NT architecture in appropriate places and in a good way. The overall call flow / architecture of [[Arwinss]] looks like this:
 +
 
 +
[[File:arwinss.png]]
  
 
It consists of the following modules, one of them being optional (winex11.drv):
 
It consists of the following modules, one of them being optional (winex11.drv):
* dll/3rdparty/freetype - implements usermode font rendering (FreeType library, with small ros glue), used by gdi32.dll
+
* <tt>arwinss/freetype</tt> – implements usermode font rendering (FreeType library, with small ReactOS glue), used by GDI32.DLL
* dll/win32/user32 - implements USER API
+
* <tt>arwinss/client/user32</tt> – implements USER API, maps to wine <tt>dlls/user32</tt>
* dll/win32/gdi32 - implements GDI API
+
* <tt>arwinss/client/gdi32</tt> – implements GDI API,maps to wine <tt>dlls/gdi32</tt>
* dll/win32/winent.drv - implements native graphics and user drivers
+
* <tt>arwinss/client/winent.drv/winent.drv</tt> – implements native graphics and user drivers, ReactOS implemented
* dll/win32/winex11.drv - implements X11 X-windows graphics and user drivers
+
* <tt>arwinss/client/winex11.drv/</tt> – implements X11 X-windows graphics and user drivers, maps to wine <tt>dlls/winex11.drv</tt>
* subsystems/win32/win32k - implements kernel mode counter part of the native graphics driver and a kernel mode USER server.
+
* <tt>win32ss</tt> – implements kernel mode counter part of the native graphics driver, a Simple Window Manager (SWM) and a kernel mode USER server.
* subsystems/win32/csrss/win32csr - implements needed parts of the CSR subsystem along with handling user input
+
* <tt>win32csr</tt> – implements needed parts of the CSR subsystem along with handling user input
  
 
== Hacking ==
 
== Hacking ==
  
Most of the hacking happens in winent.drv and win32k.sys, with very rare fixes to the user32/gdi32 (mainly, because it's a tested Wine's code with only minor changes).
+
Most of the hacking happens in WINENT.DRV and WIN32K.SYS, with very rare fixes to the user32/gdi32 (mainly, because it's a tested Wine's code with only minor changes).
  
 
Convention for marking changes. C++ code comments (//) mean that the place has some special mark up for debugging. A typical use is for a
 
Convention for marking changes. C++ code comments (//) mean that the place has some special mark up for debugging. A typical use is for a
 
  // FIXME: Something
 
  // FIXME: Something
  
== TODO ==
+
One of the things you may want to mess around with the old code may be swapping out the old wine for a new one, given how many new things they have implemented. For those who are interested, the current code is based on wine 1.3.13 and 1.1.36 depending on which parts you are looking at. The arrangement of dll directories mostly stays the same, but winex11.drv has gone over some rearrangements that might make your job harder. (Some of the REAL cool things, such as newer DX support for games, are outside of the scope of arwinss and should be tried directly on the master branch.)
'''This list is legacy and will be removed soon! A new place for this is ReactOS Assembla space http://www.assembla.com/space/reactos'''
+
 
# [Fixed] Check situation with desktop and top windows - need to ensure there is no auto "one desktop per application" creation happens!
+
== Potential Benefits ==
# [Fixed] Check all places which use PsLookupThreadByThreadId and fix reference counting
+
These bugs would be fixed if Arwinss was ready (just a short list):
# Enable commented out places in the font output code (ET_OPAQUE, etc)
+
 
# [Fixed] No desktop background (hacked away in win32csr)
+
* {{REACTOSBUG|1101}}
# [Fixed] Fix absence of a background color in windows, and general lacking of windows painting
+
* {{REACTOSBUG|9612}}
# [Fixed] Fix a "err:(dll\win32\gdi32\freetype.c:3068) FT_New_Face rets 85" problem, resulting in a hack in RosDrv_GetTextMetrics
+
* <del>{{REACTOSBUG|9984}}</del>
# [Fixed] Fix RosGdiSelectBitmap with an incorrect user bitmap handle (probably a stock bitmap?)
+
 
# Make win32k/wine/queue.c (timer callback and timeout callback) multithread aware. Right now it doesn't lock its lists
+
As one can see from these bug titles it mainly boils down to drastically improved user32 and gdi32 support.
# [Fixed] Make user/kernel handles mapping multithread aware. NOTE: It already was.
+
 
# [Fixed] Add some real locking to GDI_ObjGetPtr / GDI_ObjRelease. NOTE: Just added multithread safety to GDI_ObjGetPtr, but pointers to objects are not locked in any way, so release is a noop.
+
== TODO list ==
# [Fixed] Implement surface bits locking for concurrent accesses
+
See full list of bugs at https://jira.reactos.org/projects/ARWINSS.
# [Fixed] Implement mouse cursor support in win32k
+
# <del>Fix redrawing issues {{ARWINSSBUG|19}} and {{ARWINSSBUG|26}}</del>
# [Fixed] Implement user input in win32k and winent.drv
+
# <del>Fix crash that prevents booting in VirtualBox</del>
# [Fixed] Implement a locking mechanism for GDI kernel mode objects
+
# <del>Fix installer/uninstaller crash {{ARWINSSBUG|75}}</del>
# [Fixed] Add commented out CombinedClipping region back into all graphics operations
+
# Fix garbage on desktop after closing some apps {{ARWINSSBUG|63}}
# Make /CONSOLE booting from working perfectly
+
# <del>Fix zoom and tabs in Firefox {{ARWINSSBUG|76}}</del>
# [Fixed] Purge user->kernel handles mapping when a process is destroyed
+
# Fix "Window titles are shown as inactive (gray) while being active" {{ARWINSSBUG|7}}
# [Fixed] Get rid of hardcoded 800x600 (and 640x480 in monitor functions) display size
+
# <del>Fix arwinss related program crashes {{ARWINSSBUG|73}})</del>
# [Fixed] Fix black icons problem
+
# Fix interaction of windows in apps with few windows {{ARWINSSBUG|32}}
# Fix mouse cursor being black problem
+
# Fix low level input hooks (used for example in DosBox)
# [Fixed] Implement moving of windows
+
 
# Implement scrolling support
+
== Unimplemented/Fixme that appear during work ==
 +
 
 +
# fixme:(dll\win32\arwinss\winent.drv\userdrv.c:665) RosDrv_SetWindowStyle is UNIMPLEMENTED!
 +
# fixme:(dll\win32\arwinss\winent.drv\userdrv.c:642) RosDrv_SetWindowIcon is UNIMPLEMENTED!
 +
# (subsystems\win32\win32k_arwinss\wine\queue.c:814) TODO: Check if anyone is waiting on queue is missing!
 +
# (subsystems\win32\win32k_arwinss\eng\device.c:927) FIXME: DeviceName is NULL, trying display nr. 1 (TuxRacer)
 +
# fixme:(dll\win32\arwinss\winent.drv\userdrv.c:636) RosDrv_SetWindowRgn is UNIMPLEMENTED! (Reget)
 +
# fixme:(dll\win32\arwinss\winent.drv\userdrv.c:626) RosDrv_SetLayeredWindowAttributes is UNIMPLEMENTED! (Qutim)
 +
# err:(dll\win32\arwinss\winent.drv\gdidrv.c:353) ExtEscape for escape 8 is unimplemented! (SuperTux 0.3.3; ROS text screensaver)
 +
# fixme:(dll\win32\arwinss\winent.drv\clipboard.c:2440) NTDRV_CLIPBOARD_IsSelectionOwner is UNIMPLEMENTED! (AbiWord. Notepad++)
 +
# fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:451) RosDrv_GetTextExtentExPoint is UNIMPLEMENTED!
 +
# fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:609) RosDrv_RealizePalette is UNIMPLEMENTED!
 +
# fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:959) RosDrv_UnrealizePalette is UNIMPLEMENTED!
 +
# fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:433) RosDrv_GetNearestColor is UNIMPLEMENTED!
 +
 
 +
== Testing ==
 +
 
 +
You can get the latest ARWINSS ISO [https://sourceforge.net/projects/reactos/files/Arwinss/ here].
 +
 
 +
<gallery>
 +
File:Roslogon2.jpg|Arwinss running in Windows 2003 and connecting to X Windows server on the host Windows 7.
 +
</gallery>
 +
 
 +
== See Also ==
 +
*[https://reactos.org/wiki/images/8/80/Arwinss.pdf Arwinss PDF]
 +
 
 +
[[Category:Branches]]

Latest revision as of 05:08, 4 November 2019

This page is probably outdated

The information on this page might not be valid for the current state of ReactOS.
A Wiki Administrator should look at this page and decide or discuss what to do with it.


Arwinss is an alternative implementation of the core Win32 subsystem components. Technical information about implementation details is available at this page: Arwinss technical.

Usage

Before continuing, I'd recommend a separate build folder for building Arwinss. Otherwise you'll have to revert the Arwinss changes and rebuild ReactOS.

Checkout the arwinss branch (cgit/github; git clone https://github.com/reactos/reactos -b arwinss), into a folder that can really be anywhere. Copy the arwinss (and win32csr?) folder and trunk.diff into your dedicated build folder containing the "normal" ReactOS code. Apply trunk.diff and hope that it applies with no problem. Afterwards, you can compile using the normal build commands:

ninja
ninja bootcd
ninja livecd
ninja hybridcd

This will build a copy of trunk with the alternate subsystem enabled.

If you want to build the winex11 module, you must first copy the lib/3rdparty/libX11/libX11.a file from your working copy to the obj-i386/lib/3rdparty/libX11 directory (creating it if it does not exist). This will fix the winex11.drv linking issues, and you can just type

ninja winex11

to build this optional module.

If the patch fail to apply, watch this page for updates. You may also have some luck with applying it to its contemporary (~2015) ReactOS code and rebasing the newer changes in, in light of some changes to how the code is organized. (Most notably with win32csr being refactored and moved around.) Remember to post your updates here if you got it to work.

Architecture

Arwinss uses parts of the Wine architecture and parts of Windows NT architecture in appropriate places and in a good way. The overall call flow / architecture of Arwinss looks like this:

Arwinss.png

It consists of the following modules, one of them being optional (winex11.drv):

  • arwinss/freetype – implements usermode font rendering (FreeType library, with small ReactOS glue), used by GDI32.DLL
  • arwinss/client/user32 – implements USER API, maps to wine dlls/user32
  • arwinss/client/gdi32 – implements GDI API,maps to wine dlls/gdi32
  • arwinss/client/winent.drv/winent.drv – implements native graphics and user drivers, ReactOS implemented
  • arwinss/client/winex11.drv/ – implements X11 X-windows graphics and user drivers, maps to wine dlls/winex11.drv
  • win32ss – implements kernel mode counter part of the native graphics driver, a Simple Window Manager (SWM) and a kernel mode USER server.
  • win32csr – implements needed parts of the CSR subsystem along with handling user input

Hacking

Most of the hacking happens in WINENT.DRV and WIN32K.SYS, with very rare fixes to the user32/gdi32 (mainly, because it's a tested Wine's code with only minor changes).

Convention for marking changes. C++ code comments (//) mean that the place has some special mark up for debugging. A typical use is for a

// FIXME: Something

One of the things you may want to mess around with the old code may be swapping out the old wine for a new one, given how many new things they have implemented. For those who are interested, the current code is based on wine 1.3.13 and 1.1.36 depending on which parts you are looking at. The arrangement of dll directories mostly stays the same, but winex11.drv has gone over some rearrangements that might make your job harder. (Some of the REAL cool things, such as newer DX support for games, are outside of the scope of arwinss and should be tried directly on the master branch.)

Potential Benefits

These bugs would be fixed if Arwinss was ready (just a short list):

As one can see from these bug titles it mainly boils down to drastically improved user32 and gdi32 support.

TODO list

See full list of bugs at https://jira.reactos.org/projects/ARWINSS.

  1. Fix redrawing issues (see bug #19) and (see bug #26)
  2. Fix crash that prevents booting in VirtualBox
  3. Fix installer/uninstaller crash (see bug #75)
  4. Fix garbage on desktop after closing some apps (see bug #63)
  5. Fix zoom and tabs in Firefox (see bug #76)
  6. Fix "Window titles are shown as inactive (gray) while being active" (see bug #7)
  7. Fix arwinss related program crashes (see bug #73))
  8. Fix interaction of windows in apps with few windows (see bug #32)
  9. Fix low level input hooks (used for example in DosBox)

Unimplemented/Fixme that appear during work

  1. fixme:(dll\win32\arwinss\winent.drv\userdrv.c:665) RosDrv_SetWindowStyle is UNIMPLEMENTED!
  2. fixme:(dll\win32\arwinss\winent.drv\userdrv.c:642) RosDrv_SetWindowIcon is UNIMPLEMENTED!
  3. (subsystems\win32\win32k_arwinss\wine\queue.c:814) TODO: Check if anyone is waiting on queue is missing!
  4. (subsystems\win32\win32k_arwinss\eng\device.c:927) FIXME: DeviceName is NULL, trying display nr. 1 (TuxRacer)
  5. fixme:(dll\win32\arwinss\winent.drv\userdrv.c:636) RosDrv_SetWindowRgn is UNIMPLEMENTED! (Reget)
  6. fixme:(dll\win32\arwinss\winent.drv\userdrv.c:626) RosDrv_SetLayeredWindowAttributes is UNIMPLEMENTED! (Qutim)
  7. err:(dll\win32\arwinss\winent.drv\gdidrv.c:353) ExtEscape for escape 8 is unimplemented! (SuperTux 0.3.3; ROS text screensaver)
  8. fixme:(dll\win32\arwinss\winent.drv\clipboard.c:2440) NTDRV_CLIPBOARD_IsSelectionOwner is UNIMPLEMENTED! (AbiWord. Notepad++)
  9. fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:451) RosDrv_GetTextExtentExPoint is UNIMPLEMENTED!
  10. fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:609) RosDrv_RealizePalette is UNIMPLEMENTED!
  11. fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:959) RosDrv_UnrealizePalette is UNIMPLEMENTED!
  12. fixme:(dll\win32\arwinss\winent.drv\gdidrv.c:433) RosDrv_GetNearestColor is UNIMPLEMENTED!

Testing

You can get the latest ARWINSS ISO here.

See Also