Module: wine Branch: refs/heads/master Commit: 9f9ac54a19f70475ed3755f552b0a2db322ba377 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=9f9ac54a19f70475ed3755f5...
Author: Petr Tesarik hat@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; }