CDROM.cpp

Go to the documentation of this file.
00001 //===========================================================================
00002 //Copyright (C) 2004 Zentaro Kavanagh
00003 //
00004 //Redistribution and use in source and binary forms, with or without
00005 //modification, are permitted provided that the following conditions
00006 //are met:
00007 //
00008 //- Redistributions of source code must retain the above copyright
00009 //  notice, this list of conditions and the following disclaimer.
00010 //
00011 //- Redistributions in binary form must reproduce the above copyright
00012 //  notice, this list of conditions and the following disclaimer in the
00013 //  documentation and/or other materials provided with the distribution.
00014 //
00015 //- Neither the name of Zentaro Kavanagh nor the names of contributors 
00016 //  may be used to endorse or promote products derived from this software 
00017 //  without specific prior written permission.
00018 //
00019 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00020 //``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00021 //LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00022 //PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
00023 //CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00024 //EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00025 //PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00026 //PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00027 //LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00028 //NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00029 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 //===========================================================================
00031 
00032 #include "stdafx.h"
00033 #include "cdrom.h"
00034 
00035 CDROM::CDROM(void)
00036         :       mDriveHandle(INVALID_HANDLE_VALUE)
00037 {
00038 }
00039 
00040 CDROM::~CDROM(void)
00041 {
00042 }
00043 
00044 //IOCTL_CDROM_GET_DRIVE_GEOMETRY
00045 
00046 DISK_GEOMETRY* CDROM::getDiskGeom() {
00047         
00048         if (mDriveHandle == INVALID_HANDLE_VALUE) {
00049                 return NULL;
00050         }
00051 
00052         DWORD locBytesRead = 0;
00053         
00054         BOOL locRet = DeviceIoControl(  mDriveHandle,
00055                                                                         IOCTL_CDROM_GET_DRIVE_GEOMETRY,
00056                                                                         NULL,
00057                                                                         0,
00058                                                                         &mGeom,
00059                                                                         sizeof(mGeom),
00060                                                                         &locBytesRead,
00061                                                                         NULL);
00062 
00063         if (locRet == FALSE) {
00064                 CloseHandle(mDriveHandle);
00065                 mDriveHandle = INVALID_HANDLE_VALUE;
00066                 return NULL;
00067         }
00068 
00069         return &mGeom;
00070 
00071 }
00072 int CDROM::ejectDraw() {
00073         if (mDriveHandle == INVALID_HANDLE_VALUE) {
00074                 return NO_DRIVE_HANDLE;
00075         }
00076 
00077         DWORD locBytesRead = 0;
00078         BOOL locRet = DeviceIoControl(  mDriveHandle,
00079                                                                         IOCTL_STORAGE_EJECT_MEDIA,
00080                                                                         NULL,
00081                                                                         0,
00082                                                                         NULL,
00083                                                                         0,
00084                                                                         &locBytesRead,
00085                                                                         NULL);
00086 
00087         if (locRet == FALSE) {
00088                 CloseHandle(mDriveHandle);
00089                 mDriveHandle = INVALID_HANDLE_VALUE;
00090                 return READ_TOC_FAILED;
00091         }
00092         return 0;
00093 }
00094 int CDROM::closeDraw() {
00095         return 0;
00096 }
00097 
00098 
00099 int CDROM::initDrive(string inDrive) {
00100         //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp
00101 
00102         //HANDLE CreateFile(
00103         //      LPCTSTR lpFileName,
00104         //      DWORD dwDesiredAccess,
00105         //      DWORD dwShareMode,
00106         //      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
00107         //      DWORD dwCreationDisposition,
00108         //      DWORD dwFlagsAndAttributes,
00109         //      HANDLE hTemplateFile
00110         //);
00111 
00112         if ((inDrive.length() != 2) || (inDrive[1] != ':')) {
00113                 return INVALID_DRIVE_STRING;
00114         }
00115 
00116         if (mDriveHandle != INVALID_HANDLE_VALUE) {
00117                 CloseHandle(mDriveHandle);
00118                 mDriveHandle = INVALID_HANDLE_VALUE;
00119         }
00120 
00121         string locDeviceString = "\\\\.\\"+inDrive;
00122 
00123         mDriveHandle = CreateFile(      locDeviceString.c_str(),
00124                                                                 GENERIC_READ,
00125                                                                 FILE_SHARE_READ,
00126                                                                 NULL,
00127                                                                 OPEN_EXISTING,
00128                                                                 FILE_ATTRIBUTE_READONLY,
00129                                                                 NULL);
00130 
00131         if (mDriveHandle == INVALID_HANDLE_VALUE) {
00132                 return CREATE_HANDLE_FAILED;
00133         }
00134 
00135         
00136         return 0;
00137 }
00138 
00139 int CDROM::readTOC() {
00140 
00141         //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/deviceiocontrol.asp
00142 
00143         //BOOL DeviceIoControl(
00144         //      HANDLE hDevice,
00145         //      DWORD dwIoControlCode,
00146         //      LPVOID lpInBuffer,
00147         //      DWORD nInBufferSize,
00148         //      LPVOID lpOutBuffer,
00149         //      DWORD nOutBufferSize,
00150         //      LPDWORD lpBytesReturned,
00151         //      LPOVERLAPPED lpOverlapped
00152         //);
00153 
00154         //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/storage/hh/storage/k307_8e0f2b70-edd0-424e-abb4-a81ea9f382fe.xml.asp
00155 
00156         //typedef struct _CDROM_TOC {
00157         //      UCHAR  Length[2];
00158         //      UCHAR  FirstTrack;
00159         //      UCHAR  LastTrack;
00160         //      TRACK_DATA  TrackData[MAXIMUM_NUMBER_TRACKS];
00161         //} CDROM_TOC, *PCDROM_TOC;
00162 
00163         if (mDriveHandle == INVALID_HANDLE_VALUE) {
00164                 return NO_DRIVE_HANDLE;
00165         }
00166 
00167         DWORD locBytesRead = 0;
00168         BOOL locRet = DeviceIoControl(  mDriveHandle,
00169                                                                         IOCTL_CDROM_READ_TOC,
00170                                                                         NULL,
00171                                                                         0,
00172                                                                         &mTOC,
00173                                                                         sizeof(CDROM_TOC),
00174                                                                         &locBytesRead,
00175                                                                         NULL);
00176 
00177         if (locRet == FALSE) {
00178                 CloseHandle(mDriveHandle);
00179                 mDriveHandle = INVALID_HANDLE_VALUE;
00180                 return READ_TOC_FAILED;
00181         }
00182 
00183         return 0;
00184                                                                         
00185 
00186 }
00187 
00188 CDROM_TOC* CDROM::getTOC() {
00189         return &mTOC;
00190 
00191 
00192 }

Generated on Tue Feb 15 14:54:22 2005 for oggdsf by  doxygen 1.3.9