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).