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