Petr Tesarik : winedos: Implement true CDROM DOS device driver.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Apr 11 05:05:49 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 9f9ac54a19f70475ed3755f552b0a2db322ba377
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=9f9ac54a19f70475ed3755f552b0a2db322ba377

Author: Petr Tesarik <hat at tesarici.cz>
Date:   Tue Apr 11 10:37:09 2006 +0200

winedos: Implement true CDROM DOS device driver.

---

 dlls/winedos/dosexe.h |    1 +
 dlls/winedos/int2f.c  |   55 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/winedos/module.c |    1 +
 3 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/dlls/winedos/dosexe.h b/dlls/winedos/dosexe.h
index dd32f6c..2f9ad29 100644
--- a/dlls/winedos/dosexe.h
+++ b/dlls/winedos/dosexe.h
@@ -475,6 +475,7 @@ extern void WINAPI DOSVM_Int2aHandler(CO
 
 /* int2f.c */
 extern void WINAPI DOSVM_Int2fHandler(CONTEXT86*);
+extern void MSCDEX_InstallCDROM(void);
 
 /* int31.c */
 extern void WINAPI DOSVM_Int31Handler(CONTEXT86*);
diff --git a/dlls/winedos/int2f.c b/dlls/winedos/int2f.c
index 68547b0..617c4f0 100644
--- a/dlls/winedos/int2f.c
+++ b/dlls/winedos/int2f.c
@@ -1024,3 +1024,58 @@ static void MSCDEX_Handler(CONTEXT86* co
        break;
     }
 }
+
+/* prototypes */
+static void WINAPI cdrom_strategy(CONTEXT86*ctx);
+static void WINAPI cdrom_interrupt(CONTEXT86*ctx);
+
+/* device info */
+static const WINEDEV cdromdev =
+{
+    "WINE_CD_",
+    ATTR_CHAR|ATTR_REMOVABLE|ATTR_IOCTL,
+    cdrom_strategy, cdrom_interrupt
+};
+
+static REQUEST_HEADER *cdrom_driver_request;
+
+/* Return to caller */
+static void do_lret(CONTEXT86*ctx)
+{
+    WORD *stack = CTX_SEG_OFF_TO_LIN(ctx, ctx->SegSs, ctx->Esp);
+
+    ctx->Eip   = *(stack++);
+    ctx->SegCs = *(stack++);
+    ctx->Esp  += 2*sizeof(WORD);
+}
+
+static void WINAPI cdrom_strategy(CONTEXT86*ctx)
+{
+    cdrom_driver_request = CTX_SEG_OFF_TO_LIN(ctx, ctx->SegEs, ctx->Ebx);
+    do_lret( ctx );
+}
+
+static void WINAPI cdrom_interrupt(CONTEXT86*ctx)
+{
+    if (cdrom_driver_request->unit > CDROM_GetHeap()->hdr.units)
+        cdrom_driver_request->status = STAT_ERROR | 1; /* unknown unit */
+    else
+        MSCDEX_Request((BYTE*)cdrom_driver_request, ISV86(ctx));
+
+    do_lret( ctx );
+}
+
+/**********************************************************************
+ *         MSCDEX_InstallCDROM  [internal]
+ *
+ * Install the CDROM driver into the DOS device driver chain.
+ */
+void MSCDEX_InstallCDROM(void)
+{
+    CDROM_HEAP *cdrom_heap = CDROM_GetHeap();
+
+    DOSDEV_SetupDevice( &cdromdev,
+                        cdrom_heap->cdrom_segment,
+                        FIELD_OFFSET(CDROM_HEAP, hdr),
+                        FIELD_OFFSET(CDROM_HEAP, thunk) );
+}
diff --git a/dlls/winedos/module.c b/dlls/winedos/module.c
index 5b2cc43..593e78d 100644
--- a/dlls/winedos/module.c
+++ b/dlls/winedos/module.c
@@ -197,6 +197,7 @@ static BOOL MZ_InitMemory(void)
     TRACE("Initializing DOS memory structures\n");
     DOSMEM_MapDosLayout();
     DOSDEV_InstallDOSDevices();
+    MSCDEX_InstallCDROM();
 
     return TRUE;
 }




More information about the wine-cvs mailing list