- variable bUseASPI must be a member of the cdrom object

- report WNASPI32.DLL version (some versions are not working properly)
- new variable isWindowsXP added (for future enhancements)
- PVR address in TOC for image files fixed (SF patch #977900 from Ben Lunt)
- converted tabs to spaces in modified sections
This commit is contained in:
Volker Ruppert 2004-08-22 16:23:35 +00:00
parent 0ae22a3daf
commit 2d695b4d74
2 changed files with 95 additions and 92 deletions

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// $Id: cdrom.cc,v 1.69 2004-06-19 15:20:10 sshwarts Exp $ // $Id: cdrom.cc,v 1.70 2004-08-22 16:23:34 vruppert Exp $
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2002 MandrakeSoft S.A. // Copyright (C) 2002 MandrakeSoft S.A.
@ -177,7 +177,8 @@ BOOL (*TranslateASPI32Address)(PDWORD,PDWORD);
DWORD (*GetASPI32DLLVersion)(void); DWORD (*GetASPI32DLLVersion)(void);
static BOOL bUseASPI = FALSE; static OSVERSIONINFO osinfo;
static BOOL isWindowsXP;
static BOOL bHaveDev; static BOOL bHaveDev;
static UINT cdromCount = 0; static UINT cdromCount = 0;
static HINSTANCE hASPI = NULL; static HINSTANCE hASPI = NULL;
@ -468,11 +469,17 @@ cdrom_interface::cdrom_interface(char *dev)
path = strdup(dev); path = strdup(dev);
} }
using_file=0; using_file=0;
#ifdef WIN32
bUseASPI = FALSE;
osinfo.dwOSVersionInfoSize = sizeof(osinfo);
GetVersionEx(&osinfo);
isWindowsXP = (osinfo.dwMajorVersion >= 5) && (osinfo.dwMinorVersion >= 1);
#endif
} }
void void
cdrom_interface::init(void) { cdrom_interface::init(void) {
BX_DEBUG(("Init $Id: cdrom.cc,v 1.69 2004-06-19 15:20:10 sshwarts Exp $")); BX_DEBUG(("Init $Id: cdrom.cc,v 1.70 2004-08-22 16:23:34 vruppert Exp $"));
BX_INFO(("file = '%s'",path)); BX_INFO(("file = '%s'",path));
} }
@ -498,97 +505,92 @@ cdrom_interface::insert_cdrom(char *dev)
if (dev != NULL) path = strdup(dev); if (dev != NULL) path = strdup(dev);
BX_INFO (("load cdrom with path=%s", path)); BX_INFO (("load cdrom with path=%s", path));
#ifdef WIN32 #ifdef WIN32
char drive[256]; char drive[256];
OSVERSIONINFO osi; if ( (path[1] == ':') && (strlen(path) == 2) )
if ( (path[1] == ':') && (strlen(path) == 2) ) {
{ if(osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
osi.dwOSVersionInfoSize = sizeof(osi); // Use direct device access under windows NT/2k
GetVersionEx(&osi);
if(osi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
// Use direct device access under windows NT/2k
// With all the backslashes it's hard to see, but to open D: drive // With all the backslashes it's hard to see, but to open D: drive
// the name would be: \\.\d: // the name would be: \\.\d:
sprintf(drive, "\\\\.\\%s", path); sprintf(drive, "\\\\.\\%s", path);
using_file = 0; using_file = 0;
BX_INFO (("Using direct access for cdrom.")); BX_INFO (("Using direct access for cdrom."));
// This trick only works for Win2k and WinNT, so warn the user of that. // This trick only works for Win2k and WinNT, so warn the user of that.
} else { } else {
BX_INFO(("Using ASPI for cdrom. Drive letters are unused yet.")); BX_INFO(("Using ASPI for cdrom. Drive letters are unused yet."));
bUseASPI = TRUE; bUseASPI = TRUE;
}
} }
else }
{ else
strcpy(drive,path); {
using_file = 1; strcpy(drive,path);
bUseASPI = FALSE; using_file = 1;
BX_INFO (("Opening image file as a cd")); BX_INFO (("Opening image file as a cd"));
}
if(bUseASPI) {
DWORD d;
UINT cdr, cnt, max;
UINT i, j, k;
SRB_HAInquiry sh;
SRB_GDEVBlock sd;
if (!hASPI) {
hASPI = LoadLibrary("WNASPI32.DLL");
if (hASPI) {
SendASPI32Command = (DWORD(*)(LPSRB))GetProcAddress( hASPI, "SendASPI32Command" );
GetASPI32DLLVersion = (DWORD(*)(void))GetProcAddress( hASPI, "GetASPI32DLLVersion" );
GetASPI32SupportInfo = (DWORD(*)(void))GetProcAddress( hASPI, "GetASPI32SupportInfo" );
d = GetASPI32DLLVersion();
BX_INFO(("WNASPI32.DLL version %d.%02d initialized", d & 0xff, (d >> 8) & 0xff));
} else {
BX_PANIC(("Could not load ASPI drivers, so cdrom access will fail"));
return false;
}
} }
if(bUseASPI) { cdr = 0;
DWORD d; bHaveDev = FALSE;
UINT cdr, cnt, max; d = GetASPI32SupportInfo();
UINT i, j, k; cnt = LOBYTE(LOWORD(d));
SRB_HAInquiry sh; for(i = 0; i < cnt; i++) {
SRB_GDEVBlock sd; memset(&sh, 0, sizeof(sh));
if (!hASPI) { sh.SRB_Cmd = SC_HA_INQUIRY;
hASPI = LoadLibrary("WNASPI32.DLL"); sh.SRB_HaId = i;
} SendASPI32Command((LPSRB)&sh);
if(hASPI) { if(sh.SRB_Status != SS_COMP)
SendASPI32Command = (DWORD(*)(LPSRB))GetProcAddress( hASPI, "SendASPI32Command" ); continue;
GetASPI32DLLVersion = (DWORD(*)(void))GetProcAddress( hASPI, "GetASPI32DLLVersion" );
GetASPI32SupportInfo = (DWORD(*)(void))GetProcAddress( hASPI, "GetASPI32SupportInfo" );
// BX_INFO(("Using first CDROM. Please upgrade your ASPI drivers to version 4.01 or later if you wish to specify a cdrom driver."));
cdr = 0;
bHaveDev = FALSE;
d = GetASPI32SupportInfo();
cnt = LOBYTE(LOWORD(d));
for(i = 0; i < cnt; i++) {
memset(&sh, 0, sizeof(sh));
sh.SRB_Cmd = SC_HA_INQUIRY;
sh.SRB_HaId = i;
SendASPI32Command((LPSRB)&sh);
if(sh.SRB_Status != SS_COMP)
continue;
max = (int)sh.HA_Unique[3]; max = (int)sh.HA_Unique[3];
for(j = 0; j < max; j++) { for(j = 0; j < max; j++) {
for(k = 0; k < 8; k++) { for(k = 0; k < 8; k++) {
memset(&sd, 0, sizeof(sd)); memset(&sd, 0, sizeof(sd));
sd.SRB_Cmd = SC_GET_DEV_TYPE; sd.SRB_Cmd = SC_GET_DEV_TYPE;
sd.SRB_HaId = i; sd.SRB_HaId = i;
sd.SRB_Target = j; sd.SRB_Target = j;
sd.SRB_Lun = k; sd.SRB_Lun = k;
SendASPI32Command((LPSRB)&sd); SendASPI32Command((LPSRB)&sd);
if(sd.SRB_Status == SS_COMP) { if(sd.SRB_Status == SS_COMP) {
if(sd.SRB_DeviceType == DTYPE_CDROM) { if(sd.SRB_DeviceType == DTYPE_CDROM) {
cdr++; cdr++;
if(cdr > cdromCount) { if(cdr > cdromCount) {
hid = i; hid = i;
tid = j; tid = j;
lun = k; lun = k;
cdromCount++; cdromCount++;
bHaveDev = TRUE; bHaveDev = TRUE;
} }
} }
} }
if(bHaveDev) break; if(bHaveDev) break;
} }
if(bHaveDev) break; if(bHaveDev) break;
} }
}
} fd=1;
} else { } else {
BX_PANIC(("Could not load ASPI drivers, so cdrom access will fail")); hFile=CreateFile((char *)&drive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
} if (hFile !=(void *)0xFFFFFFFF)
fd=1; fd=1;
} else { }
BX_INFO(("Using direct access for CDROM"));
hFile=CreateFile((char *)&drive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
if (hFile !=(void *)0xFFFFFFFF)
fd=1;
}
#elif defined(__APPLE__) #elif defined(__APPLE__)
if(strcmp(path, "drive") == 0) if(strcmp(path, "drive") == 0)
{ {
@ -760,7 +762,7 @@ cdrom_interface::read_toc(uint8* buf, int* length, bx_bool msf, int start_track)
buf[len++] = 0; buf[len++] = 0;
buf[len++] = 0; buf[len++] = 0;
buf[len++] = 0; buf[len++] = 0;
buf[len++] = 0; // logical sector 0 buf[len++] = 16; // logical sector 0
} }
} }

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// $Id: cdrom.h,v 1.13 2003-08-19 00:37:03 cbothamy Exp $ // $Id: cdrom.h,v 1.14 2004-08-22 16:23:35 vruppert Exp $
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// //
// Copyright (C) 2002 MandrakeSoft S.A. // Copyright (C) 2002 MandrakeSoft S.A.
@ -58,6 +58,7 @@ private:
int using_file; int using_file;
#ifdef WIN32 #ifdef WIN32
BOOL bUseASPI;
HANDLE hFile; HANDLE hFile;
int hid; int hid;
int tid; int tid;