diff options
author | pixel <pixel> | 2003-10-12 05:15:00 +0000 |
---|---|---|
committer | pixel <pixel> | 2003-10-12 05:15:00 +0000 |
commit | 7787631c6ee37a489732c95cb0864422e3a3bdd1 (patch) | |
tree | 4f6374a3dcc58661ea7b116e2b87cdf84e14e414 /lib/cdreader.cpp | |
parent | 7cf5187c0a8cedba390a5455b63ed4ecf867be32 (diff) |
AT LAST!!!
Windows 2k/XP CD reading works using raw ioctls!!!!
HURRAY!!!!!!!!
Diffstat (limited to 'lib/cdreader.cpp')
-rw-r--r-- | lib/cdreader.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/cdreader.cpp b/lib/cdreader.cpp index 32e815f..5e88e98 100644 --- a/lib/cdreader.cpp +++ b/lib/cdreader.cpp @@ -12,6 +12,7 @@ #else #define _(x) x #endif +#include "cdabstract.h" bool cdreader::CanWrite() const { return 0; @@ -120,5 +121,60 @@ void cdreader::getsector(void *buf, int sec) throw (GeneralException) { sector++; } +#endif + +#if defined (_MSC_VER) || defined (__MINGW32__) +cdreader::cdreader(const String & no) throw (GeneralException) : + Handle(-1), n(no), sector(0) { + if (!(hF = cdabstract::OpenIOCTLFile(no[0]))) + throw GeneralException("Error opening device " + no); +} + +cdreader::cdreader(const cdreader & i) : Handle(i), n(i.n), hF(i.hF) { +} + +void cdreader::close() throw (GeneralException) { + CloseHandle(hF); +} + +typedef enum _TRACK_MODE_TYPE {
+ YellowMode2,
+ XAForm2,
+ CDDA
+} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
+ +typedef struct _RAW_READ_INFO {
+ LARGE_INTEGER DiskOffset;
+ ULONG SectorCount;
+ TRACK_MODE_TYPE TrackMode;
+} RAW_READ_INFO, *PRAW_READ_INFO; + +void cdreader::getsector(void *buf, int sec) throw (GeneralException) { + RAW_READ_INFO rawIOCTL;
+ DWORD dwRet;
+ BOOL bStat;
+ bool done = false;
+ if (sec >= 0) + sector = sec; +
+ rawIOCTL.DiskOffset.QuadPart = sector * 2048;
+ rawIOCTL.SectorCount = 1;
+ rawIOCTL.TrackMode = YellowMode2;
+
+ while (!done) {
+ SetLastError(0);
+ bStat = DeviceIoControl(hF, IOCTL_CDROM_RAW_READ,
+ &rawIOCTL, sizeof(RAW_READ_INFO),
+ buf, 2352, &dwRet, NULL);
+ if (!bStat) {
+ DWORD dwErrCode = GetLastError();
+ if (dwErrCode != ERROR_IO_PENDING) {
+ throw GeneralException("Gave up on reading CD");
+ }
+ } else {
+ done = true;
+ }
+ }
+} #endif |