[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sun, 7 Jun 2015 02:49:54 +0000 (02:49 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sun, 7 Jun 2015 02:49:54 +0000 (02:49 +0000)
Stubplement INT 25h and INT 26h. These interrupt calls are really weird since
they don't IRET on return, so the default interrupt stub messes up the stack.

svn path=/trunk/; revision=68054

reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c

index 75a04fe..5bc1049 100644 (file)
@@ -1868,6 +1868,44 @@ VOID WINAPI DosBreakInterrupt(LPWORD Stack)
     Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
 }
 
     Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
 }
 
+VOID WINAPI DosAbsoluteRead(LPWORD Stack)
+{
+    /*
+     * This call should leave the flags on the stack for some reason,
+     * so move the stack by one word.
+     */
+    Stack[STACK_INT_NUM] = Stack[STACK_IP];
+    Stack[STACK_IP] = Stack[STACK_CS];
+    Stack[STACK_CS] = Stack[STACK_FLAGS];
+    setSP(LOWORD(getSP() - 2));
+
+    // TODO: NOT IMPLEMENTED;
+    UNIMPLEMENTED;
+
+    /* General failure */
+    setAX(0x800C);
+    Stack[STACK_FLAGS - 1] |= EMULATOR_FLAG_CF;
+}
+
+VOID WINAPI DosAbsoluteWrite(LPWORD Stack)
+{
+    /*
+     * This call should leave the flags on the stack for some reason,
+     * so move the stack by one word.
+     */
+    Stack[STACK_INT_NUM] = Stack[STACK_IP];
+    Stack[STACK_IP] = Stack[STACK_CS];
+    Stack[STACK_CS] = Stack[STACK_FLAGS];
+    setSP(LOWORD(getSP() - 2));
+
+    // TODO: NOT IMPLEMENTED;
+    UNIMPLEMENTED;
+
+    /* General failure */
+    setAX(0x800C);
+    Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
+}
+
 VOID WINAPI DosInt27h(LPWORD Stack)
 {
     DosTerminateProcess(getCS(), 0, (getDX() + 0x0F) >> 4);
 VOID WINAPI DosInt27h(LPWORD Stack)
 {
     DosTerminateProcess(getCS(), 0, (getDX() + 0x0F) >> 4);
@@ -2078,14 +2116,14 @@ BOOLEAN DosKRNLInitialize(VOID)
 //  RegisterDosInt32(0x22, DosInt22h        ); // Termination
     RegisterDosInt32(0x23, DosBreakInterrupt); // Ctrl-C / Ctrl-Break
 //  RegisterDosInt32(0x24, DosInt24h        ); // Critical Error
 //  RegisterDosInt32(0x22, DosInt22h        ); // Termination
     RegisterDosInt32(0x23, DosBreakInterrupt); // Ctrl-C / Ctrl-Break
 //  RegisterDosInt32(0x24, DosInt24h        ); // Critical Error
+    RegisterDosInt32(0x25, DosAbsoluteRead  ); // Absolute Disk Read
+    RegisterDosInt32(0x26, DosAbsoluteWrite ); // Absolute Disk Write
     RegisterDosInt32(0x27, DosInt27h        ); // Terminate and Stay Resident
     RegisterDosInt32(0x28, DosIdle          ); // DOS Idle Interrupt
     RegisterDosInt32(0x29, DosFastConOut    ); // DOS 2+ Fast Console Output
     RegisterDosInt32(0x2F, DosInt2Fh        );
 
     /* Unimplemented DOS interrupts */
     RegisterDosInt32(0x27, DosInt27h        ); // Terminate and Stay Resident
     RegisterDosInt32(0x28, DosIdle          ); // DOS Idle Interrupt
     RegisterDosInt32(0x29, DosFastConOut    ); // DOS 2+ Fast Console Output
     RegisterDosInt32(0x2F, DosInt2Fh        );
 
     /* Unimplemented DOS interrupts */
-    RegisterDosInt32(0x25, NULL); // Absolute Disk Read
-    RegisterDosInt32(0x26, NULL); // Absolute Disk Write
     RegisterDosInt32(0x2A, NULL); // Network - Installation Check
 
     /* Load the CON driver */
     RegisterDosInt32(0x2A, NULL); // Network - Installation Check
 
     /* Load the CON driver */