Make the DOSASPI part use the excellent DPMI RMCB implementation done

by Ove Kaaven, which makes the code _much_ cleaner.
This commit is contained in:
Andreas Mohr 1998-12-18 17:34:58 +00:00 committed by Alexandre Julliard
parent 8beb15aa95
commit 869bc252e5
3 changed files with 41 additions and 29 deletions

View File

@ -7,6 +7,7 @@
#include <memory.h>
#include <unistd.h>
#include <callback.h>
#include <string.h>
#include "windows.h"
#include "aspi.h"
#include "winaspi.h"
@ -59,7 +60,11 @@ ASPI_OpenDevice16(SRB_ExecSCSICmd16 *prb)
fd = open(device_str, O_RDWR);
if (fd == -1) {
int save_error = errno;
ERR(aspi, "Error opening device %s, errno=%d\n", device_str, save_error);
#ifdef HAVE_STRERROR
ERR(aspi, "Error opening device %s, error '%s'\n", device_str, strerror(save_error));
#else
ERR(aspi, "Error opening device %s, error %d\n", device_str, save_error);
#endif
return -1;
}
@ -278,14 +283,18 @@ ASPI_ExecScsiCmd(DWORD ptrPRB, UINT16 mode)
status = write(fd, sg_hd, in_len);
if (status < 0 || status != in_len) {
int myerror = errno;
int save_error = errno;
WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
if (status < 0) {
if (myerror == ENOMEM) {
if (save_error == ENOMEM) {
MSG("ASPI: Linux generic scsi driver\n You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n Suggest 130560\n");
}
WARN(aspi, "errno: = %d\n", myerror);
#ifdef HAVE_STRERROR
WARN(aspi, "error:= '%s'\n", strerror(save_error));
#else
WARN(aspi, "error:= %d\n", save_error);
#endif
}
goto error_exit;
}
@ -462,31 +471,27 @@ DWORD WINAPI GetASPIDLLVersion16()
}
void WINAPI ASPI_DOS_func(DWORD srb)
void WINAPI ASPI_DOS_func(CONTEXT *context)
{
ASPI_SendASPICommand(srb, ASPI_DOS);
WORD *stack = CTX_SEG_OFF_TO_LIN(context, SS_reg(context), ESP_reg(context));
DWORD ptrSRB = *(DWORD *)&stack[2];
ASPI_SendASPICommand(ptrSRB, ASPI_DOS);
/* simulate a normal RETF sequence as required by DPMI CallRMProcFar */
IP_reg(context) = *(stack++);
CS_reg(context) = *(stack++);
SP_reg(context) += 2*sizeof(WORD);
}
/* returns a real mode call address to ASPI_DOS_func() */
/* returns the address of a real mode callback to ASPI_DOS_func() */
void ASPI_DOS_HandleInt(CONTEXT *context)
{
#ifdef linux
FARPROC16 DOS_func;
DWORD dos;
LPBYTE dosptr;
DOS_func = MODULE_GetWndProcEntry16("ASPI_DOS_func");
dos = GlobalDOSAlloc(5);
dosptr = (BYTE *)PTR_SEG_OFF_TO_LIN(LOWORD(dos), 0);
*dosptr++ = 0xea; /* ljmp */
*(FARPROC16 *)dosptr = DOS_func;
*(DWORD *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context))
= MAKELONG(0, HIWORD(dos)); /* real mode address */
TRACE(aspi, "real mode proc: %04x:%04x.\n", HIWORD(dos), 0);
RESET_CFLAG(context);
AX_reg(context) = CX_reg(context);
FARPROC16 *p = (FARPROC16 *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context));
*p = DPMI_AllocInternalRMCB(ASPI_DOS_func);
TRACE(aspi, "allocated real mode proc %p\n", *p);
#else
SET_CFLAG(context);
#endif

View File

@ -59,7 +59,11 @@ ASPI_OpenDevice32(SRB_ExecSCSICmd32 *prb)
fd = open(device_str, O_RDWR);
if (fd == -1) {
int save_error = errno;
ERR(aspi, "Error opening device %s, errno=%d\n", device_str, save_error);
#ifdef HAVE_STRERROR
ERR(aspi, "Error opening device %s, error '%s'\n", device_str, strerror(save_error));
#else
ERR(aspi, "Error opening device %s, error %d\n", device_str, save_error);
#endif
return -1;
}
@ -226,14 +230,18 @@ ASPI_ExecScsiCmd32(SRB_ExecSCSICmd32 *lpPRB)
status = write(fd, sg_hd, in_len);
if (status < 0 || status != in_len) {
int myerror = errno;
int save_error = errno;
WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
if (status < 0) {
if (myerror == ENOMEM) {
if (save_error == ENOMEM) {
MSG("ASPI: Linux generic scsi driver\n You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n Suggest 130560\n");
}
WARN(aspi, "errno: = %d\n", myerror);
#ifdef HAVE_STRERROR
WARN(aspi, "error:= '%s'\n", strerror(save_error));
#else
WARN(aspi, "error:= %d\n", save_error);
#endif
}
goto error_exit;
}

View File

@ -13,9 +13,8 @@ type win16
28 pascal MyAlloc(word word word) NE_AllocateSegment
29 pascal DefResourceHandler(word word word) NE_DefResourceHandler
30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc16
31 pascal16 ASPI_DOS_func(long) ASPI_DOS_func
32 pascal LoadDIBIconHandler(word word word) LoadDIBIconHandler
33 pascal LoadDIBCursorHandler(word word word) LoadDIBCursorHandler
31 pascal LoadDIBIconHandler(word word word) LoadDIBIconHandler
32 pascal LoadDIBCursorHandler(word word word) LoadDIBCursorHandler
# Interrupt vectors 0-255 are ordinals 100-355
# The 'word' parameter are the flags pushed on the stack by the interrupt