added reading of cooked sectors
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@941
This commit is contained in:
parent
a085299cd3
commit
38bc54fbd9
2 changed files with 23 additions and 54 deletions
|
@ -675,13 +675,6 @@ bool CDROM_Interface_Aspi::ReadSectors(void* buffer, bool raw, unsigned long sec
|
|||
|
||||
memset(&s,0,sizeof(s));
|
||||
|
||||
// FIXME : Is there a method to get cooked sectors with aspi ???
|
||||
// all combination i tried were failing.
|
||||
// so we have to allocate extra mem and copy data to buffer if in cooked mode
|
||||
char* inPtr = (char*)buffer;
|
||||
if (!raw) inPtr = new char[num*2352];
|
||||
if (!inPtr) return false;
|
||||
|
||||
s.SRB_Cmd = SC_EXEC_SCSI_CMD;
|
||||
s.SRB_HaId = haId;
|
||||
s.SRB_Target = target;
|
||||
|
@ -689,8 +682,8 @@ bool CDROM_Interface_Aspi::ReadSectors(void* buffer, bool raw, unsigned long sec
|
|||
s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
|
||||
s.SRB_SenseLen = SENSE_LEN;
|
||||
|
||||
s.SRB_BufLen = 2352*num; //num*(raw?2352:2048);
|
||||
s.SRB_BufPointer = (BYTE FAR*)inPtr;
|
||||
s.SRB_BufLen = raw?2352*num:2048*num;
|
||||
s.SRB_BufPointer = (BYTE FAR*)buffer;
|
||||
s.SRB_CDBLen = 12;
|
||||
s.SRB_PostProc = (LPVOID)hEvent;
|
||||
|
||||
|
@ -712,24 +705,7 @@ bool CDROM_Interface_Aspi::ReadSectors(void* buffer, bool raw, unsigned long sec
|
|||
|
||||
CloseHandle(hEvent);
|
||||
|
||||
if (s.SRB_Status!=SS_COMP) {
|
||||
if (!raw) delete[] inPtr;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!raw) {
|
||||
// copy user data to buffer
|
||||
char* source = inPtr;
|
||||
source+=16; // jump 16 bytes
|
||||
char* outPtr = (char*)buffer;
|
||||
for (unsigned long i=0; i<num; i++) {
|
||||
memcpy(outPtr,source,2048);
|
||||
outPtr+=COOKED_SECTOR_SIZE;
|
||||
source+=RAW_SECTOR_SIZE;
|
||||
};
|
||||
delete[] inPtr;
|
||||
};
|
||||
return true;
|
||||
return (s.SRB_Status==SS_COMP);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <windows.h>
|
||||
#include <winioctl.h> // Ioctl stuff
|
||||
#include <io.h>
|
||||
#include "ntddcdrm.h" // Ioctl stuff
|
||||
#include "cdrom.h"
|
||||
|
||||
|
@ -207,35 +208,27 @@ bool CDROM_Interface_Ioctl::LoadUnloadMedia(bool unload)
|
|||
|
||||
bool CDROM_Interface_Ioctl::ReadSectors(void* buffer, bool raw, unsigned long sector, unsigned long num)
|
||||
{
|
||||
// TODO : How to copy cooked without current overhead ?
|
||||
BOOL bStat;
|
||||
DWORD byteCount;
|
||||
RAW_READ_INFO in;
|
||||
char* inPtr;
|
||||
|
||||
in.DiskOffset.LowPart = sector;
|
||||
in.DiskOffset.HighPart = 0;
|
||||
in.SectorCount = num;
|
||||
in.TrackMode = CDDA;
|
||||
|
||||
if (!raw) inPtr = new char[num*RAW_SECTOR_SIZE];
|
||||
else inPtr = (char*)buffer;
|
||||
|
||||
bStat = DeviceIoControl(hIOCTL,IOCTL_CDROM_RAW_READ, &in, sizeof(in),
|
||||
inPtr, num*RAW_SECTOR_SIZE, &byteCount,NULL);
|
||||
BOOL bStat;
|
||||
DWORD byteCount = 0;
|
||||
|
||||
Open();
|
||||
if (!raw) {
|
||||
char* source = inPtr;
|
||||
source+=16; // jump 16 bytes
|
||||
char* outPtr = (char*)buffer;
|
||||
for (unsigned long i=0; i<num; i++) {
|
||||
memcpy(outPtr,source,COOKED_SECTOR_SIZE);
|
||||
outPtr+=COOKED_SECTOR_SIZE;
|
||||
source+=RAW_SECTOR_SIZE;
|
||||
};
|
||||
delete[] inPtr;
|
||||
};
|
||||
|
||||
// Cooked
|
||||
int success = 0;
|
||||
DWORD newPos = SetFilePointer(hIOCTL, sector*COOKED_SECTOR_SIZE, 0, FILE_BEGIN);
|
||||
if (newPos != 0xFFFFFFFF) success = ReadFile(hIOCTL, buffer, num*COOKED_SECTOR_SIZE, &byteCount, NULL);
|
||||
bStat = (success!=0);
|
||||
} else {
|
||||
// Raw
|
||||
RAW_READ_INFO in;
|
||||
in.DiskOffset.LowPart = sector;
|
||||
in.DiskOffset.HighPart = 0;
|
||||
in.SectorCount = num;
|
||||
in.TrackMode = CDDA;
|
||||
bStat = DeviceIoControl(hIOCTL,IOCTL_CDROM_RAW_READ, &in, sizeof(in),
|
||||
buffer, num*RAW_SECTOR_SIZE, &byteCount,NULL);
|
||||
}
|
||||
Close();
|
||||
return (byteCount!=num*RAW_SECTOR_SIZE) && (bStat>0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue