Author: ion
Date: Mon Feb 20 06:43:54 2012
New Revision: 55735
URL:
http://svn.reactos.org/svn/reactos?rev=55735&view=rev
Log:
[NTOSKRNL]: MOV CRX, YYY and MOV YYY, CRX, as well as the DR equivalents were not
correctly detected as privileged instructions in the GPF handler. Fixes Winetests.
[NTOSKRNL]: The "Write" bit in the x86 Error Code is not bit 1, it is bit 2. Fix
all the GPF handlers to check for bit 2 instead when determining if an exception was due
to read or write. Fixes Winetests.
I'll say it nicely this time for Timo: when you rewrite ASM, do it carefully :)
Modified:
trunk/reactos/ntoskrnl/ke/i386/traphdlr.c
Modified: trunk/reactos/ntoskrnl/ke/i386/traphdlr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/traphdlr.…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] Mon Feb 20 06:43:54 2012
@@ -970,6 +970,12 @@
}
/* Check for privileged instructions */
+ DPRINT("Instruction (%d) at fault: %lx %lx %lx %lx\n",
+ i,
+ Instructions[i],
+ Instructions[i + 1],
+ Instructions[i + 2],
+ Instructions[i + 3]);
if (Instruction == 0xF4) // HLT
{
/* HLT is privileged */
@@ -988,10 +994,11 @@
(Instructions[i + 1] == 0x08) || // INVD
(Instructions[i + 1] == 0x09) || // WBINVD
(Instructions[i + 1] == 0x35) || // SYSEXIT
- (Instructions[i + 1] == 0x26) || // MOV DR, XXX
+ (Instructions[i + 1] == 0x21) || // MOV DR, XXX
(Instructions[i + 1] == 0x06) || // CLTS
(Instructions[i + 1] == 0x20) || // MOV CR, XXX
- (Instructions[i + 1] == 0x24) || // MOV YYY, DR
+ (Instructions[i + 1] == 0x22) || // MOV XXX, CR
+ (Instructions[i + 1] == 0x23) || // MOV YYY, DR
(Instructions[i + 1] == 0x30) || // WRMSR
(Instructions[i + 1] == 0x33)) // RDPMC
// INVLPG, INVLPGA, SYSRET
@@ -1192,7 +1199,7 @@
KeBugCheckWithTf(IRQL_NOT_LESS_OR_EQUAL,
Cr2,
-1,
- TrapFrame->ErrCode & 1,
+ TrapFrame->ErrCode & 2 ? TRUE : FALSE,
TrapFrame->Eip,
TrapFrame);
}
@@ -1254,7 +1261,7 @@
/* This status code is repurposed so we can recognize it later */
KiDispatchException2Args(KI_EXCEPTION_ACCESS_VIOLATION,
TrapFrame->Eip,
- TrapFrame->ErrCode & 1,
+ TrapFrame->ErrCode & 2 ? TRUE : FALSE,
Cr2,
TrapFrame);
}
@@ -1264,7 +1271,7 @@
/* These faults only have two parameters */
KiDispatchException2Args(Status,
TrapFrame->Eip,
- TrapFrame->ErrCode & 1,
+ TrapFrame->ErrCode & 2 ? TRUE : FALSE,
Cr2,
TrapFrame);
}
@@ -1273,7 +1280,7 @@
KiDispatchExceptionFromTrapFrame(STATUS_IN_PAGE_ERROR,
TrapFrame->Eip,
3,
- TrapFrame->ErrCode & 1,
+ TrapFrame->ErrCode & 2 ? TRUE : FALSE,
Cr2,
Status,
TrapFrame);