[AUDIT]
authorAleksey Bragin <aleksey@reactos.org>
Sat, 20 May 2006 10:39:53 +0000 (10:39 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Sat, 20 May 2006 10:39:53 +0000 (10:39 +0000)
- Unlock source code files containing only stubs
- Add missing programmers name to the file headers
- SVN properties maintenance

svn path=/trunk/; revision=21946

12 files changed:
reactos/ntoskrnl/fs/context.c
reactos/ntoskrnl/fs/oplock.c
reactos/ntoskrnl/fs/pool.c
reactos/ntoskrnl/fs/tunnel.c
reactos/ntoskrnl/fs/unc.c
reactos/ntoskrnl/include/internal/i386/asmmacro.S
reactos/ntoskrnl/include/internal/i386/v86m.h
reactos/ntoskrnl/include/ntoskrnl.h [changed mode: 0755->0644]
reactos/ntoskrnl/tests/tests/VirtualMemory.c
reactos/regtests/regtests/regtests.c [changed mode: 0755->0644]
reactos/regtests/shared/regtests.c [changed mode: 0755->0644]
reactos/regtests/shared/regtests.h [changed mode: 0755->0644]

index eedc1ab..dd52d23 100644 (file)
@@ -22,7 +22,7 @@
  * @unimplemented
  */
 NTSTATUS
-STDCALL
+NTAPI
 FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
                             IN PFSRTL_PER_STREAM_CONTEXT Ptr)
 {
@@ -34,7 +34,7 @@ FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
  * @unimplemented
  */
 PFSRTL_PER_STREAM_CONTEXT
-STDCALL
+NTAPI
 FsRtlRemovePerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
                             IN PVOID OwnerId OPTIONAL,
                             IN PVOID InstanceId OPTIONAL)
@@ -47,7 +47,7 @@ FsRtlRemovePerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
  * @unimplemented
  */
 NTSTATUS
-STDCALL
+NTAPI
 FsRtlInsertPerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
                                 IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr)
 {
@@ -59,7 +59,7 @@ FsRtlInsertPerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectConte
  * @unimplemented
  */
 PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
-STDCALL
+NTAPI
 FsRtlRemovePerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
                                 IN PVOID OwnerId OPTIONAL,
                                 IN PVOID InstanceId OPTIONAL)
@@ -72,7 +72,7 @@ FsRtlRemovePerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectConte
  * @unimplemented
  */
 VOID
-STDCALL
+NTAPI
 FsRtlTeardownPerStreamContexts(IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader)
 {
     UNIMPLEMENTED;
index 652813f..5eef0f3 100644 (file)
@@ -5,7 +5,8 @@
  * FILE:            ntoskrnl/fs/oplock.c
  * PURPOSE:         No purpose listed.
  *
- * PROGRAMMERS:     No programmer listed.
+ * PROGRAMMERS:     Emanuele Aliberti
+ *                  Eric Kohl
  */
 
 #include <ntoskrnl.h>
@@ -23,7 +24,8 @@
  *
  * @unimplemented
  */
-NTSTATUS STDCALL
+NTSTATUS
+NTAPI
 FsRtlCheckOplock(IN POPLOCK Oplock,
                 IN PIRP Irp,
                 IN PVOID Context,
@@ -46,7 +48,8 @@ FsRtlCheckOplock(IN POPLOCK Oplock,
  *
  * @unimplemented
  */
-BOOLEAN STDCALL
+BOOLEAN
+NTAPI
 FsRtlCurrentBatchOplock(IN POPLOCK Oplock)
 {
   return(FALSE);
@@ -68,7 +71,8 @@ FsRtlCurrentBatchOplock(IN POPLOCK Oplock)
  *
  * @implemented
  */
-VOID STDCALL
+VOID
+NTAPI
 FsRtlInitializeOplock(IN OUT POPLOCK Oplock)
 {
 }
@@ -86,7 +90,8 @@ FsRtlInitializeOplock(IN OUT POPLOCK Oplock)
  *
  * @unimplemented
  */
-NTSTATUS STDCALL
+NTSTATUS
+NTAPI
 FsRtlOplockFsctrl(IN POPLOCK Oplock,
                  IN PIRP Irp,
                  IN ULONG OpenCount)
@@ -107,7 +112,8 @@ FsRtlOplockFsctrl(IN POPLOCK Oplock,
  *
  * @unimplemented
  */
-BOOLEAN STDCALL
+BOOLEAN
+NTAPI
 FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock)
 {
   return(FALSE);
@@ -126,7 +132,8 @@ FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock)
  *
  * @implemented
  */
-VOID STDCALL
+VOID
+NTAPI
 FsRtlUninitializeOplock(IN POPLOCK Oplock)
 {
 }
index 0dc15b9..4833f7d 100644 (file)
@@ -27,7 +27,7 @@
  * @implemented
  */
 PVOID
-STDCALL
+NTAPI
 FsRtlAllocatePool (
        IN      POOL_TYPE       PoolType,
        IN      ULONG           NumberOfBytes
@@ -64,7 +64,7 @@ FsRtlAllocatePool (
  * @implemented
  */
 PVOID
-STDCALL
+NTAPI
 FsRtlAllocatePoolWithQuota (
        IN      POOL_TYPE       PoolType,
        IN      ULONG           NumberOfBytes
@@ -98,7 +98,7 @@ FsRtlAllocatePoolWithQuota (
  * @implemented
  */
 PVOID
-STDCALL
+NTAPI
 FsRtlAllocatePoolWithQuotaTag (
        IN      POOL_TYPE       PoolType,
        IN      ULONG           NumberOfBytes,
@@ -133,7 +133,7 @@ FsRtlAllocatePoolWithQuotaTag (
  * @implemented
  */
 PVOID
-STDCALL
+NTAPI
 FsRtlAllocatePoolWithTag (
        IN      POOL_TYPE       PoolType,
        IN      ULONG           NumberOfBytes,
index 92e4dfd..07765c9 100644 (file)
@@ -5,7 +5,7 @@
  * FILE:            ntoskrnl/fs/tunnel.c
  * PURPOSE:         No purpose listed.
  *
- * PROGRAMMERS:     No programmer listed.
+ * PROGRAMMERS:     Emanuele Aliberti
  */
 
 #include <ntoskrnl.h>
index d1ad29c..cac08ba 100644 (file)
@@ -5,15 +5,16 @@
  * FILE:            ntoskrnl/fs/unc.c
  * PURPOSE:         No purpose listed.
  *
- * PROGRAMMERS:     No programmer listed.
+ * PROGRAMMERS:     Emanuele Aliberti
+ *                  Eric Kohl
  */
 
 #include <ntoskrnl.h>
 
 
 /**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlDeregisterUncProvider@4
+ * NAME                             EXPORTED
+ *  FsRtlDeregisterUncProvider@4
  *
  * DESCRIPTION
  *
  *
  * @unimplemented
  */
-VOID STDCALL
+VOID
+NTAPI
 FsRtlDeregisterUncProvider(IN HANDLE Handle)
 {
 }
 
 
 /**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlRegisterUncProvider@12
+ * NAME                             EXPORTED
+ *  FsRtlRegisterUncProvider@12
  *
  * DESCRIPTION
  *
@@ -41,12 +43,13 @@ FsRtlDeregisterUncProvider(IN HANDLE Handle)
  *
  * @unimplemented
  */
-NTSTATUS STDCALL
+NTSTATUS
+NTAPI
 FsRtlRegisterUncProvider(IN OUT PHANDLE Handle,
-                        IN PUNICODE_STRING RedirectorDeviceName,
-                        IN BOOLEAN MailslotsSupported)
+                         IN PUNICODE_STRING RedirectorDeviceName,
+                         IN BOOLEAN MailslotsSupported)
 {
-  return(STATUS_NOT_IMPLEMENTED);
+    return(STATUS_NOT_IMPLEMENTED);
 }
 
 
index 3e60f78..9d1384e 100644 (file)
-/*\r
- * COPYRIGHT:       See COPYING in the top level directory\r
- * PROJECT:         ReactOS Kernel\r
- * FILE:            ntoskrnl/include/i386/asmmacro.S\r
- * PURPOSE:         Assembly Macros for Spinlocks and common Trap Code\r
- * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)\r
- */\r
\r
-/* INCLUDES ******************************************************************/\r
-\r
-#include <ndk/asm.h>\r
-\r
-// Arguments for TRAP_EPILOG\r
-#define FromSystemCall              1\r
-#define DoRestorePreviousMode       1\r
-#define DoRestoreEverything         1\r
-#define DoRestoreSegments           1\r
-#define DoRestoreVolatiles          1\r
-#define NotFromSystemCall           0\r
-#define DoNotRestorePreviousMode    0\r
-#define DoNotRestoreEverything      0\r
-#define DoNotRestoreSegments        0\r
-#define DoNotRestoreVolatiles       0\r
-\r
-// Arguments for idt\r
-#define INT_32_DPL0                 0x8E00\r
-#define INT_32_DPL3                 0xEE00\r
-\r
-.intel_syntax noprefix\r
-\r
-//\r
-// These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is,\r
-// they will not be compiled into non-SMP builds. Usage is as follows:\r
-//\r
-// .BeginYourFunction\r
-//      mov reg, lockaddr\r
-//      ACQUIRE_SPINLOCK(reg, .spin)\r
-//      <thread-safe code here>\r
-//      RELEASE_SPINLOCK(reg)\r
-//      <misc code here>\r
-//  retn\r
-//  #IFDEF CONFIG_SMP\r
-//  .spin\r
-//      <any necessary steps to be able to jump back safely>\r
-/       SPIN_ON_LOCK(reg, .BeginYourFunction)\r
-//  #ENDIF\r
-//\r
-#ifdef CONFIG_SMP\r
-#define LOCK lock\r
-#define ACQUIRE_SPINLOCK(x, y) \\r
-    lock bts dword ptr [x], 0; \\r
-    jb y\r
-#define RELEASE_SPINLOCK(x) mov byte ptr [x], 0\r
-#define SPIN_ON_LOCK(x, y) \\r
-1: \\r
-    test dword ptr [x], 1; \\r
-    jz y; \\r
-    pause; \\r
-    jmp 1b\r
-#else\r
-#define LOCK\r
-#define ACQUIRE_SPINLOCK(x, y)\r
-#define RELEASE_SPINLOCK(x) \r
-#endif\r
-\r
-//\r
-// @name SET_TF_DEBUG_HEADER\r
-//\r
-// This macro sets up the debug header in the trap frame.\r
-//\r
-// @param None.\r
-//\r
-// @remark ebp = PKTRAP_FRAME.\r
-//         edi/ebx = Have been saved and can be used.\r
-//\r
-.macro idt Handler, Bits\r
-    .long \Handler\r
-    .short \Bits\r
-    .short KGDT_R0_CODE\r
-.endm\r
-\r
-//\r
-// @name SET_TF_DEBUG_HEADER\r
-//\r
-// This macro sets up the debug header in the trap frame.\r
-//\r
-// @param None.\r
-//\r
-// @remark ebp = PKTRAP_FRAME.\r
-//         edi/ebx = Have been saved and can be used.\r
-//\r
-.macro SET_TF_DEBUG_HEADER\r
-    /* Get the Debug Trap Frame EBP/EIP */\r
-    mov ebx, [ebp+KTRAP_FRAME_EBP]\r
-    mov edi, [ebp+KTRAP_FRAME_EIP]\r
-\r
-    /* Write the debug data */\r
-    mov [ebp+KTRAP_FRAME_DEBUGPOINTER], edx\r
-    mov dword ptr [ebp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00\r
-    mov [ebp+KTRAP_FRAME_DEBUGEBP], ebx\r
-    mov [ebp+KTRAP_FRAME_DEBUGEIP], edi\r
-.endm\r
-\r
-//\r
-// @name CHECK_FOR_APC_DELIVER\r
-// \r
-// This macro checks if the trapframe indicates a return to user-mode,\r
-// and, if so, checks if user-mode APCs should be delivered.\r
-//\r
-// @param PreserveEax\r
-//        Determines if EAX should be preserved. Implies that the segment\r
-//        registers will also be saved.\r
-//\r
-// @remark ebp = PKTRAP_FRAME.\r
-//         ebx = Saved and will be used.\r
-//\r
-.macro CHECK_FOR_APC_DELIVER PreserveEax\r
-    /* Check for V86 mode */\r
-    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK\r
-    jnz 1f\r
-\r
-    /* Deliver APCs only if we were called from user mode */\r
-    test byte ptr [ebp+KTRAP_FRAME_CS], 1\r
-    je 2f\r
-\r
-    /* Get the current thread */\r
-1:\r
-    mov ebx, [fs:KPCR_CURRENT_THREAD]\r
-\r
-    /* Make it non-alerted */\r
-    mov byte ptr [ebx+KTHREAD_ALERTED], 0\r
-\r
-    /* And only if any are actually pending */\r
-    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0\r
-    je 2f\r
-\r
-    /* Save pointer to Trap Frame */\r
-    mov ebx, ebp\r
-\r
-.if \PreserveEax\r
-    /* Save some stuff that raising IRQL will kill */\r
-    mov [ebx+KTRAP_FRAME_EAX], eax\r
-    mov dword ptr [ebx+KTRAP_FRAME_FS], KGDT_R3_TEB + RPL_MASK\r
-    mov dword ptr [ebx+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK\r
-    mov dword ptr [ebx+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK\r
-    mov dword ptr [ebx+KTRAP_FRAME_GS], 0\r
-.endif\r
-\r
-    /* Raise IRQL to APC_LEVEL */\r
-    mov ecx, 1\r
-    call @KfRaiseIrql@4\r
-\r
-    /* Save old IRQL */\r
-    push eax\r
-\r
-    /* Deliver APCs */\r
-    sti\r
-    push ebx\r
-    push 0\r
-    push UserMode\r
-    call _KiDeliverApc@12\r
-\r
-    /* Return to old IRQL */\r
-    pop ecx\r
-    call @KfLowerIrql@4\r
-\r
-    /* Restore EAX (only in volatile case) */\r
-.if \PreserveEax\r
-    mov eax, [ebx+KTRAP_FRAME_EAX]\r
-.endif\r
-    cli\r
-    jmp 1b\r
-2:\r
-.endm\r
-\r
-//\r
-// @name TRAP_PROLOG\r
-// \r
-// This macro creates a standard trap entry prologue.\r
-// It should be used for entry into any kernel trap (KiTrapXx), but not for\r
-// system calls, which require special handling.\r
-//\r
-// @param Label\r
-//        Identifying name of the caller function; will be used to append\r
-//        to the name V86 and DR helper functions, which must already exist.\r
-//\r
-// @remark Use as follows:\r
-//          _KiTrap00:\r
-//              /* Push fake error code */\r
-//              push 0\r
-//\r
-//              /* Enter common prologue */\r
-//              TRAP_PROLOG(0)\r
-//\r
-//              /* Handle trap */\r
-//              <Your Trap Code Here>\r
-//\r
-#define TRAP_PROLOG(Label) \\r
-    /* Just to be safe, clear out the HIWORD, since it's reserved */ \\r
-    mov word ptr [esp+2], 0; \\r
-\\r
-    /* Save the non-volatiles */ \\r
-    push ebp; \\r
-    push ebx; \\r
-    push esi; \\r
-    push edi; \\r
-\\r
-    /* Save FS and set it to PCR */ \\r
-    push fs; \\r
-    mov ebx, KGDT_R0_PCR; \\r
-    mov fs, bx; \\r
-\\r
-    /* Save exception list and bogus previous mode */ \\r
-    push fs:[KPCR_EXCEPTION_LIST]; \\r
-    push -1; \\r
-\\r
-    /* Save volatiles and segment registers */ \\r
-    push eax; \\r
-    push ecx; \\r
-    push edx; \\r
-    push ds; \\r
-    push es; \\r
-    push gs; \\r
-\\r
-    /* Set the R3 data segment */ \\r
-    mov ax, KGDT_R3_DATA + RPL_MASK; \\r
-\\r
-    /* Skip debug registers and debug stuff */ \\r
-    sub esp, 0x30; \\r
-\\r
-    /* Load the segment registers */ \\r
-    mov ds, ax; \\r
-    mov es, ax; \\r
-\\r
-    /* Set up frame */ \\r
-    mov ebp, esp; \\r
-\\r
-    /* Check if this was from V86 Mode */ \\r
-    /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK; */ \\r
-    /* jnz V86_Label; */ \\r
-\\r
-    /* Get current thread */ \\r
-    mov ecx, [fs:KPCR_CURRENT_THREAD]; \\r
-    cld; \\r
-\\r
-    /* Flush DR7 */ \\r
-    and dword ptr [ebp+KTRAP_FRAME_DR7], 0; \\r
-\\r
-    /* Check if the thread was being debugged */ \\r
-    /* test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF; */ \\r
-    /* jnz Dr_Label; */ \\r
-\\r
-    /* Set the Trap Frame Debug Header */ \\r
-    SET_TF_DEBUG_HEADER\r
-\r
-//\r
-// @name SYSCALL_PROLOG\r
-// \r
-// This macro creates a system call entry prologue.\r
-// It should be used for entry into any fast-system call (KiGetTickCount,\r
-// KiCallbackReturn, KiRaiseAssertion) and the generic system call handler\r
-// (KiSystemService)\r
-//\r
-// @param Label\r
-//        Unique label identifying the name of the caller function; will be\r
-//        used to append to the name of the DR helper function, which must\r
-//        already exist.\r
-//\r
-// @remark None.\r
-//\r
-.macro SYSCALL_PROLOG\r
-    /* Create a trap frame */\r
-    push 0\r
-    push ebp\r
-    push ebx\r
-    push esi\r
-    push edi\r
-    push fs\r
-\r
-    /* Load PCR Selector into fs */\r
-    mov ebx, KGDT_R0_PCR\r
-    mov fs, bx\r
-\r
-    /* Get a pointer to the current thread */\r
-    mov esi, [fs:KPCR_CURRENT_THREAD]\r
-\r
-    /* Save the previous exception list */\r
-    push [fs:KPCR_EXCEPTION_LIST]\r
-\r
-    /* Set the exception handler chain terminator */\r
-    mov dword ptr [fs:KPCR_EXCEPTION_LIST], -1\r
-\r
-    /* Save the old previous mode */\r
-    push ss:[esi+KTHREAD_PREVIOUS_MODE]\r
-\r
-    /* Skip the other registers */\r
-    sub esp, 0x48\r
-\r
-    /* Hack: it seems that on VMWare someone damages ES/DS on exit. Investigate! */\r
-    mov [esp+KTRAP_FRAME_DS], ds\r
-    mov [esp+KTRAP_FRAME_ES], es\r
-\r
-    /* Set the new previous mode based on the saved CS selector */\r
-    mov ebx, [esp+0x6C]\r
-    and ebx, 1\r
-    mov byte ptr ss:[esi+KTHREAD_PREVIOUS_MODE], bl\r
-\r
-    /* Go on the Kernel stack frame */\r
-    mov ebp, esp\r
-\r
-    /* Save the old trap frame pointer where EDX would be saved */\r
-    mov ebx, [esi+KTHREAD_TRAP_FRAME]\r
-    mov [ebp+KTRAP_FRAME_EDX], ebx\r
-\r
-    /* Flush DR7 */\r
-    and dword ptr [ebp+KTRAP_FRAME_DR7], 0\r
-\r
-    /* Check if the thread was being debugged */\r
-    test byte ptr [esi+KTHREAD_DEBUG_ACTIVE], 0xFF\r
-\r
-    /* Set the thread's trap frame and clear direction flag */\r
-    mov [esi+KTHREAD_TRAP_FRAME], ebp\r
-    cld\r
-\r
-    /* Save DR registers if needed */\r
-    //jnz Dr_kss_&Label\r
-\r
-    /* Set the trap frame debug header */\r
-    SET_TF_DEBUG_HEADER\r
-\r
-#ifdef DBG // FIXME: Is this for GDB? Can it be moved in the stub?\r
-    /*\r
-     * We want to know the address from where the syscall stub was called.\r
-     * If PrevMode is KernelMode, that address is stored in our own (kernel)\r
-     * stack, at location KTRAP_FRAME_ESP.\r
-     * If we're coming from UserMode, we load the usermode stack pointer\r
-     * and go back two frames (first frame is the syscall stub, second call\r
-     * is the caller of the stub).\r
-     */\r
-    mov edi, [ebp+KTRAP_FRAME_ESP]\r
-    test byte ptr [esi+KTHREAD_PREVIOUS_MODE], 0x01\r
-    jz 0f\r
-    mov edi, [edi+4]\r
-0:\r
-    mov [ebp+KTRAP_FRAME_DEBUGEIP], edi\r
-#endif\r
-\r
-    /* Enable interrupts */\r
-    sti\r
-.endm\r
-\r
-//\r
-// @name TRAP_EPILOG\r
-// \r
-// This macro creates an epilogue for leaving any system trap.\r
-// It is used for exiting system calls, exceptions, interrupts and generic\r
-// traps.\r
-//\r
-// @param SystemCall\r
-//        Specifies whether this trap will exit a system call. If so, special\r
-//        code will be assembled to potentially use SYSEXIT instead of IRETD.\r
-//\r
-// @param RestorePreviousMode\r
-//        Specifies if the previous mode should be restored.\r
-//\r
-// @param RestoreSegments\r
-//        Specifies if the segment registers should be restored.\r
-//\r
-// @param RestoreVolatiles\r
-//        Specifies if the volatile registers should be restored.\r
-//\r
-// @param RestoreAllRegs\r
-//        Specifies if volatiles and segments should both be restored.\r
-//\r
-// @remark\r
-//\r
-.macro TRAP_EPILOG SystemCall, RestorePreviousMode, RestoreSegments, RestoreVolatiles, RestoreAllRegs\r
-#ifdef DBG\r
-    /* Assert the flags */\r
-    pushfd\r
-    pop edx\r
-    test edx, EFLAGS_INTERRUPT_MASK\r
-    jnz 1f\r
-\r
-    /* Assert the stack */\r
-    cmp esp, ebp\r
-    jnz 1f\r
-\r
-    /* Assert the trap frame */\r
-0:\r
-    //sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00\r
-    //jnz 2f\r
-\r
-    /* Assert FS */\r
-    mov bx, fs\r
-    cmp bx, KGDT_R0_PCR\r
-    jnz 1f\r
-\r
-    /* Assert exception list */\r
-    cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0\r
-    jnz 4f\r
-2:\r
-    add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00\r
-1:\r
-    int 3\r
-    jmp 0b\r
-4:\r
-#endif\r
-\r
-    /* Get exception list */\r
-    mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]\r
-\r
-#ifdef DBG\r
-    /* Assert the saved exception list */\r
-    or edx, edx\r
-    jnz 5f\r
-    int 3\r
-5:\r
-#endif\r
-\r
-    /* Restore it */\r
-    mov [fs:KPCR_EXCEPTION_LIST], edx\r
-\r
-.if \RestorePreviousMode\r
-    /* Get previous mode */\r
-    mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE]\r
-\r
-#ifdef DBG\r
-    /* Assert the saved previous mode */\r
-    cmp ecx, -1\r
-    jnz 6f\r
-    int 3\r
-6:\r
-#endif\r
-\r
-    /* Restore the previous mode */\r
-    mov esi, [fs:KPCR_CURRENT_THREAD]\r
-    mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl\r
-.endif\r
-\r
-    /* Check for V86 */\r
-    test dword ptr [esp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK\r
-    jnz V86_Exit\r
-\r
-    /* Check if the frame was edited */\r
-    test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED\r
-    jz 7f\r
-\r
-.ifeq \RestoreAllRegs\r
-    /* Check the old mode */\r
-    cmp word ptr [esp+KTRAP_FRAME_CS], KGDT_R3_CODE + RPL_MASK\r
-    bt word ptr [esp+KTRAP_FRAME_CS], 0\r
-    cmc\r
-    ja 8f\r
-.endif\r
-\r
-.if \RestoreVolatiles\r
-    /* Restore volatiles */\r
-    mov edx, [esp+KTRAP_FRAME_EDX]\r
-    mov ecx, [esp+KTRAP_FRAME_ECX]\r
-    mov eax, [esp+KTRAP_FRAME_EAX]\r
-.endif\r
-\r
-    /* Check if we were called from kernel mode */\r
-    cmp dword ptr [ebp+KTRAP_FRAME_CS], KGDT_R0_CODE\r
-    jz 9f\r
-\r
-.if \RestoreSegments\r
-    /* Restore segment registers */\r
-    lea esp, [ebp+KTRAP_FRAME_GS]\r
-    pop gs\r
-    pop es\r
-    pop ds\r
-.endif\r
-\r
-    /* Restore FS */\r
-3:\r
-    lea esp, [ebp+KTRAP_FRAME_FS]\r
-    pop fs\r
-\r
-9:\r
-    /* Skip debug information and unsaved registers */\r
-    lea esp, [ebp+KTRAP_FRAME_EDI]\r
-    pop edi\r
-    pop esi\r
-    pop ebx\r
-    pop ebp\r
-\r
-    /* Check for ABIOS */\r
-    cmp word ptr [esp+8], 0x80\r
-    ja AbiosExit\r
-\r
-    /* Pop error code */\r
-    add esp, 4\r
-\r
-.if \SystemCall\r
-    /* Check if previous CS is from user-mode */\r
-    test dword ptr [esp+4], 1\r
-\r
-    /* It is, so use Fast Exit */\r
-    jnz FastExit\r
-\r
-    /* Jump back to stub */\r
-    pop edx\r
-    pop ecx\r
-    popf\r
-    jmp edx\r
-\r
-.ret:\r
-.endif\r
-    iret\r
-\r
-.if \SystemCall\r
-FastExit:\r
-    /* Is SYSEXIT Supported/Wanted? */\r
-    cmp dword ptr ss:[_KiFastSystemCallDisable], 0\r
-    jnz .ret\r
-    test dword ptr [esp+8], EFLAGS_TF\r
-    jnz .ret\r
-\r
-    /* Restore FS to TIB */\r
-    mov ecx, KGDT_R3_TEB + RPL_MASK\r
-    mov fs, ecx\r
-\r
-    /* We will be cleaning up the stack ourselves */\r
-    pop edx                                 /* New Ring 3 EIP */\r
-    add esp, 4                              /* Skip Ring 3 DS */\r
-    and dword ptr [esp], 0xfffffdff         /* Remove EFLAGS_INTERRUPT_MASK from EFLAGS */\r
-    popf                                    /* Restore old EFLAGS */\r
-    pop ecx                                 /* Old Ring 3 SS:ESP */\r
-\r
-    /*\r
-     * At this point:\r
-     *     ECX points to the old User Stack.\r
-     *     EDX points to the instruction to execute in usermode after the sysenter\r
-     */\r
-    sti\r
-    sysexit\r
-.endif\r
-\r
-8:\r
-    /* Restore EAX */\r
-    mov eax, [esp+KTRAP_FRAME_EAX]\r
-\r
-    /* Skip registers */\r
-    add esp, 0x30\r
-\r
-    /* Restore segments and volatiles */\r
-    pop gs\r
-    pop es\r
-    pop ds\r
-    pop edx\r
-    pop ecx\r
-\r
-    /* Jump back to mainline code */\r
-    jmp 3b\r
-\r
-7:\r
-    /* Restore real CS value */\r
-    mov ebx, [esp+KTRAP_FRAME_TEMPCS]\r
-    mov [esp+KTRAP_FRAME_CS], ebx\r
-\r
-    /*\r
-     * If ESP was modified, then a special interrupt exit stack\r
-     * must be created to "update" ESP's value in a legal manner\r
-     */\r
-    mov ebx, [esp+KTRAP_FRAME_TEMPESP]\r
-    sub ebx, 0xC\r
-    mov [esp+KTRAP_FRAME_ERROR_CODE], ebx\r
-\r
-    /* Copy Interrupt Stack */\r
-    mov esi, [esp+KTRAP_FRAME_EFLAGS]\r
-    mov [ebx+8], esi\r
-    mov esi, [esp+KTRAP_FRAME_CS]\r
-    mov [ebx+4], esi\r
-    mov esi, [esp+KTRAP_FRAME_EIP]\r
-    mov [ebx], esi\r
-\r
-    /* Return */\r
-    add esp, KTRAP_FRAME_EDI\r
-    pop edi\r
-    pop esi\r
-    pop ebx\r
-    pop ebp\r
-    mov esp, [esp]\r
-    iret\r
-.endm\r
-\r
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Kernel
+ * FILE:            ntoskrnl/include/i386/asmmacro.S
+ * PURPOSE:         Assembly Macros for Spinlocks and common Trap Code
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ */
+/* INCLUDES ******************************************************************/
+
+#include <ndk/asm.h>
+
+// Arguments for TRAP_EPILOG
+#define FromSystemCall              1
+#define DoRestorePreviousMode       1
+#define DoRestoreEverything         1
+#define DoRestoreSegments           1
+#define DoRestoreVolatiles          1
+#define NotFromSystemCall           0
+#define DoNotRestorePreviousMode    0
+#define DoNotRestoreEverything      0
+#define DoNotRestoreSegments        0
+#define DoNotRestoreVolatiles       0
+
+// Arguments for idt
+#define INT_32_DPL0                 0x8E00
+#define INT_32_DPL3                 0xEE00
+
+.intel_syntax noprefix
+
+//
+// These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is,
+// they will not be compiled into non-SMP builds. Usage is as follows:
+//
+// .BeginYourFunction
+//      mov reg, lockaddr
+//      ACQUIRE_SPINLOCK(reg, .spin)
+//      <thread-safe code here>
+//      RELEASE_SPINLOCK(reg)
+//      <misc code here>
+//  retn
+//  #IFDEF CONFIG_SMP
+//  .spin
+//      <any necessary steps to be able to jump back safely>
+/       SPIN_ON_LOCK(reg, .BeginYourFunction)
+//  #ENDIF
+//
+#ifdef CONFIG_SMP
+#define LOCK lock
+#define ACQUIRE_SPINLOCK(x, y) \
+    lock bts dword ptr [x], 0; \
+    jb y
+#define RELEASE_SPINLOCK(x) mov byte ptr [x], 0
+#define SPIN_ON_LOCK(x, y) \
+1: \
+    test dword ptr [x], 1; \
+    jz y; \
+    pause; \
+    jmp 1b
+#else
+#define LOCK
+#define ACQUIRE_SPINLOCK(x, y)
+#define RELEASE_SPINLOCK(x) 
+#endif
+
+//
+// @name SET_TF_DEBUG_HEADER
+//
+// This macro sets up the debug header in the trap frame.
+//
+// @param None.
+//
+// @remark ebp = PKTRAP_FRAME.
+//         edi/ebx = Have been saved and can be used.
+//
+.macro idt Handler, Bits
+    .long \Handler
+    .short \Bits
+    .short KGDT_R0_CODE
+.endm
+
+//
+// @name SET_TF_DEBUG_HEADER
+//
+// This macro sets up the debug header in the trap frame.
+//
+// @param None.
+//
+// @remark ebp = PKTRAP_FRAME.
+//         edi/ebx = Have been saved and can be used.
+//
+.macro SET_TF_DEBUG_HEADER
+    /* Get the Debug Trap Frame EBP/EIP */
+    mov ebx, [ebp+KTRAP_FRAME_EBP]
+    mov edi, [ebp+KTRAP_FRAME_EIP]
+
+    /* Write the debug data */
+    mov [ebp+KTRAP_FRAME_DEBUGPOINTER], edx
+    mov dword ptr [ebp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+    mov [ebp+KTRAP_FRAME_DEBUGEBP], ebx
+    mov [ebp+KTRAP_FRAME_DEBUGEIP], edi
+.endm
+
+//
+// @name CHECK_FOR_APC_DELIVER
+// 
+// This macro checks if the trapframe indicates a return to user-mode,
+// and, if so, checks if user-mode APCs should be delivered.
+//
+// @param PreserveEax
+//        Determines if EAX should be preserved. Implies that the segment
+//        registers will also be saved.
+//
+// @remark ebp = PKTRAP_FRAME.
+//         ebx = Saved and will be used.
+//
+.macro CHECK_FOR_APC_DELIVER PreserveEax
+    /* Check for V86 mode */
+    test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
+    jnz 1f
+
+    /* Deliver APCs only if we were called from user mode */
+    test byte ptr [ebp+KTRAP_FRAME_CS], 1
+    je 2f
+
+    /* Get the current thread */
+1:
+    mov ebx, [fs:KPCR_CURRENT_THREAD]
+
+    /* Make it non-alerted */
+    mov byte ptr [ebx+KTHREAD_ALERTED], 0
+
+    /* And only if any are actually pending */
+    cmp byte ptr [ebx+KTHREAD_PENDING_USER_APC], 0
+    je 2f
+
+    /* Save pointer to Trap Frame */
+    mov ebx, ebp
+
+.if \PreserveEax
+    /* Save some stuff that raising IRQL will kill */
+    mov [ebx+KTRAP_FRAME_EAX], eax
+    mov dword ptr [ebx+KTRAP_FRAME_FS], KGDT_R3_TEB + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_DS], KGDT_R3_DATA + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_ES], KGDT_R3_DATA + RPL_MASK
+    mov dword ptr [ebx+KTRAP_FRAME_GS], 0
+.endif
+
+    /* Raise IRQL to APC_LEVEL */
+    mov ecx, 1
+    call @KfRaiseIrql@4
+
+    /* Save old IRQL */
+    push eax
+
+    /* Deliver APCs */
+    sti
+    push ebx
+    push 0
+    push UserMode
+    call _KiDeliverApc@12
+
+    /* Return to old IRQL */
+    pop ecx
+    call @KfLowerIrql@4
+
+    /* Restore EAX (only in volatile case) */
+.if \PreserveEax
+    mov eax, [ebx+KTRAP_FRAME_EAX]
+.endif
+    cli
+    jmp 1b
+2:
+.endm
+
+//
+// @name TRAP_PROLOG
+// 
+// This macro creates a standard trap entry prologue.
+// It should be used for entry into any kernel trap (KiTrapXx), but not for
+// system calls, which require special handling.
+//
+// @param Label
+//        Identifying name of the caller function; will be used to append
+//        to the name V86 and DR helper functions, which must already exist.
+//
+// @remark Use as follows:
+//          _KiTrap00:
+//              /* Push fake error code */
+//              push 0
+//
+//              /* Enter common prologue */
+//              TRAP_PROLOG(0)
+//
+//              /* Handle trap */
+//              <Your Trap Code Here>
+//
+#define TRAP_PROLOG(Label) \
+    /* Just to be safe, clear out the HIWORD, since it's reserved */ \
+    mov word ptr [esp+2], 0; \
+\
+    /* Save the non-volatiles */ \
+    push ebp; \
+    push ebx; \
+    push esi; \
+    push edi; \
+\
+    /* Save FS and set it to PCR */ \
+    push fs; \
+    mov ebx, KGDT_R0_PCR; \
+    mov fs, bx; \
+\
+    /* Save exception list and bogus previous mode */ \
+    push fs:[KPCR_EXCEPTION_LIST]; \
+    push -1; \
+\
+    /* Save volatiles and segment registers */ \
+    push eax; \
+    push ecx; \
+    push edx; \
+    push ds; \
+    push es; \
+    push gs; \
+\
+    /* Set the R3 data segment */ \
+    mov ax, KGDT_R3_DATA + RPL_MASK; \
+\
+    /* Skip debug registers and debug stuff */ \
+    sub esp, 0x30; \
+\
+    /* Load the segment registers */ \
+    mov ds, ax; \
+    mov es, ax; \
+\
+    /* Set up frame */ \
+    mov ebp, esp; \
+\
+    /* Check if this was from V86 Mode */ \
+    /* test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK; */ \
+    /* jnz V86_Label; */ \
+\
+    /* Get current thread */ \
+    mov ecx, [fs:KPCR_CURRENT_THREAD]; \
+    cld; \
+\
+    /* Flush DR7 */ \
+    and dword ptr [ebp+KTRAP_FRAME_DR7], 0; \
+\
+    /* Check if the thread was being debugged */ \
+    /* test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF; */ \
+    /* jnz Dr_Label; */ \
+\
+    /* Set the Trap Frame Debug Header */ \
+    SET_TF_DEBUG_HEADER
+
+//
+// @name SYSCALL_PROLOG
+// 
+// This macro creates a system call entry prologue.
+// It should be used for entry into any fast-system call (KiGetTickCount,
+// KiCallbackReturn, KiRaiseAssertion) and the generic system call handler
+// (KiSystemService)
+//
+// @param Label
+//        Unique label identifying the name of the caller function; will be
+//        used to append to the name of the DR helper function, which must
+//        already exist.
+//
+// @remark None.
+//
+.macro SYSCALL_PROLOG
+    /* Create a trap frame */
+    push 0
+    push ebp
+    push ebx
+    push esi
+    push edi
+    push fs
+
+    /* Load PCR Selector into fs */
+    mov ebx, KGDT_R0_PCR
+    mov fs, bx
+
+    /* Get a pointer to the current thread */
+    mov esi, [fs:KPCR_CURRENT_THREAD]
+
+    /* Save the previous exception list */
+    push [fs:KPCR_EXCEPTION_LIST]
+
+    /* Set the exception handler chain terminator */
+    mov dword ptr [fs:KPCR_EXCEPTION_LIST], -1
+
+    /* Save the old previous mode */
+    push ss:[esi+KTHREAD_PREVIOUS_MODE]
+
+    /* Skip the other registers */
+    sub esp, 0x48
+
+    /* Hack: it seems that on VMWare someone damages ES/DS on exit. Investigate! */
+    mov [esp+KTRAP_FRAME_DS], ds
+    mov [esp+KTRAP_FRAME_ES], es
+
+    /* Set the new previous mode based on the saved CS selector */
+    mov ebx, [esp+0x6C]
+    and ebx, 1
+    mov byte ptr ss:[esi+KTHREAD_PREVIOUS_MODE], bl
+
+    /* Go on the Kernel stack frame */
+    mov ebp, esp
+
+    /* Save the old trap frame pointer where EDX would be saved */
+    mov ebx, [esi+KTHREAD_TRAP_FRAME]
+    mov [ebp+KTRAP_FRAME_EDX], ebx
+
+    /* Flush DR7 */
+    and dword ptr [ebp+KTRAP_FRAME_DR7], 0
+
+    /* Check if the thread was being debugged */
+    test byte ptr [esi+KTHREAD_DEBUG_ACTIVE], 0xFF
+
+    /* Set the thread's trap frame and clear direction flag */
+    mov [esi+KTHREAD_TRAP_FRAME], ebp
+    cld
+
+    /* Save DR registers if needed */
+    //jnz Dr_kss_&Label
+
+    /* Set the trap frame debug header */
+    SET_TF_DEBUG_HEADER
+
+#ifdef DBG // FIXME: Is this for GDB? Can it be moved in the stub?
+    /*
+     * We want to know the address from where the syscall stub was called.
+     * If PrevMode is KernelMode, that address is stored in our own (kernel)
+     * stack, at location KTRAP_FRAME_ESP.
+     * If we're coming from UserMode, we load the usermode stack pointer
+     * and go back two frames (first frame is the syscall stub, second call
+     * is the caller of the stub).
+     */
+    mov edi, [ebp+KTRAP_FRAME_ESP]
+    test byte ptr [esi+KTHREAD_PREVIOUS_MODE], 0x01
+    jz 0f
+    mov edi, [edi+4]
+0:
+    mov [ebp+KTRAP_FRAME_DEBUGEIP], edi
+#endif
+
+    /* Enable interrupts */
+    sti
+.endm
+
+//
+// @name TRAP_EPILOG
+// 
+// This macro creates an epilogue for leaving any system trap.
+// It is used for exiting system calls, exceptions, interrupts and generic
+// traps.
+//
+// @param SystemCall
+//        Specifies whether this trap will exit a system call. If so, special
+//        code will be assembled to potentially use SYSEXIT instead of IRETD.
+//
+// @param RestorePreviousMode
+//        Specifies if the previous mode should be restored.
+//
+// @param RestoreSegments
+//        Specifies if the segment registers should be restored.
+//
+// @param RestoreVolatiles
+//        Specifies if the volatile registers should be restored.
+//
+// @param RestoreAllRegs
+//        Specifies if volatiles and segments should both be restored.
+//
+// @remark
+//
+.macro TRAP_EPILOG SystemCall, RestorePreviousMode, RestoreSegments, RestoreVolatiles, RestoreAllRegs
+#ifdef DBG
+    /* Assert the flags */
+    pushfd
+    pop edx
+    test edx, EFLAGS_INTERRUPT_MASK
+    jnz 1f
+
+    /* Assert the stack */
+    cmp esp, ebp
+    jnz 1f
+
+    /* Assert the trap frame */
+0:
+    //sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+    //jnz 2f
+
+    /* Assert FS */
+    mov bx, fs
+    cmp bx, KGDT_R0_PCR
+    jnz 1f
+
+    /* Assert exception list */
+    cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0
+    jnz 4f
+2:
+    add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+1:
+    int 3
+    jmp 0b
+4:
+#endif
+
+    /* Get exception list */
+    mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]
+
+#ifdef DBG
+    /* Assert the saved exception list */
+    or edx, edx
+    jnz 5f
+    int 3
+5:
+#endif
+
+    /* Restore it */
+    mov [fs:KPCR_EXCEPTION_LIST], edx
+
+.if \RestorePreviousMode
+    /* Get previous mode */
+    mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE]
+
+#ifdef DBG
+    /* Assert the saved previous mode */
+    cmp ecx, -1
+    jnz 6f
+    int 3
+6:
+#endif
+
+    /* Restore the previous mode */
+    mov esi, [fs:KPCR_CURRENT_THREAD]
+    mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl
+.endif
+
+    /* Check for V86 */
+    test dword ptr [esp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
+    jnz V86_Exit
+
+    /* Check if the frame was edited */
+    test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
+    jz 7f
+
+.ifeq \RestoreAllRegs
+    /* Check the old mode */
+    cmp word ptr [esp+KTRAP_FRAME_CS], KGDT_R3_CODE + RPL_MASK
+    bt word ptr [esp+KTRAP_FRAME_CS], 0
+    cmc
+    ja 8f
+.endif
+
+.if \RestoreVolatiles
+    /* Restore volatiles */
+    mov edx, [esp+KTRAP_FRAME_EDX]
+    mov ecx, [esp+KTRAP_FRAME_ECX]
+    mov eax, [esp+KTRAP_FRAME_EAX]
+.endif
+
+    /* Check if we were called from kernel mode */
+    cmp dword ptr [ebp+KTRAP_FRAME_CS], KGDT_R0_CODE
+    jz 9f
+
+.if \RestoreSegments
+    /* Restore segment registers */
+    lea esp, [ebp+KTRAP_FRAME_GS]
+    pop gs
+    pop es
+    pop ds
+.endif
+
+    /* Restore FS */
+3:
+    lea esp, [ebp+KTRAP_FRAME_FS]
+    pop fs
+
+9:
+    /* Skip debug information and unsaved registers */
+    lea esp, [ebp+KTRAP_FRAME_EDI]
+    pop edi
+    pop esi
+    pop ebx
+    pop ebp
+
+    /* Check for ABIOS */
+    cmp word ptr [esp+8], 0x80
+    ja AbiosExit
+
+    /* Pop error code */
+    add esp, 4
+
+.if \SystemCall
+    /* Check if previous CS is from user-mode */
+    test dword ptr [esp+4], 1
+
+    /* It is, so use Fast Exit */
+    jnz FastExit
+
+    /* Jump back to stub */
+    pop edx
+    pop ecx
+    popf
+    jmp edx
+
+.ret:
+.endif
+    iret
+
+.if \SystemCall
+FastExit:
+    /* Is SYSEXIT Supported/Wanted? */
+    cmp dword ptr ss:[_KiFastSystemCallDisable], 0
+    jnz .ret
+    test dword ptr [esp+8], EFLAGS_TF
+    jnz .ret
+
+    /* Restore FS to TIB */
+    mov ecx, KGDT_R3_TEB + RPL_MASK
+    mov fs, ecx
+
+    /* We will be cleaning up the stack ourselves */
+    pop edx                                 /* New Ring 3 EIP */
+    add esp, 4                              /* Skip Ring 3 DS */
+    and dword ptr [esp], 0xfffffdff         /* Remove EFLAGS_INTERRUPT_MASK from EFLAGS */
+    popf                                    /* Restore old EFLAGS */
+    pop ecx                                 /* Old Ring 3 SS:ESP */
+
+    /*
+     * At this point:
+     *     ECX points to the old User Stack.
+     *     EDX points to the instruction to execute in usermode after the sysenter
+     */
+    sti
+    sysexit
+.endif
+
+8:
+    /* Restore EAX */
+    mov eax, [esp+KTRAP_FRAME_EAX]
+
+    /* Skip registers */
+    add esp, 0x30
+
+    /* Restore segments and volatiles */
+    pop gs
+    pop es
+    pop ds
+    pop edx
+    pop ecx
+
+    /* Jump back to mainline code */
+    jmp 3b
+
+7:
+    /* Restore real CS value */
+    mov ebx, [esp+KTRAP_FRAME_TEMPCS]
+    mov [esp+KTRAP_FRAME_CS], ebx
+
+    /*
+     * If ESP was modified, then a special interrupt exit stack
+     * must be created to "update" ESP's value in a legal manner
+     */
+    mov ebx, [esp+KTRAP_FRAME_TEMPESP]
+    sub ebx, 0xC
+    mov [esp+KTRAP_FRAME_ERROR_CODE], ebx
+
+    /* Copy Interrupt Stack */
+    mov esi, [esp+KTRAP_FRAME_EFLAGS]
+    mov [ebx+8], esi
+    mov esi, [esp+KTRAP_FRAME_CS]
+    mov [ebx+4], esi
+    mov esi, [esp+KTRAP_FRAME_EIP]
+    mov [ebx], esi
+
+    /* Return */
+    add esp, KTRAP_FRAME_EDI
+    pop edi
+    pop esi
+    pop ebx
+    pop ebp
+    mov esp, [esp]
+    iret
+.endm
+
index 20a32f4..0596b36 100644 (file)
-#ifndef __V86M_\r
-#define __V86M_\r
-\r
-#include "ketypes.h"\r
-\r
-/* Emulate cli/sti instructions */\r
-#define KV86M_EMULATE_CLI_STI          (0x1)\r
-/* Allow the v86 mode code to access i/o ports */\r
-#define KV86M_ALLOW_IO_PORT_ACCESS      (0x2)\r
-\r
-typedef struct _KV86M_REGISTERS\r
-{\r
-    /*\r
-     * General purpose registers\r
-     */\r
-    ULONG Ebp;\r
-    ULONG Edi;\r
-    ULONG Esi;\r
-    ULONG Edx;\r
-    ULONG Ecx;\r
-    ULONG Ebx;\r
-    ULONG Eax;\r
-    ULONG Ds;\r
-    ULONG Es;\r
-    ULONG Fs;\r
-    ULONG Gs;\r
-\r
-    /*\r
-     * Control registers\r
-     */\r
-    ULONG Eip;\r
-    ULONG Cs;\r
-    ULONG Eflags;\r
-    ULONG Esp;\r
-    ULONG Ss;\r
-\r
-    /*\r
-     * Control structures\r
-     */\r
-    ULONG RecoveryAddress;\r
-    UCHAR RecoveryInstruction[4];\r
-    ULONG Vif;\r
-    ULONG Flags;\r
-    PNTSTATUS PStatus;\r
-} KV86M_REGISTERS, *PKV86M_REGISTERS;\r
-\r
-typedef struct _KV86M_TRAP_FRAME\r
-{\r
-    KTRAP_FRAME Tf;\r
-\r
-    ULONG SavedExceptionStack;\r
-\r
-    /*\r
-     * These are put on the top of the stack by the routine that entered\r
-     * v86 mode so the exception handlers can find the control information\r
-     */\r
-    struct _KV86M_REGISTERS* regs;\r
-    ULONG orig_ebp;\r
-} KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME;\r
-\r
-#endif\r
-\r
-/* EOF */\r
-#ifndef __V86M_\r
-#define __V86M_\r
-\r
-#include "ketypes.h"\r
-\r
-/* Emulate cli/sti instructions */\r
-#define KV86M_EMULATE_CLI_STI          (0x1)\r
-/* Allow the v86 mode code to access i/o ports */\r
-#define KV86M_ALLOW_IO_PORT_ACCESS      (0x2)\r
-\r
-typedef struct _KV86M_REGISTERS\r
-{\r
-    /*\r
-     * General purpose registers\r
-     */\r
-    ULONG Ebp;\r
-    ULONG Edi;\r
-    ULONG Esi;\r
-    ULONG Edx;\r
-    ULONG Ecx;\r
-    ULONG Ebx;\r
-    ULONG Eax;\r
-    ULONG Ds;\r
-    ULONG Es;\r
-    ULONG Fs;\r
-    ULONG Gs;\r
-\r
-    /*\r
-     * Control registers\r
-     */\r
-    ULONG Eip;\r
-    ULONG Cs;\r
-    ULONG Eflags;\r
-    ULONG Esp;\r
-    ULONG Ss;\r
-\r
-    /*\r
-     * Control structures\r
-     */\r
-    ULONG RecoveryAddress;\r
-    UCHAR RecoveryInstruction[4];\r
-    ULONG Vif;\r
-    ULONG Flags;\r
-    PNTSTATUS PStatus;\r
-} KV86M_REGISTERS, *PKV86M_REGISTERS;\r
-\r
-typedef struct _KV86M_TRAP_FRAME\r
-{\r
-    KTRAP_FRAME Tf;\r
-\r
-    ULONG SavedExceptionStack;\r
-\r
-    /*\r
-     * These are put on the top of the stack by the routine that entered\r
-     * v86 mode so the exception handlers can find the control information\r
-     */\r
-    struct _KV86M_REGISTERS* regs;\r
-    ULONG orig_ebp;\r
-} KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME;\r
-\r
-#endif\r
-\r
-/* EOF */\r
+#ifndef __V86M_
+#define __V86M_
+
+#include "ketypes.h"
+
+/* Emulate cli/sti instructions */
+#define KV86M_EMULATE_CLI_STI          (0x1)
+/* Allow the v86 mode code to access i/o ports */
+#define KV86M_ALLOW_IO_PORT_ACCESS      (0x2)
+
+typedef struct _KV86M_REGISTERS
+{
+    /*
+     * General purpose registers
+     */
+    ULONG Ebp;
+    ULONG Edi;
+    ULONG Esi;
+    ULONG Edx;
+    ULONG Ecx;
+    ULONG Ebx;
+    ULONG Eax;
+    ULONG Ds;
+    ULONG Es;
+    ULONG Fs;
+    ULONG Gs;
+
+    /*
+     * Control registers
+     */
+    ULONG Eip;
+    ULONG Cs;
+    ULONG Eflags;
+    ULONG Esp;
+    ULONG Ss;
+
+    /*
+     * Control structures
+     */
+    ULONG RecoveryAddress;
+    UCHAR RecoveryInstruction[4];
+    ULONG Vif;
+    ULONG Flags;
+    PNTSTATUS PStatus;
+} KV86M_REGISTERS, *PKV86M_REGISTERS;
+
+typedef struct _KV86M_TRAP_FRAME
+{
+    KTRAP_FRAME Tf;
+
+    ULONG SavedExceptionStack;
+
+    /*
+     * These are put on the top of the stack by the routine that entered
+     * v86 mode so the exception handlers can find the control information
+     */
+    struct _KV86M_REGISTERS* regs;
+    ULONG orig_ebp;
+} KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME;
+
+#endif
+
+/* EOF */
+#ifndef __V86M_
+#define __V86M_
+
+#include "ketypes.h"
+
+/* Emulate cli/sti instructions */
+#define KV86M_EMULATE_CLI_STI          (0x1)
+/* Allow the v86 mode code to access i/o ports */
+#define KV86M_ALLOW_IO_PORT_ACCESS      (0x2)
+
+typedef struct _KV86M_REGISTERS
+{
+    /*
+     * General purpose registers
+     */
+    ULONG Ebp;
+    ULONG Edi;
+    ULONG Esi;
+    ULONG Edx;
+    ULONG Ecx;
+    ULONG Ebx;
+    ULONG Eax;
+    ULONG Ds;
+    ULONG Es;
+    ULONG Fs;
+    ULONG Gs;
+
+    /*
+     * Control registers
+     */
+    ULONG Eip;
+    ULONG Cs;
+    ULONG Eflags;
+    ULONG Esp;
+    ULONG Ss;
+
+    /*
+     * Control structures
+     */
+    ULONG RecoveryAddress;
+    UCHAR RecoveryInstruction[4];
+    ULONG Vif;
+    ULONG Flags;
+    PNTSTATUS PStatus;
+} KV86M_REGISTERS, *PKV86M_REGISTERS;
+
+typedef struct _KV86M_TRAP_FRAME
+{
+    KTRAP_FRAME Tf;
+
+    ULONG SavedExceptionStack;
+
+    /*
+     * These are put on the top of the stack by the routine that entered
+     * v86 mode so the exception handlers can find the control information
+     */
+    struct _KV86M_REGISTERS* regs;
+    ULONG orig_ebp;
+} KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME;
+
+#endif
+
+/* EOF */
old mode 100755 (executable)
new mode 100644 (file)
index aa24cf8..b04a9f4 100644 (file)
@@ -5,7 +5,7 @@
  * FILE:            ntoskrnl/tests/tests/VirtualMemory.c
  * PURPOSE:         No purpose listed.
  *
- * PROGRAMMERS:     No programmer listed.
+ * PROGRAMMERS:     Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
 #include <ntoskrnl.h>
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)