2009/7/30 Timo Kreuzer <timo.kreuzer(a)web.de>de>:
Aleksey Bragin schrieb:
On Jul 30, 2009, at 12:49 AM, James Tabor wrote:
If I'm not mistaken, we already imported wine code at the beginning
did we not? I'm looking at the commit logs and it does look we
started with wine. We need to keep it separated before it is too late.
Oh it's already too late. Ah, we missed that one.
On Wed, Jul 29, 2009 at 1:10 PM, Ged<gedmurphy(a)gmail.com> wrote:
Current win32 subsystem progress is too slow. We need something
now before
it's too late.
One of the main things that's holing us back and stopping new devs
from
getting involved is out lack of compatibility and stability.
Good reason to keep it separated.
That's what being suggested. However Alex said a different opinion,
that the rewrite could happen in-place. But apriori that takes more
effort, because one needs to take into account compatibility, prevent
breakages (Jim knows how hard it is).
Ripping our win32k out from trunk will not help with it's development. Do
you think we will get more developers that say "yay there's 2 win32
subsystems, that's exactly what I was looking for"? Ripping it apart won't
help. And if there's something that can break trunk, we can do it in a
temprary branch and merge it back as soon as it's ready and tested. Proper
testing is obligatory. But how do you expect probems to be detected when you
don't even have that code in trunk? How do you expect people will fix bugs
in it when the code is somewhere outside trunk? Please stop telling it's an
advantage for win32k devs, cause it's not.
Also: I still don't see where you want to get more stability and
compatibility with that new subsystem. We have some bugs yes, but the major
buggers are still in the kernel. How often does win32k crash and how often
does the kernel crash. Don't blame win32k for everything, instead put your
own house in order first.
Though still I don't see what a "proper" win32 subsystem architecture
means. I know the crystal clear, well thought through, not changed
much over years design of an NT kernel. But with win32 subsystem,
there is no such crystal clearness.
Timo, James - please, tell me your opinions about that. So far, the
only "proper" things from a real win32 subsystem are the win32k
syscall interface (ros still uses its own variant of it, with similar
function names, but different parameters, etc - but that's what being
fixed) and internal structures documented by Timo (great work indeed).
It's fine so far, but having NT API and NDK is not all what's needed
to build a good and proper kernel. There is something called internal
architecture. What do we have of a proper internal architecture in
gdi32, user32 and win32k.sys now in trunk?
P.S. no flamewars please, those are fully valid question, fully
serious, and no offence to anyone is intended.
There's a lot more. The structures and syscall interfaces are just the
bottom. You can use the syscall interfaces for native api testing to make
sure you know what is the kernel's part is and what is gdi/user's part. Then
you can use the structures together with WinDbg and memory dumps and back
traces to do very detailed analysis of the inner workings of functions
without disassembling anything. It tells you where objects are allcoated
from, where objects come from and where they point to. Looking at the symbol
names tells you a great detail of the inner workings, too. I have added
backtraces from font drivers to the wiki. That probably tells you more about
the internal font driver architecture than all books. Combine all these
methods and you get a lot more detailed knowledge about the inner
architecture. The rest is reasoning and extrapolation.
Now let's look at design compared to windows (XP/2003)
There's the gdi handle manager, which is is now working almost identical to
the Windows one. There's shared locks and references that work like on
Windows (not everywhere but getting there). There are still problems but
it's already quite good. It allows us to use the gdi handle viewer tool in
reactos. It also allows loading reactos gdi32 in windows (although it fails
for most things)
There's brushes. The interface between the usermode brushes and the kernel
brushobj and DCs and XLATEOBJs is quite complicated. Just slapping something
together that kinda does it's job for now and improving on it later is what
has been done in our win32k in earlier times. Everone just adds his 5 lines
of fix upon the existing code instead of fixing the implementation
architecture. But that leeds to code that gets more and more bloated and
complicated and slow. I've spend some time fixing it and it should be much
more Windows like now. As a side effect we now have support for DC pen/brush
and for the first time allows display drivers to use their own brushes
instead of failing miserably.
Let's look at the Window structures. We use a combination of a kernel
structure and a usermode structure. This result of "let's do it our own
way"
is leading to null pointer dereferences, memory leaks and whatever. Jim
currently makes good progress in this area so that I expect this mess to be
cleaned up soon. This will be a premise to do proper fixing of the Winpos
code that is very buggy.
FYI, SMWP has started, once I get menu/item converted
after class/windows.
Let's look at the sysparams: Our earlier
implementation was huge, bloated,
incomplete and it would have been simply impossible to fix it. So I spent
quite some time in analyzing how it works on windows and rewriting it. It
turned out that we were storing certain variables in absurd locations. It's
still not 100% right, but I'm quite certain that the current design is good
enough to work out in the future.
What is the advantage of this?
Doing it "your own way", ignoring everything you know about the Win32
subsystem, hacking hacks upon hacks, reusing large portions of 3rd party
code without understanding the inner workings might actually get you some
working subsystem in the short run (although this still remains to be seen).
But it will most likely also result in duplicated work later. At some point
you'll notice: Ohh crap, this all doesn't work out like it should. Why that?
Rewrite #7!
On the other hand, using all pieces of knowledge about how it works on
Windows will help to make sure that the code will work correctly even later
with parts and details you didn't yet take care of. As soon as you know how
something works on Windows especially how things are interrelated, you're
free to change whatever detail is neccessary/useful. But you shouldn't think
you're smarter than all the ms devs if you don't understand how that stuff
works on windows.
Regards,
Timo
I agree!
If anyone (Also the Orig Devs) bothered to do the proper research and
read the books published and some are available online, you will "GET
IT". I wrote this into the code so anyone with good programming skills
can pick this up. Read my code it's there and it's getting better
since we started placing comments in there. Reason, some do not know
how to read music.
The only way a nebie can get their feet wet is to dig into the code
and read. Hooking a wire to your head at night will not help you "GET
IT".
Class work:
Kernel space and User space, why? Compare the number of callbacks,
advantages and disadvantages, why ReactOS is faster in this relation.
James