read10.c
上传用户:xmgzy123
上传日期:2007-01-07
资源大小:373k
文件大小:10k
源码类别:

SCSI/ASPI

开发平台:

WINDOWS

  1. /*
  2.  * read10.c - Copyright (C) 1999 Jay A. Key
  3.  *
  4.  * Functions for the CDR_READ10 class of read/init/deinit functions
  5.  *
  6.  **********************************************************************
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU Lesser General Public License as published
  10.  * by the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21.  *
  22.  **********************************************************************
  23.  *
  24.  * $Id: read10.c,v 1.2 2000/02/25 10:47:37 akey Exp $
  25.  * $Date: 2000/02/25 10:47:37 $
  26.  * $Locker:  $
  27.  * $Log: read10.c,v $
  28.  * Revision 1.2  2000/02/25 10:47:37  akey
  29.  * sync'ed with akrip32.dll v0.94
  30.  *
  31.  * Revision 1.3  2000/02/14 09:56:25  akey
  32.  * cleaned up #ifdef _DEBUG code considerably
  33.  *
  34.  * Revision 1.2  2000/01/03 12:29:43  akey
  35.  * v0.91 release -- added CDDB and bug fixes
  36.  *
  37.  *
  38.  */
  39. #define _AKRIP32_
  40. #include <windows.h>
  41. #include <stdio.h>
  42. #include "myaspi32.h"
  43. #include "scsidefs.h"
  44. #include "aspilib.h"
  45. #include "akrip32.h"
  46. extern CDHANDLEREC *cdHandles;
  47. extern HANDLE *cdMutexes;
  48. extern CRITICAL_SECTION getHandle;
  49. extern int alErrCode;
  50. extern BYTE alAspiErr;
  51. extern int *nextHandle;
  52. extern DWORD (*pfnSendASPI32Command)(LPSRB);
  53. DWORD deinitREAD10( HCDROM hCD );
  54. /***************************************************************************
  55.  * initREAD10
  56.  ***************************************************************************/
  57. DWORD initREAD10_2( HCDROM hCD )
  58. {
  59.   DWORD dwStatus;
  60.   HANDLE heventSRB;
  61.   SRB_ExecSCSICmd s;
  62.   int idx = (int)hCD - 1;
  63.   int i;
  64.   BYTE init1[] = { 0, 0, 0, 0x08, 0, 0, 0, 0, 0, 0, 0x09, 0x30, 0x23, 6, 0, 0, 0, 0, 0, 0x80 };
  65.   BYTE init2[] =
  66.     { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 };
  67.   if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
  68.     {
  69.       alErrCode = ALERR_INVHANDLE;
  70.       return SS_ERR;
  71.     }
  72. #if 0
  73.   dwStatus = pauseResumeCD( hCD, TRUE );
  74.   if ( dwStatus != SS_COMP )
  75.     {
  76.       return dwStatus;
  77.     }
  78.   dwStatus = startStopUnit( hCD, TRUE, TRUE );
  79.   if ( dwStatus != SS_COMP )
  80.     {
  81.       return dwStatus;
  82.     }
  83. #endif
  84.   for( i = 0; i < 2; i++ )
  85.     {
  86.       heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );
  87.       memset( &s, 0, sizeof( s ) );
  88.       s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  89.       s.SRB_HaID       = cdHandles[idx].ha;
  90.       s.SRB_Target     = cdHandles[idx].tgt;
  91.       s.SRB_Lun        = cdHandles[idx].lun;
  92.       //      s.SRB_Flags      = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT;
  93.       s.SRB_Flags      = SRB_EVENT_NOTIFY;
  94.       s.SRB_BufLen     = 0x14;
  95.       s.SRB_BufPointer = (i==0)?init1:init2;
  96.       s.SRB_SenseLen   = SENSE_LEN;
  97.       s.SRB_CDBLen     = 6;
  98.       s.SRB_PostProc   = (LPVOID)heventSRB;
  99.       s.CDBByte[0]     = 0x15;         /* mode select (6) */
  100.       s.CDBByte[1]     = 0x10;         /* no save */
  101.       s.CDBByte[4]     = 0x14;         /* buffer length */
  102.       ResetEvent( heventSRB );
  103.       dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  104.       if ( dwStatus == SS_PENDING )
  105. {
  106.   WaitForSingleObject( heventSRB, DEFWAITLEN );
  107. }
  108.       CloseHandle( heventSRB );
  109.       if ( s.SRB_Status != SS_COMP )
  110. {
  111. #ifdef _DEBUG
  112.   dbprintf( "akrip32: init10: #%d failed -> 0x%04X", i, s.SRB_Status );
  113. #endif
  114.   alErrCode = ALERR_ASPI;
  115.   alAspiErr = s.SRB_Status;
  116.   return SS_ERR;
  117. }
  118.     }
  119.   cdHandles[idx].pfnDeinit = deinitREAD10;
  120.   return s.SRB_Status;
  121. }
  122. /***************************************************************************
  123.  * initREAD10
  124.  * -- try a shorter version of the mode select ...
  125.  ***************************************************************************/
  126. DWORD initREAD10( HCDROM hCD )
  127. {
  128.   DWORD dwStatus;
  129.   HANDLE heventSRB;
  130.   SRB_ExecSCSICmd s;
  131.   int idx = (int)hCD - 1;
  132.   //  int i;
  133.   BYTE init1[] = { 0, 0, 0, 0x08, 0, 0, 0, 0, 0, 0, 0x09, 0x30 };
  134.   if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
  135.     {
  136.       alErrCode = ALERR_INVHANDLE;
  137.       return SS_ERR;
  138.     }
  139. #if 0
  140.   dwStatus = pauseResumeCD( hCD, TRUE );
  141.   if ( dwStatus != SS_COMP )
  142.     {
  143.       return dwStatus;
  144.     }
  145.   dwStatus = startStopUnit( hCD, TRUE, TRUE );
  146.   if ( dwStatus != SS_COMP )
  147.     {
  148.       return dwStatus;
  149.     }
  150. #endif
  151.   heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );
  152.   memset( &s, 0, sizeof( s ) );
  153.   s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  154.   s.SRB_HaID       = cdHandles[idx].ha;
  155.   s.SRB_Target     = cdHandles[idx].tgt;
  156.   s.SRB_Lun        = cdHandles[idx].lun;
  157.   s.SRB_Flags      = SRB_EVENT_NOTIFY;
  158.   s.SRB_BufLen     = 0x0C;
  159.   s.SRB_BufPointer = init1;
  160.   s.SRB_SenseLen   = SENSE_LEN;
  161.   s.SRB_CDBLen     = 6;
  162.   s.SRB_PostProc   = (LPVOID)heventSRB;
  163.   s.CDBByte[0]     = 0x15;         /* mode select (6) */
  164.   s.CDBByte[4]     = 0x0C;         /* buffer length */
  165.   ResetEvent( heventSRB );
  166.   dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  167.   if ( dwStatus == SS_PENDING )
  168.     {
  169.       WaitForSingleObject( heventSRB, DEFWAITLEN );
  170.     }
  171.   CloseHandle( heventSRB );
  172.   if ( s.SRB_Status != SS_COMP )
  173.     {
  174. #ifdef _DEBUG
  175.       dbprintf( "akrip32: init10 failed -> 0x%04X", s.SRB_Status );
  176. #endif
  177.       alErrCode = ALERR_ASPI;
  178.       alAspiErr = s.SRB_Status;
  179.       return SS_ERR;
  180.     }
  181.   cdHandles[idx].pfnDeinit = deinitREAD10;
  182.   return s.SRB_Status;
  183. }
  184. /***************************************************************************
  185.  * deinitREAD10
  186.  ***************************************************************************/
  187. DWORD deinitREAD10( HCDROM hCD )
  188. {
  189.   DWORD dwStatus;
  190.   HANDLE heventSRB;
  191.   SRB_ExecSCSICmd s;
  192.   int idx = (int)hCD - 1;
  193.   BYTE init1[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 };
  194.   if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
  195.     {
  196.       alErrCode = ALERR_INVHANDLE;
  197.       return SS_ERR;
  198.     }
  199.   cdHandles[idx].bInit = FALSE;
  200.   heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );
  201.   memset( &s, 0, sizeof( s ) );
  202.   s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  203.   s.SRB_HaID       = cdHandles[idx].ha;
  204.   s.SRB_Target     = cdHandles[idx].tgt;
  205.   s.SRB_Lun        = cdHandles[idx].lun;
  206.   s.SRB_Flags      = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT;
  207.   s.SRB_BufLen     = 0x0C;
  208.   s.SRB_BufPointer = init1;
  209.   s.SRB_SenseLen   = SENSE_LEN;
  210.   s.SRB_CDBLen     = 6;
  211.   s.SRB_PostProc   = (LPVOID)heventSRB;
  212.   s.CDBByte[0]     = 0x15;
  213.   s.CDBByte[4]     = 0x0C;
  214.   ResetEvent( heventSRB );
  215.   dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  216.   if ( dwStatus == SS_PENDING )
  217.     {
  218.       WaitForSingleObject( heventSRB, DEFWAITLEN );
  219.     }
  220.   CloseHandle( heventSRB );
  221.   if ( s.SRB_Status != SS_COMP )
  222.     {
  223.       alErrCode = ALERR_ASPI;
  224.       alAspiErr = s.SRB_Status;
  225.       return SS_ERR;
  226.     }
  227.   return s.SRB_Status;
  228. }
  229. /***************************************************************************
  230.  * readCDAudioLBA_READ10
  231.  ***************************************************************************/
  232. DWORD readCDAudioLBA_READ10( HCDROM hCD, LPTRACKBUF t )
  233. {
  234.   DWORD dwStatus;
  235.   HANDLE heventSRB;
  236.   SRB_ExecSCSICmd s;
  237.   int idx = (int)hCD - 1;
  238.   if ( (idx<0) || (idx>=MAXCDHAND) || !cdHandles[idx].used )
  239.     {
  240.       alErrCode = ALERR_INVHANDLE;
  241.       return SS_ERR;
  242.     }
  243.   if ( t->numFrames * 2352 > t->maxLen )
  244.     {
  245.       alErrCode = ALERR_BUFTOOSMALL;
  246.       return SS_ERR;
  247.     }
  248.   if ( !cdHandles[idx].bInit )
  249.     {
  250.       if ( cdHandles[idx].readType == CDR_READ10_2 )
  251. {
  252.   if ( initREAD10_2( hCD ) != SS_COMP )
  253.     return SS_ERR;
  254. }
  255.       else
  256. {
  257.   if ( initREAD10( hCD ) != SS_COMP )
  258.     return SS_ERR;
  259. }
  260.       cdHandles[idx].bInit = TRUE;
  261.     }
  262.   heventSRB = CreateEvent( NULL, TRUE, FALSE, NULL );
  263.   memset( &s, 0, sizeof( s ) );
  264.   s.SRB_Cmd        = SC_EXEC_SCSI_CMD;
  265.   s.SRB_HaID       = cdHandles[idx].ha;
  266.   s.SRB_Target     = cdHandles[idx].tgt;
  267.   s.SRB_Lun        = cdHandles[idx].lun;
  268.   s.SRB_Flags      = SRB_DIR_IN | SRB_EVENT_NOTIFY;
  269.   s.SRB_BufLen     = t->maxLen;
  270.   s.SRB_BufPointer = &(t->buf[0]);
  271.   s.SRB_SenseLen   = SENSE_LEN;
  272.   s.SRB_CDBLen     = 10;
  273.   s.SRB_PostProc   = (LPVOID)heventSRB;
  274.   s.CDBByte[0]     = 0x28;                 // read10
  275.   s.CDBByte[1]     = cdHandles[idx].lun << 5;
  276.   s.CDBByte[3]     = (t->startFrame >> 16) & 0xFF;
  277.   s.CDBByte[4]     = (t->startFrame >> 8) & 0xFF;
  278.   s.CDBByte[5]     = t->startFrame & 0xFF;
  279.   s.CDBByte[8]     = t->numFrames & 0xFF;
  280.   ResetEvent( heventSRB );
  281.   dwStatus = pfnSendASPI32Command( (LPSRB)&s );
  282.   if ( dwStatus == SS_PENDING )
  283.     {
  284.       WaitForSingleObject( heventSRB, DEFWAITLEN );
  285.     }
  286.   CloseHandle( heventSRB );
  287.   if ( s.SRB_Status != SS_COMP )
  288.     {
  289. #ifdef _DEBUG
  290.       BYTE *p;
  291.       dbprintf( "akrip32: readCDAudioLBA_READ10: ERROR! 0x%08Xn", s.SRB_Status );
  292.       dbprintf( "akrip32:  haStat == %d (0x%04X), tgtStat == %d (0x%04X)",
  293.        s.SRB_HaStat, s.SRB_HaStat, s.SRB_TargStat, s.SRB_TargStat );
  294.       p = s.SenseArea;
  295.       dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
  296.        p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
  297.       p = &(s.SenseArea[8]);
  298.       dbprintf( "  %02X %02X %02X %02X %02X %02X %02X %02X",
  299.        p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
  300. #endif
  301.       alErrCode = ALERR_ASPI;
  302.       alAspiErr = s.SRB_Status;
  303.       return SS_ERR;
  304.     }
  305.   t->len = t->numFrames * 2352;
  306.   t->startOffset = 0;
  307.   t->status = s.SRB_Status;
  308.   return s.SRB_Status;
  309. }