Hartmut Birr wrote:
The ReactOS code and the WinXP code is nearly the same.
As a matter of fact, it is, although more similar to the Win2K3 code.
The stack check
and the invalid opcode exception is equal.
Yes, when I analyzed the fast call code (yes I looked at disassembly) I
saw that check, and I copied it.
Note however, that there is only one way to check the stack: cmp ebp,
esp. Unless you want to consider cmp esp, ebp as an alternate method.
The trap frame is created in
the same sequence.
You can only create a trap frame in one way, it has a defined layout. I
point out a difference which proves I don't just copy/paste code.
Somewhere in the handler, windows does this:
mov ecx, fs:[0]
push ecx
My code does simply:
push fs:[0]
I would also like to point out that unlike certain code which I've found
in ReactOS (The old ftol implementation comes to mind) which comes from
assembly, my code is clearly commented, organized and structured, and
shows that I know what I was doing any not merely copy/pasting some
assembly. This is much unlike the old ftol code, which was simply an
exact 100% duplicate of the windows code, with 0 comments and using
hardcoded values which were not explained (clearly showing that the
implementer had no idea of what the code did).
The debug mark 0xbadb0d00 is the same.
Yes, this is the debug mark found in windows KTRAP_FRAMES. It is a known
value to any kernel/system developer for Windows that has analyzed many
crashdumps.
On other
places we use always something like 0xdeadbeef or 0xceadbeef.
Wow, nice argument. Do you realize that 0xdeadbeef is what *windows*
uses for memory that has been freed, and 0xceadbeef for memory that
hasn't been used yet (or something according to those lines)? So you're
saying "0xbadb0d00 is bad because Windows uses it..but 0xdeadbeef is
good because..Windows uses it"?
Each
revision of syscall.S makes our code closer to the Windows code.
On the contrary, the syscall.S code was written by myself about a year
and a half ago, and contained some parts of the code which I had copied
without fully understanding their use (not from Windows, but from
crazylord/elicz). After more then a year has passed, I finally got a
much deeper understanding of all the intricacies involved, and started
using more constants instead of hardcoded definitions, started adding
more comments, and turned raw binary code into complex generic macros
which could generate the code we wanted. I very much doubt that when you
look at KiServiceExit in IDA you see the sequence of comments and macros
that I've created. The fact I've been able to make everything much more
generic and controlled only proves the fact that the implementation is
mine much more then a copy/paste job. And yes, for the record, I fully
admit that some parts (which I want to point out were written 18 months
ago) were copied from elicz's disasembly. But when we are talkig about
system-level assembly, there aren't 10 ways to do something, except to
use different registers and pretend to be different. And another thing,
3 of the DBG checks that I added are becaused I noticed them during a
late-nite debugging session in WinDBG. I was trying a user-mode kernel
exploit which modified the trap frame, and this led to some int3s in the
code. I noticed that some checks were being done (sanity checks, not
anything functional), and I added them in ReactOS too.
In some
days we have exactly the same binary code.
As I said, the code hasn't changed much since its original
implementation more then a year ago. Since then, 90% of the chances made
the code more compact in source-form, added comments, generalized it and
made it accesible through macros.
I know that the frame,
KTHREAD and the PCR layout is predefined. Some of the used informations
are not public.
I'd like to know what isn't public and that we're using. When my
debugger hits an assertion in some code, it becomes public that "Windows
checks if a == b". Because that check is a public check, it's visible by
anyone hitting it.
In my opinion, the fast call entry code is copied step
by step from the disassembled Windows code.
I've addressed this already. I think your reaction (to remove your name)
and to post messages about "honour" was more then excessive and was more
dramatic then anything. Removing your name from ReactOS does not change
the fact you wrote that code, and your name would be added back anyways
as a copyright owner, unless of course you want to make it "Public
Domain". So unfortunately, I don't see your reaction of removing your
name as anything else but a PR coup. Even if had the entire code
actually been copied, you should've at least e-mailed the person
responsible/project, talked things out and gotten an explanation. I hope
you don't take this offensively, but I simply think your reaction was
excessive and dramatic. And the reason I'm saying this is because I've
had similar reactions in the past in this project, and I've learnt from
others that they don't achieve much (I would like to thank KJK for this :))
- Hartmut
Best regards,
Alex Ionescu
PS. I apologize for my lack of presence in the matter. I have re-started
school and I have almost no time anymore to read emails or participate
much in ReactOS for the next months, which is why I wanted to finish up
some commits these last two weeks. For any urgent matters, please email
me directly (thank you Royce).