1
0
Fork 0

Remove ASPI CD-ROM interface

ASPI was supported by Microsoft only for Windows 95, 98 and, ME.
Adaptec supported this interface going forward for Windows NT, 2000,
and XP (32-bit only).
This commit is contained in:
Patryk Obara 2019-12-01 12:37:33 +01:00 committed by Patryk Obara
parent d82766930f
commit e43f83a68a
9 changed files with 8 additions and 1198 deletions

12
README
View file

@ -143,8 +143,6 @@ CD-ROM: My CD-ROM doesn't work.
- mount d f:\ -t cdrom -ioctl_mci
To force ioctl-only access (Windows-only):
- mount d f:\ -t cdrom -ioctl_dio
To enable low-level aspi-support (win98 with aspi-layer installed):
- mount d f:\ -t cdrom -aspi
explanation: - d driveletter you will get in DOSBox (d is the best,
don't change it!)
@ -161,7 +159,7 @@ CD-ROM: The game/application can't find its CD-ROM.
MSCDEX interface required by DOS games to interface with CD-ROMs.
Also try adding the correct label (-label LABEL) to the mount command,
where LABEL is the CD-label (volume ID) of the CD-ROM.
Under Windows you can specify -ioctl, -aspi or -noioctl. Look at the
Under Windows you can specify -ioctl or -noioctl. Look at the
description of the mount command in Section 4: "Internal programs"
for their meaning and the
additional audio-CD related options -ioctl_dx, -ioctl_mci, -ioctl_dio.
@ -484,7 +482,7 @@ To get a list of the internal commands type "HELP" at the prompt.
In addition, the following commands are available:
MOUNT "Emulated Drive letter" "Real Drive or Directory"
[-t type] [-aspi] [-ioctl] [-noioctl] [-usecd number] [-size drivesize]
[-t type] [-ioctl] [-noioctl] [-usecd number] [-size drivesize]
[-label drivelabel] [-freesize size_in_mb]
[-freesize size_in_kb (floppies)]
MOUNT -cd
@ -522,17 +520,13 @@ MOUNT -u "Emulated Drive letter"
if the CD-ROM label isn't read correctly (useful when a program
can't find its CD-ROM). If you don't specify a label
and no lowlevel support is selected (that is omitting the -usecd #
and/or -aspi parameters, or specifying -noioctl):
parameter, or specifying -noioctl):
For Windows: label is extracted from "Real Drive".
For Linux: label is set to NO_LABEL.
If you do specify a label, this label will be kept as long as the drive
is mounted. It will not be updated !!
-aspi
Forces use of the aspi layer. Only valid if mounting a CD-ROM under
Windows systems with an ASPI-Layer.
-ioctl (automatic selection of the CD audio interface)
-ioctl_dx (digital audio extraction used for CD audio)
-ioctl_dio (ioctl calls used for CD audio)

View file

@ -1,5 +1,5 @@
.\" Hey, EMACS: -*- nroff -*-
.TH DOSBOX 1 "Sep 08, 2015"
.TH DOSBOX 1 "Nov 29, 2019"
.\" Please adjust this date whenever revising the manpage.
.SH NAME
dosbox \- an x86/DOS emulator with sound/graphics
@ -162,7 +162,7 @@ Sets the amount of free space available on a drive in MB's. This is a more
.RI "Sets the name of the drive to " drivelabel ". Needed on some"
systems if the cd label isn't read correctly. Useful when a
program can't find its cdrom. If you don't specify a label and no
.RB "lowlevel support is selected (" "\-usecd #" " and/or " "\-ioctl/aspi" "):"
.RB "lowlevel support is selected (" "\-usecd #" " and/or " "\-ioctl" "):"
.RS
.LP
For win32: label is extracted from "Real Drive".

View file

@ -1,10 +1,10 @@
AM_CPPFLAGS = -I$(top_srcdir)/include
noinst_LIBRARIES = libdos.a
EXTRA_DIST = scsidefs.h wnaspi32.h dos_codepages.h dos_keyboard_layout_data.h
EXTRA_DIST = scsidefs.h dos_codepages.h dos_keyboard_layout_data.h
libdos_a_SOURCES = dos.cpp dos_devices.cpp dos_execute.cpp dos_files.cpp dos_ioctl.cpp dos_memory.cpp \
dos_misc.cpp dos_classes.cpp dos_programs.cpp dos_tables.cpp \
drives.cpp drives.h drive_virtual.cpp drive_local.cpp drive_cache.cpp drive_fat.cpp \
drive_iso.cpp dev_con.h dos_mscdex.cpp dos_keyboard_layout.cpp \
cdrom.h cdrom.cpp cdrom_ioctl_win32.cpp cdrom_aspi_win32.cpp cdrom_ioctl_linux.cpp cdrom_image.cpp \
cdrom.h cdrom.cpp cdrom_ioctl_win32.cpp cdrom_ioctl_linux.cpp cdrom_image.cpp \
drive_overlay.cpp

View file

@ -20,8 +20,6 @@
#ifndef __CDROM_INTERFACE__
#define __CDROM_INTERFACE__
#define MAX_ASPI_CDROM 5
#include <string.h>
#include <string>
#include <iostream>
@ -49,7 +47,6 @@
enum {
CDROM_USE_SDL,
CDROM_USE_ASPI,
CDROM_USE_IOCTL_DIO,
CDROM_USE_IOCTL_DX,
CDROM_USE_IOCTL_MCI
@ -286,55 +283,7 @@ private:
#endif
#include <windows.h>
#include "wnaspi32.h" // Aspi stuff
class CDROM_Interface_Aspi : public CDROM_Interface
{
public:
CDROM_Interface_Aspi (void);
virtual ~CDROM_Interface_Aspi(void);
bool SetDevice (char* path, int forceCD);
bool GetUPC (unsigned char& attr, char* upc);
bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut);
bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr);
bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos);
bool GetAudioStatus (bool& playing, bool& pause);
bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen);
bool PlayAudioSector (unsigned long start,unsigned long len);
bool PauseAudio (bool resume);
bool StopAudio (void);
void ChannelControl (TCtrl ctrl) { return; };
bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num);
bool LoadUnloadMedia (bool unload);
private:
DWORD GetTOC (LPTOC toc);
HANDLE OpenIOCTLFile (char cLetter, BOOL bAsync);
void GetIOCTLAdapter (HANDLE hF,int * iDA,int * iDT,int * iDL);
bool ScanRegistryFindKey (HKEY& hKeyBase);
bool ScanRegistry (HKEY& hKeyBase);
BYTE GetHostAdapter (char* hardwareID);
bool GetVendor (BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, char* szBuffer);
// ASPI stuff
BYTE haId;
BYTE target;
BYTE lun;
char letter;
// Windows stuff
HINSTANCE hASPI;
HANDLE hEvent; // global event
DWORD (*pGetASPI32SupportInfo) (void); // ptrs to aspi funcs
DWORD (*pSendASPI32Command) (LPSRB);
TMSF oldLeadOut;
};
class CDROM_Interface_Ioctl : public CDROM_Interface
{

View file

@ -1,767 +0,0 @@
/*
* Copyright (C) 2002-2019 The DOSBox Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "cdrom.h"
#if defined (WIN32)
#include <ctype.h>
#include "support.h"
//Are actually system includes but leave for now
#include "wnaspi32.h"
#if defined (_MSC_VER)
#include <ntddcdrm.h> // Ioctl stuff
#include <ntddscsi.h>
#include <winioctl.h> // Ioctl stuff
#elif (defined __MINGW64_VERSION_MAJOR)
#include <winioctl.h> // Ioctl stuff
#include <ntddcdrm.h> // Ioctl stuff
#include <ntddscsi.h>
#else
#include "ddk/ntddcdrm.h" // Ioctl stuff
#include "ddk/ntddscsi.h"
#endif
#include "scsidefs.h"
// always use a buffer of the maximum struct size (like the union of all 'SRB_*' struct types)
// Thanx SaPu
typedef union {
SRB_HAInquiry hainquiry;
SRB_GDEVBlock gdevblock;
SRB_ExecSCSICmd execscsicmd;
SRB_Abort abort;
SRB_BusDeviceReset busdevicereset;
SRB_GetDiskInfo getdiskinfo;
SRB_RescanPort rescanport;
SRB_GetSetTimeouts getsettimeouts;
} ASPI_SRB;
// *****************************************************************
// Windows ASPI functions (should work for all WIN with ASPI layer)
// *****************************************************************
CDROM_Interface_Aspi::CDROM_Interface_Aspi(void)
{
hASPI = NULL;
hEvent = NULL;
pGetASPI32SupportInfo = NULL;
pSendASPI32Command = NULL;
memset(&oldLeadOut,0,sizeof(oldLeadOut));
};
CDROM_Interface_Aspi::~CDROM_Interface_Aspi(void)
{
// Stop Audio
StopAudio();
pGetASPI32SupportInfo = NULL; // clear funcs
pSendASPI32Command = NULL;
if (hASPI) { // free aspi
FreeLibrary(hASPI);
hASPI=NULL;
}
};
bool GetRegistryValue(HKEY& hKey,char* valueName, char* buffer, ULONG bufferSize)
// hKey has to be open
{
// Read subkey
ULONG valType;
ULONG result;
result = RegQueryValueEx(hKey,valueName,NULL,&valType,(unsigned char*)&buffer[0],&bufferSize);
return (result == ERROR_SUCCESS);
};
BYTE CDROM_Interface_Aspi::GetHostAdapter(char* hardwareID)
{
ASPI_SRB sh;
ASPI_SRB sd;
DWORD d = pGetASPI32SupportInfo();
int cnt = LOBYTE(LOWORD(d));
int i,j,k,max;
for(i=0; i<cnt; i++) {
memset(&sh, 0, sizeof(sh));
sh.hainquiry.SRB_Cmd = SC_HA_INQUIRY;
sh.hainquiry.SRB_HaId = i;
pSendASPI32Command((LPSRB)&sh);
if (sh.hainquiry.SRB_Status!=SS_COMP) continue;
// Indicates the maximum number of targets the adapter supports
// If the value is not 8 or 16, then it should be assumed max target is 8
max = (int)sh.hainquiry.HA_Unique[3];
if ((max!=8) && (max!=16)) max = 8;
for(j=0; j<max; j++) {
for(k=0; k<8; k++) {
memset(&sd, 0, sizeof(sd));
sd.gdevblock.SRB_Cmd = SC_GET_DEV_TYPE;
sd.gdevblock.SRB_HaId = i;
sd.gdevblock.SRB_Target = j;
sd.gdevblock.SRB_Lun = k;
pSendASPI32Command((LPSRB)&sd);
if (sd.gdevblock.SRB_Status == SS_COMP) {
if (sd.gdevblock.SRB_DeviceType == DTYPE_CDROM) {
if ((target==j) && (lun==k)) {
LOG(LOG_MISC,LOG_NORMAL)("SCSI: Getting Hardware vendor.");
// "Hardware ID = vendor" match ?
char vendor[64];
if (GetVendor(i,target,lun,vendor)) {
LOG(LOG_MISC,LOG_NORMAL)("SCSI: Vendor : %s",vendor);
if (strstr(strupr(hardwareID),strupr(vendor))) {
LOG(LOG_MISC,LOG_NORMAL)("SCSI: Host Adapter found: %d",i);
return i;
}
};
}
}
}
}
}
}
LOG(LOG_MISC,LOG_ERROR)("SCSI: Host Adapter not found: %d",i);
return 0;
};
bool CDROM_Interface_Aspi::ScanRegistryFindKey(HKEY& hKeyBase)
// hKey has to be open
{
FILETIME time;
ULONG result,newKeyResult;
char subKey[256];
char buffer[256];
ULONG subKeySize = 256;
HKEY hNewKey;
ULONG index = 0;
do {
result = RegEnumKeyEx (hKeyBase,index,&subKey[0],&subKeySize,NULL,NULL,0,&time);
if (result==ERROR_SUCCESS) {
// Open Key...
newKeyResult = RegOpenKeyEx (hKeyBase,subKey,0,KEY_READ,&hNewKey);
if (newKeyResult==ERROR_SUCCESS) {
static const char drive_letter_assignment[] = "CurrentDriveLetterAssignment";
if (GetRegistryValue(hNewKey,(char*)&drive_letter_assignment,buffer,256)) {
LOG(LOG_MISC,LOG_NORMAL)("SCSI: Drive Letter found: %s",buffer);
// aha, something suspicious...
if (buffer[0]==letter) {
char hardwareID[256];
// found it... lets see if we can get the scsi values
static const char SCSI_LUN[] = "SCSILUN";
bool v1 = GetRegistryValue(hNewKey,(char*)SCSI_LUN,buffer,256);
LOG(LOG_MISC,LOG_NORMAL)("SCSI: SCSILUN found: %s",buffer);
lun = buffer[0]-'0';
static const char SCSI_TargetID[] = "SCSITargetID";
bool v2 = GetRegistryValue(hNewKey,(char*)SCSI_TargetID,buffer,256);
LOG(LOG_MISC,LOG_NORMAL)("SCSI: SCSITargetID found: %s",buffer);
target = buffer[0]-'0';
static const char Hardware_ID[] = "HardwareID";
bool v3 = GetRegistryValue(hNewKey,(char*)Hardware_ID,hardwareID,256);
RegCloseKey(hNewKey);
if (v1 && v2 && v3) {
haId = GetHostAdapter(hardwareID);
return true;
};
}
};
};
RegCloseKey(hNewKey);
};
index++;
} while ((result==ERROR_SUCCESS) || (result==ERROR_MORE_DATA));
return false;
};
bool CDROM_Interface_Aspi::GetVendor(BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, char* szBuffer)
{
ASPI_SRB srbExec;
// SRB_ExecSCSICmd srbExec;
memset ( &srbExec, 0, sizeof ( SRB_ExecSCSICmd ) );
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
srbExec.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD ;
srbExec.execscsicmd.SRB_HaId = HA_num;
srbExec.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
srbExec.execscsicmd.SRB_Target = SCSI_Id;
srbExec.execscsicmd.SRB_Lun = SCSI_Lun;
srbExec.execscsicmd.SRB_BufLen = 36;
srbExec.execscsicmd.SRB_BufPointer = (unsigned char*)szBuffer;
srbExec.execscsicmd.SRB_SenseLen = SENSE_LEN;
srbExec.execscsicmd.SRB_CDBLen = 6;
srbExec.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
srbExec.execscsicmd.CDBByte [ 0 ] = SCSI_INQUIRY;
srbExec.execscsicmd.CDBByte [ 4 ] = 36; // allocation length per szBuffer [ ]
ResetEvent(hEvent);
int dwStatus = pSendASPI32Command ((LPSRB)&srbExec);
// LOG(LOG_MISC|LOG_ERROR,"SCSI: Get vendor command send");
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,30000);
// LOG(LOG_MISC|LOG_ERROR,"SCSI: Pending done.");
CloseHandle(hEvent);
if (srbExec.execscsicmd.SRB_Status != SS_COMP) {
strcpy (szBuffer, "error" );
return false;
} else {
safe_strncpy(szBuffer,szBuffer+8,26);
size_t len = strlen(szBuffer);
for (size_t i=0; i<len; i++) if (szBuffer[i]<=32) szBuffer[i]='_';
}
return true;
}
bool CDROM_Interface_Aspi::ScanRegistry(HKEY& hKeyBase)
// hKey has to be open
{
FILETIME time;
ULONG result,newKeyResult;
char subKey[256];
ULONG subKeySize= 256;
HKEY hNewKey;
ULONG index = 0;
do {
result = RegEnumKeyEx (hKeyBase,index,&subKey[0],&subKeySize,NULL,NULL,0,&time);
if ((result==ERROR_SUCCESS) || (result==ERROR_MORE_DATA)) {
// Open Key...
newKeyResult = RegOpenKeyEx (hKeyBase,subKey,0,KEY_READ,&hNewKey);
if (newKeyResult==ERROR_SUCCESS) {
bool found = ScanRegistryFindKey(hNewKey);
RegCloseKey(hNewKey);
if (found) return true;
};
RegCloseKey(hNewKey);
};
index++;
} while ((result==ERROR_SUCCESS) || (result==ERROR_MORE_DATA));
return false;
};
bool CDROM_Interface_Aspi::SetDevice(char* path, int forceCD)
{
// load WNASPI32.DLL
hASPI = LoadLibrary ( "WNASPI32.DLL" );
if (!hASPI) return false;
// Get Pointer to ASPI funcs
pGetASPI32SupportInfo = (DWORD(*)(void))GetProcAddress(hASPI,"GetASPI32SupportInfo");
pSendASPI32Command = (DWORD(*)(LPSRB))GetProcAddress(hASPI,"SendASPI32Command");
if (!pGetASPI32SupportInfo || !pSendASPI32Command) return false;
// Letter
letter = toupper(path[0]);
// Check OS
OSVERSIONINFO osi;
osi.dwOSVersionInfoSize = sizeof(osi);
GetVersionEx(&osi);
if ((osi.dwPlatformId==VER_PLATFORM_WIN32_NT) && (osi.dwMajorVersion>4)) {
if (GetDriveType(path)==DRIVE_CDROM) {
// WIN XP/NT/2000
int iDA,iDT,iDL;
letter = path[0];
HANDLE hF = OpenIOCTLFile(letter,FALSE);
GetIOCTLAdapter(hF,&iDA,&iDT,&iDL);
CloseHandle(hF);
// Set SCSI IDs
haId = iDA;
target = iDT;
lun = iDL;
return true;
}
} else {
// win 95/98/ME have to scan the registry...
// lets hope the layout is always the same... i dunno...
char key[2048];
HKEY hKeyBase;
bool found = false;
strcpy(key,"ENUM\\SCSI");
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,key,0,KEY_READ,&hKeyBase)==ERROR_SUCCESS) {
found = ScanRegistry(hKeyBase);
};
RegCloseKey(hKeyBase);
return found;
}
return false;
};
bool CDROM_Interface_Aspi::GetAudioTracks(int& stTrack, int& endTrack, TMSF& leadOut)
{
TOC toc;
if (GetTOC((LPTOC)&toc) == SS_COMP) {
stTrack = toc.cFirstTrack;
endTrack = toc.cLastTrack;
leadOut.min = (unsigned char)(toc.tracks[endTrack].lAddr >> 8) &0xFF;
leadOut.sec = (unsigned char)(toc.tracks[endTrack].lAddr >> 16) &0xFF;
leadOut.fr = (unsigned char)(toc.tracks[endTrack].lAddr >> 24) &0xFF;
return true;
}
return false;
};
bool CDROM_Interface_Aspi::GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr)
{
TOC toc;
if (GetTOC((LPTOC)&toc) == SS_COMP) {
start.min = (unsigned char)(toc.tracks[track-1].lAddr >> 8) &0xFF;
start.sec = (unsigned char)(toc.tracks[track-1].lAddr >> 16) &0xFF;
start.fr = (unsigned char)(toc.tracks[track-1].lAddr >> 24) &0xFF;
attr = (toc.tracks[track-1].cAdrCtrl << 4) & 0xEF;
return true;
};
return false;
};
HANDLE CDROM_Interface_Aspi::OpenIOCTLFile(char cLetter,BOOL bAsync)
{
HANDLE hF;
char szFName[16];
OSVERSIONINFO ov;
DWORD dwFlags;
DWORD dwIOCTLAttr;
// if(bAsync) dwIOCTLAttr=FILE_FLAG_OVERLAPPED;
// else
dwIOCTLAttr=0;
memset(&ov,0,sizeof(OSVERSIONINFO));
ov.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&ov);
if ((ov.dwPlatformId==VER_PLATFORM_WIN32_NT) && (ov.dwMajorVersion>4))
dwFlags = GENERIC_READ|GENERIC_WRITE; // add gen write on W2k/XP
else
dwFlags = GENERIC_READ;
wsprintf(szFName, "\\\\.\\%c:",cLetter);
hF=CreateFile(szFName,dwFlags,FILE_SHARE_READ, // open drive
NULL,OPEN_EXISTING,dwIOCTLAttr,NULL);
if (hF==INVALID_HANDLE_VALUE) {
dwFlags^=GENERIC_WRITE; // mmm... no success
hF=CreateFile(szFName,dwFlags,FILE_SHARE_READ, // -> open drive again
NULL,OPEN_EXISTING,dwIOCTLAttr,NULL);
if (hF==INVALID_HANDLE_VALUE) return NULL;
}
return hF;
}
void CDROM_Interface_Aspi::GetIOCTLAdapter(HANDLE hF,int * iDA,int * iDT,int * iDL)
{
char szBuf[1024];
PSCSI_ADDRESS pSA;
DWORD dwRet;
*iDA=*iDT=*iDL=-1;
if(hF==NULL) return;
memset(szBuf,0,1024);
pSA=(PSCSI_ADDRESS)szBuf;
pSA->Length=sizeof(SCSI_ADDRESS);
if(!DeviceIoControl(hF,IOCTL_SCSI_GET_ADDRESS,NULL,
0,pSA,sizeof(SCSI_ADDRESS),
&dwRet,NULL))
return;
*iDA = pSA->PortNumber;
*iDT = pSA->TargetId;
*iDL = pSA->Lun;
}
DWORD CDROM_Interface_Aspi::GetTOC(LPTOC toc)
{
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = sizeof(*toc);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)toc;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 0x0A;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_READ_TOC;
s.execscsicmd.CDBByte[1] = 0x02; // 0x02 for MSF
s.execscsicmd.CDBByte[7] = 0x03;
s.execscsicmd.CDBByte[8] = 0x24;
ResetEvent(hEvent);
dwStatus=pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,30000);
CloseHandle(hEvent);
return (s.execscsicmd.SRB_Status==SS_COMP);
}
bool CDROM_Interface_Aspi::PlayAudioSector(unsigned long start,unsigned long len)
{
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = 0;
s.execscsicmd.SRB_BufPointer = 0;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 12;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_PLAYAUD_12;
s.execscsicmd.CDBByte[1] = lun << 5;
s.execscsicmd.CDBByte[2] = (unsigned char)((start >> 24) & 0xFF);
s.execscsicmd.CDBByte[3] = (unsigned char)((start >> 16) & 0xFF);
s.execscsicmd.CDBByte[4] = (unsigned char)((start >> 8) & 0xFF);
s.execscsicmd.CDBByte[5] = (unsigned char)((start & 0xFF));
s.execscsicmd.CDBByte[6] = (unsigned char)((len >> 24) & 0xFF);
s.execscsicmd.CDBByte[7] = (unsigned char)((len >> 16) & 0xFF);
s.execscsicmd.CDBByte[8] = (unsigned char)((len >> 8) & 0xFF);
s.execscsicmd.CDBByte[9] = (unsigned char)(len & 0xFF);
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if(dwStatus==SS_PENDING) WaitForSingleObject(hEvent,10000);
CloseHandle(hEvent);
return s.execscsicmd.SRB_Status==SS_COMP;
}
bool CDROM_Interface_Aspi::StopAudio(void)
{
return PauseAudio(false);
};
bool CDROM_Interface_Aspi::PauseAudio(bool resume)
{
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_BufLen = 0x00;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_CDBLen = 0x0A;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = 0x4B;
s.execscsicmd.CDBByte[8] = (unsigned char)resume; // Pause
ResetEvent(hEvent);
dwStatus=pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,30000);
CloseHandle(hEvent);
return (s.execscsicmd.SRB_Status==SS_COMP);
};
bool CDROM_Interface_Aspi::GetAudioSub(unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos)
{
SUB_Q_CURRENT_POSITION pos;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_BufLen = sizeof(pos);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&pos;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x40; // subq
s.execscsicmd.CDBByte[3] = 0x01; // curr pos info
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(pos);
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,0xFFFFFFFF);
CloseHandle(hEvent);
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
attr = (pos.Control<<4) &0xEF;
track = pos.TrackNumber;
index = pos.IndexNumber;
absPos.min = pos.AbsoluteAddress[1];
absPos.sec = pos.AbsoluteAddress[2];
absPos.fr = pos.AbsoluteAddress[3];
relPos.min = pos.TrackRelativeAddress[1];
relPos.sec = pos.TrackRelativeAddress[2];
relPos.fr = pos.TrackRelativeAddress[3];
return true;
};
bool CDROM_Interface_Aspi::GetUPC(unsigned char& attr, char* upcdata)
{
SUB_Q_MEDIA_CATALOG_NUMBER upc;
ASPI_SRB s;
//SRB_ExecSCSICmd s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_BufLen = sizeof(upc);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&upc;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x40; // subq
s.execscsicmd.CDBByte[3] = 0x02; // get upc
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(upc);
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,0xFFFFFFFF);
CloseHandle(hEvent);
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
// attr = (upc.ADR<<4) | upc.Control;
attr = 0;
// Convert to mscdex format
for (int i=0; i<7; i++) upcdata[i] = upc.MediaCatalog[i];
for (int i=0; i<7; i++) upcdata[i] = (upc.MediaCatalog[i*2] << 4) | (upc.MediaCatalog[i*2+1] & 0x0F);
return true;
};
bool CDROM_Interface_Aspi::GetAudioStatus(bool& playing, bool& pause)
{
playing = pause = false;
SUB_Q_HEADER sub;
// SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_BufLen = sizeof(sub);
s.execscsicmd.SRB_BufPointer = (BYTE FAR *)&sub;
s.execscsicmd.SRB_CDBLen = 10;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_SUBCHANNEL;
s.execscsicmd.CDBByte[1] = (lun<<5)|2; // lun & msf
s.execscsicmd.CDBByte[2] = 0x00; // no subq
s.execscsicmd.CDBByte[3] = 0x00; // dont care
s.execscsicmd.CDBByte[6] = 0; // track number (only in isrc mode, ignored)
s.execscsicmd.CDBByte[7] = 0; // alloc len
s.execscsicmd.CDBByte[8] = sizeof(sub);
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,0xFFFFFFFF);
CloseHandle(hEvent);
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
playing = (sub.AudioStatus==0x11);
pause = (sub.AudioStatus==0x12);
return true;
};
bool CDROM_Interface_Aspi::LoadUnloadMedia(bool unload)
{
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_BufLen = 0;
s.execscsicmd.SRB_BufPointer = 0;
s.execscsicmd.SRB_CDBLen = 6; // 14;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = SCSI_LOAD_UN;
s.execscsicmd.CDBByte[1] = (lun<<5)|1; // lun & immediate
s.execscsicmd.CDBByte[4] = (unload ? 0x02:0x03); // unload/load media
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,0xFFFFFFFF);
CloseHandle(hEvent);
if (s.execscsicmd.SRB_Status!=SS_COMP) return false;
return true;
};
bool CDROM_Interface_Aspi::GetMediaTrayStatus(bool& mediaPresent, bool& mediaChanged, bool& trayOpen)
{
// Seems not possible to get this values using ioctl...
int track1,track2;
TMSF leadOut;
// If we can read, there's a media
mediaPresent = GetAudioTracks(track1, track2, leadOut),
trayOpen = !mediaPresent;
mediaChanged = (oldLeadOut.min!=leadOut.min) || (oldLeadOut.sec!=leadOut.sec) || (oldLeadOut.fr!=leadOut.fr);
// Save old values
oldLeadOut.min = leadOut.min;
oldLeadOut.sec = leadOut.sec;
oldLeadOut.fr = leadOut.fr;
// always success
return true;
};
bool CDROM_Interface_Aspi::ReadSectors(PhysPt buffer, bool raw, unsigned long sector, unsigned long num)
{
//SRB_ExecSCSICmd s;
ASPI_SRB s;
DWORD dwStatus;
hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&s,0,sizeof(s));
Bitu buflen = raw?2352*num:2048*num;
Bit8u* bufdata = new Bit8u[buflen];
s.execscsicmd.SRB_Cmd = SC_EXEC_SCSI_CMD;
s.execscsicmd.SRB_HaId = haId;
s.execscsicmd.SRB_Target = target;
s.execscsicmd.SRB_Lun = lun;
s.execscsicmd.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
s.execscsicmd.SRB_SenseLen = SENSE_LEN;
s.execscsicmd.SRB_BufLen = buflen;
s.execscsicmd.SRB_BufPointer = (BYTE FAR*)bufdata;
s.execscsicmd.SRB_CDBLen = 12;
s.execscsicmd.SRB_PostProc = (LPVOID)hEvent;
s.execscsicmd.CDBByte[0] = 0xBE;
s.execscsicmd.CDBByte[2] = (unsigned char)((sector >> 24) & 0xFF);
s.execscsicmd.CDBByte[3] = (unsigned char)((sector >> 16) & 0xFF);
s.execscsicmd.CDBByte[4] = (unsigned char)((sector >> 8) & 0xFF);
s.execscsicmd.CDBByte[5] = (unsigned char)((sector & 0xFF));
s.execscsicmd.CDBByte[6] = (unsigned char)((num >> 16) & 0xFF);
s.execscsicmd.CDBByte[7] = (unsigned char)((num >> 8) & 0xFF);
s.execscsicmd.CDBByte[8] = (unsigned char) (num & 0xFF);
s.execscsicmd.CDBByte[9] = (raw?0xF0:0x10);
ResetEvent(hEvent);
dwStatus = pSendASPI32Command((LPSRB)&s);
if (dwStatus==SS_PENDING) WaitForSingleObject(hEvent,0xFFFFFFFF);
CloseHandle(hEvent);
// Copy to PhysPt
MEM_BlockWrite(buffer,bufdata,buflen);
delete[] bufdata;
return (s.execscsicmd.SRB_Status==SS_COMP);
};
#endif

View file

@ -278,12 +278,6 @@ int CMscdex::AddDrive(Bit16u _drive, char* physicalPath, Bit8u& subUnit)
break;
}
}
if (useCdromInterface==CDROM_USE_ASPI) {
// all Wins - ASPI
cdrom[numDrives] = new CDROM_Interface_Aspi();
LOG(LOG_MISC,LOG_NORMAL)("MSCDEX: ASPI Interface.");
break;
}
#endif
#if defined (LINUX)
// Always use IOCTL in Linux

View file

@ -327,9 +327,7 @@ public:
int num = -1;
cmd->FindInt("-usecd",num,true);
int error = 0;
if (cmd->FindExist("-aspi",false)) {
MSCDEX_SetCDInterface(CDROM_USE_ASPI, num);
} else if (cmd->FindExist("-ioctl_dio",false)) {
if (cmd->FindExist("-ioctl_dio", false)) {
MSCDEX_SetCDInterface(CDROM_USE_IOCTL_DIO, num);
} else if (cmd->FindExist("-ioctl_dx",false)) {
MSCDEX_SetCDInterface(CDROM_USE_IOCTL_DX, num);
@ -1698,8 +1696,6 @@ void DOS_SetupPrograms(void) {
"The \033[33mlast\033[0m level of support depends on your Operating System:\n"
"For \033[1mWindows 2000\033[0m, \033[1mWindows XP\033[0m and \033[1mLinux\033[0m:\n"
"\033[34;1mmount d \033[0;31mD:\\\033[34;1m -t cdrom -usecd \033[33m0 \033[34m-ioctl\033[0m\n"
"For \033[1mWindows 9x\033[0m with a ASPI layer installed:\n"
"\033[34;1mmount d \033[0;31mD:\\\033[34;1m -t cdrom -usecd \033[33m0 \033[34m-aspi\033[0m\n"
"\n"
"Replace \033[0;31mD:\\\033[0m with the location of your CD-ROM.\n"
"Replace the \033[33;1m0\033[0m in \033[34;1m-usecd \033[33m0\033[0m with the number reported for your CD-ROM if you type:\n"

View file

@ -1,354 +0,0 @@
/******************************************************************************
**
** Module Name: wnaspi32.h
**
** Description: Header file for ASPI for Win32. This header includes
** macro and type declarations, and can be included without
** modification when using Borland C++ or Microsoft Visual
** C++ with 32-bit compilation. If you are using a different
** compiler then you MUST ensure that structures are packed
** onto byte alignments, and that C++ name mangling is turned
** off.
**
** Notes: This file created using 4 spaces per tab.
**
******************************************************************************/
#ifndef __WNASPI32_H__
#define __WNASPI32_H__
/*
** Make sure structures are packed and undecorated.
*/
#ifdef __BORLANDC__
#pragma option -a1
#endif //__BORLANDC__
#ifdef _MSC_VER
#pragma pack(1)
#endif //__MSC_VER
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
//*****************************************************************************
// %%% SCSI MISCELLANEOUS EQUATES %%%
//*****************************************************************************
#define SENSE_LEN 14 // Default sense buffer length
#define SRB_DIR_SCSI 0x00 // Direction determined by SCSI
#define SRB_POSTING 0x01 // Enable ASPI posting
#define SRB_ENABLE_RESIDUAL_COUNT 0x04 // Enable residual byte count reporting
#define SRB_DIR_IN 0x08 // Transfer from SCSI target to host
#define SRB_DIR_OUT 0x10 // Transfer from host to SCSI target
#define SRB_EVENT_NOTIFY 0x40 // Enable ASPI event notification
#define RESIDUAL_COUNT_SUPPORTED 0x02 // Extended buffer flag
#define MAX_SRB_TIMEOUT 108000lu // 30 hour maximum timeout in s
#define DEFAULT_SRB_TIMEOUT 108000lu // Max timeout by default
//*****************************************************************************
// %%% ASPI Command Definitions %%%
//*****************************************************************************
#define SC_HA_INQUIRY 0x00 // Host adapter inquiry
#define SC_GET_DEV_TYPE 0x01 // Get device type
#define SC_EXEC_SCSI_CMD 0x02 // Execute SCSI command
#define SC_ABORT_SRB 0x03 // Abort an SRB
#define SC_RESET_DEV 0x04 // SCSI bus device reset
#define SC_SET_HA_PARMS 0x05 // Set HA parameters
#define SC_GET_DISK_INFO 0x06 // Get Disk information
#define SC_RESCAN_SCSI_BUS 0x07 // ReBuild SCSI device map
#define SC_GETSET_TIMEOUTS 0x08 // Get/Set target timeouts
//*****************************************************************************
// %%% SRB Status %%%
//*****************************************************************************
#define SS_PENDING 0x00 // SRB being processed
#define SS_COMP 0x01 // SRB completed without error
#define SS_ABORTED 0x02 // SRB aborted
#define SS_ABORT_FAIL 0x03 // Unable to abort SRB
#define SS_ERR 0x04 // SRB completed with error
#define SS_INVALID_CMD 0x80 // Invalid ASPI command
#define SS_INVALID_HA 0x81 // Invalid host adapter number
#define SS_NO_DEVICE 0x82 // SCSI device not installed
#define SS_INVALID_SRB 0xE0 // Invalid parameter set in SRB
#define SS_OLD_MANAGER 0xE1 // ASPI manager doesn't support Windows
#define SS_BUFFER_ALIGN 0xE1 // Buffer not aligned (replaces OLD_MANAGER in Win32)
#define SS_ILLEGAL_MODE 0xE2 // Unsupported Windows mode
#define SS_NO_ASPI 0xE3 // No ASPI managers resident
#define SS_FAILED_INIT 0xE4 // ASPI for windows failed init
#define SS_ASPI_IS_BUSY 0xE5 // No resources available to execute cmd
#define SS_BUFFER_TO_BIG 0xE6 // Buffer size to big to handle!
#define SS_MISMATCHED_COMPONENTS 0xE7 // The DLLs/EXEs of ASPI don't version check
#define SS_NO_ADAPTERS 0xE8 // No host adapters to manage
#define SS_INSUFFICIENT_RESOURCES 0xE9 // Couldn't allocate resources needed to init
#define SS_ASPI_IS_SHUTDOWN 0xEA // Call came to ASPI after PROCESS_DETACH
#define SS_BAD_INSTALL 0xEB // The DLL or other components are installed wrong
//*****************************************************************************
// %%% Host Adapter Status %%%
//*****************************************************************************
#define HASTAT_OK 0x00 // Host adapter did not detect an // error
#define HASTAT_SEL_TO 0x11 // Selection Timeout
#define HASTAT_DO_DU 0x12 // Data overrun data underrun
#define HASTAT_BUS_FREE 0x13 // Unexpected bus free
#define HASTAT_PHASE_ERR 0x14 // Target bus phase sequence // failure
#define HASTAT_TIMEOUT 0x09 // Timed out while SRB was waiting to beprocessed.
#define HASTAT_COMMAND_TIMEOUT 0x0B // Adapter timed out processing SRB.
#define HASTAT_MESSAGE_REJECT 0x0D // While processing SRB, the // adapter received a MESSAGE
#define HASTAT_BUS_RESET 0x0E // A bus reset was detected.
#define HASTAT_PARITY_ERROR 0x0F // A parity error was detected.
#define HASTAT_REQUEST_SENSE_FAILED 0x10 // The adapter failed in issuing
//*****************************************************************************
// %%% SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY (0) %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_HA_INQUIRY
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 ASPI request flags
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0
BYTE HA_Count; // 08/008 Number of host adapters present
BYTE HA_SCSI_ID; // 09/009 SCSI ID of host adapter
BYTE HA_ManagerId[16]; // 0A/010 String describing the manager
BYTE HA_Identifier[16]; // 1A/026 String describing the host adapter
BYTE HA_Unique[16]; // 2A/042 Host Adapter Unique parameters
WORD HA_Rsvd1; // 3A/058 Reserved, MUST = 0
}
SRB_HAInquiry, *PSRB_HAInquiry, FAR *LPSRB_HAInquiry;
//*****************************************************************************
// %%% SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE (1) %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_GET_DEV_TYPE
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 Reserved, MUST = 0
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0
BYTE SRB_Target; // 08/008 Target's SCSI ID
BYTE SRB_Lun; // 09/009 Target's LUN number
BYTE SRB_DeviceType; // 0A/010 Target's peripheral device type
BYTE SRB_Rsvd1; // 0B/011 Reserved, MUST = 0
}
SRB_GDEVBlock, *PSRB_GDEVBlock, FAR *LPSRB_GDEVBlock;
//*****************************************************************************
// %%% SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD (2) %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_EXEC_SCSI_CMD
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 ASPI request flags
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved
BYTE SRB_Target; // 08/008 Target's SCSI ID
BYTE SRB_Lun; // 09/009 Target's LUN number
WORD SRB_Rsvd1; // 0A/010 Reserved for Alignment
DWORD SRB_BufLen; // 0C/012 Data Allocation Length
BYTE FAR *SRB_BufPointer; // 10/016 Data Buffer Pointer
BYTE SRB_SenseLen; // 14/020 Sense Allocation Length
BYTE SRB_CDBLen; // 15/021 CDB Length
BYTE SRB_HaStat; // 16/022 Host Adapter Status
BYTE SRB_TargStat; // 17/023 Target Status
VOID FAR *SRB_PostProc; // 18/024 Post routine
BYTE SRB_Rsvd2[20]; // 1C/028 Reserved, MUST = 0
BYTE CDBByte[16]; // 30/048 SCSI CDB
BYTE SenseArea[SENSE_LEN+2]; // 50/064 Request Sense buffer
}
SRB_ExecSCSICmd, *PSRB_ExecSCSICmd, FAR *LPSRB_ExecSCSICmd;
//*****************************************************************************
// %%% SRB - ABORT AN SRB - SC_ABORT_SRB (3) %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_ABORT_SRB
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 Reserved
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved
VOID FAR *SRB_ToAbort; // 08/008 Pointer to SRB to abort
}
SRB_Abort, *PSRB_Abort, FAR *LPSRB_Abort;
//*****************************************************************************
// %%% SRB - BUS DEVICE RESET - SC_RESET_DEV (4) %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_RESET_DEV
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 ASPI request flags
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved
BYTE SRB_Target; // 08/008 Target's SCSI ID
BYTE SRB_Lun; // 09/009 Target's LUN number
BYTE SRB_Rsvd1[12]; // 0A/010 Reserved for Alignment
BYTE SRB_HaStat; // 16/022 Host Adapter Status
BYTE SRB_TargStat; // 17/023 Target Status
VOID FAR *SRB_PostProc; // 18/024 Post routine
BYTE SRB_Rsvd2[36]; // 1C/028 Reserved, MUST = 0
}
SRB_BusDeviceReset, *PSRB_BusDeviceReset, FAR *LPSRB_BusDeviceReset;
//*****************************************************************************
// %%% SRB - GET DISK INFORMATION - SC_GET_DISK_INFO %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_GET_DISK_INFO
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 Reserved, MUST = 0
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0
BYTE SRB_Target; // 08/008 Target's SCSI ID
BYTE SRB_Lun; // 09/009 Target's LUN number
BYTE SRB_DriveFlags; // 0A/010 Driver flags
BYTE SRB_Int13HDriveInfo; // 0B/011 Host Adapter Status
BYTE SRB_Heads; // 0C/012 Preferred number of heads translation
BYTE SRB_Sectors; // 0D/013 Preferred number of sectors translation
BYTE SRB_Rsvd1[10]; // 0E/014 Reserved, MUST = 0
}
SRB_GetDiskInfo, *PSRB_GetDiskInfo, FAR *LPSRB_GetDiskInfo;
//*****************************************************************************
// %%% SRB - RESCAN SCSI BUS(ES) ON SCSIPORT %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_RESCAN_SCSI_BUS
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 Reserved, MUST = 0
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0
}
SRB_RescanPort, *PSRB_RescanPort, FAR *LPSRB_RescanPort;
//*****************************************************************************
// %%% SRB - GET/SET TARGET TIMEOUTS %%%
//*****************************************************************************
typedef struct // Offset
{ // HX/DEC
BYTE SRB_Cmd; // 00/000 ASPI command code = SC_GETSET_TIMEOUTS
BYTE SRB_Status; // 01/001 ASPI command status byte
BYTE SRB_HaId; // 02/002 ASPI host adapter number
BYTE SRB_Flags; // 03/003 ASPI request flags
DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0
BYTE SRB_Target; // 08/008 Target's SCSI ID
BYTE SRB_Lun; // 09/009 Target's LUN number
DWORD SRB_Timeout; // 0A/010 Timeout in half seconds
}
SRB_GetSetTimeouts, *PSRB_GetSetTimeouts, FAR *LPSRB_GetSetTimeouts;
//*****************************************************************************
// %%% ASPIBUFF - Structure For Controllng I/O Buffers %%%
//*****************************************************************************
typedef struct tag_ASPI32BUFF // Offset
{ // HX/DEC
PBYTE AB_BufPointer; // 00/000 Pointer to the ASPI allocated buffer
DWORD AB_BufLen; // 04/004 Length in bytes of the buffer
DWORD AB_ZeroFill; // 08/008 Flag set to 1 if buffer should be zeroed
DWORD AB_Reserved; // 0C/012 Reserved
}
ASPI32BUFF, *PASPI32BUFF, FAR *LPASPI32BUFF;
//*****************************************************************************
// %%% TOC structures %%%
//*****************************************************************************
typedef struct
{
unsigned char reserved1;
unsigned char cAdrCtrl;
unsigned char cTrackNum;
unsigned char reserved2;
unsigned long lAddr;
} TOC_TRACK;
typedef struct
{
unsigned short usTocDataLen;
unsigned char cFirstTrack;
unsigned char cLastTrack;
TOC_TRACK tracks[100];
} TOC, *PTOC, FAR *LPTOC;
//*****************************************************************************
// %%% PROTOTYPES - User Callable ASPI for Win32 Functions %%%
//*****************************************************************************
typedef struct
{
BYTE SRB_Cmd;
BYTE SRB_Status;
BYTE SRB_HaId;
BYTE SRB_Flags;
DWORD SRB_Hdr_Rsvd;
} SRB, *PSRB, FAR *LPSRB;
#if defined(__BORLANDC__)
DWORD _import GetASPI32SupportInfo( void );
DWORD _import SendASPI32Command( LPSRB );
BOOL _import GetASPI32Buffer( PASPI32BUFF );
BOOL _import FreeASPI32Buffer( PASPI32BUFF );
BOOL _import TranslateASPI32Address( PDWORD, PDWORD );
#elif defined(_MSC_VER)
__declspec(dllimport) DWORD GetASPI32SupportInfo( void );
__declspec(dllimport) DWORD SendASPI32Command( LPSRB );
__declspec(dllimport) BOOL GetASPI32Buffer( PASPI32BUFF );
__declspec(dllimport) BOOL FreeASPI32Buffer( PASPI32BUFF );
__declspec(dllimport) BOOL TranslateASPI32Address( PDWORD, PDWORD );
#else
extern DWORD GetASPI32SupportInfo( void );
extern DWORD GetASPI32Command( LPSRB );
extern BOOL GetASPI32Buffer( PASPI32BUFF );
extern BOOL FreeASPI32Buffer( PASPI32BUFF );
extern BOOL TranslateASPI32Address( PDWORD, PDWORD );
#endif
/*
** Restore compiler default packing and close off the C declarations.
*/
#ifdef __BORLANDC__
#pragma option -a.
#endif //__BORLANDC__
#ifdef _MSC_VER
#pragma pack()
#endif //_MSC_VER
#ifdef __cplusplus
}
#endif //__cplusplus
#endif //__WNASPI32_H__

View file

@ -152,7 +152,6 @@
<ClCompile Include="..\src\debug\debug_win32.cpp" />
<ClCompile Include="..\src\dosbox.cpp" />
<ClCompile Include="..\src\dos\cdrom.cpp" />
<ClCompile Include="..\src\dos\cdrom_aspi_win32.cpp" />
<ClCompile Include="..\src\dos\cdrom_image.cpp" />
<ClCompile Include="..\src\dos\cdrom_ioctl_win32.cpp" />
<ClCompile Include="..\src\dos\dos.cpp" />
@ -345,7 +344,6 @@
<ClInclude Include="..\src\dos\Ntddscsi.h" />
<ClInclude Include="..\src\dos\Ntddstor.h" />
<ClInclude Include="..\src\dos\scsidefs.h" />
<ClInclude Include="..\src\dos\wnaspi32.h" />
<ClInclude Include="..\src\fpu\fpu_instructions.h" />
<ClInclude Include="..\src\fpu\fpu_instructions_x86.h" />
<ClInclude Include="..\src\gui\midi_win32.h" />