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:
parent
d82766930f
commit
e43f83a68a
9 changed files with 8 additions and 1198 deletions
12
README
12
README
|
@ -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)
|
||||
|
|
|
@ -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".
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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 *)⊂
|
||||
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
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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__
|
|
@ -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" />
|
||||
|
|
Loading…
Add table
Reference in a new issue