ioctl.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,124 行 · 第 1/4 页

C
2,124
字号
        i_ret = -1;    }    memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE );#elif defined( DARWIN_DVD_IOCTL )    INIT_DVDIOCTL( dk_dvd_report_key_t, DVDKey1Info,                   kDVDKeyFormatKey1 );    dvd.grantID = *pi_agid;    i_ret = ioctl( i_fd, DKIOCDVDREPORTKEY, &dvd );    memcpy( p_key, dvdbs.key1Value, DVD_KEY_SIZE );#elif defined( WIN32 )    if( WIN2K ) /* NT/2k/XP */    {        DWORD tmp;        uint8_t buffer[DVD_BUS_KEY_LENGTH];        PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer;        memset( &buffer, 0, sizeof( buffer ) );        key->KeyLength  = DVD_BUS_KEY_LENGTH;        key->SessionId  = *pi_agid;        key->KeyType    = DvdBusKey1;        key->KeyFlags   = 0;        i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_READ_KEY, key,                key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1;        memcpy( p_key, key->KeyData, DVD_KEY_SIZE );    }    else    {        INIT_SSC( GPCMD_REPORT_KEY, 12 );        ssc.CDBByte[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6);        i_ret = WinSendSSC( i_fd, &ssc );        memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE );    }#elif defined( __QNXNTO__ )    INIT_CPT( GPCMD_REPORT_KEY, 12 );    p_cpt->cam_cdb[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6);    i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL);    memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE );#elif defined( SYS_OS2 )    INIT_SSC( GPCMD_REPORT_KEY, 12 );    sdc.command[ 10 ] = DVD_REPORT_KEY1 | (*pi_agid << 6);    i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,                        &sdc, sizeof(sdc), &ulParamLen,                        p_buffer, sizeof(p_buffer), &ulDataLen);    memcpy( p_key, p_buffer + 4, DVD_KEY_SIZE );#else#   error "DVD ioctls are unavailable on this system"#endif    return i_ret;}/***************************************************************************** * ioctl_InvalidateAgid: invalidate the current AGID *****************************************************************************/int ioctl_InvalidateAgid( int i_fd, int *pi_agid ){    int i_ret;#if defined( HAVE_LINUX_DVD_STRUCT )    dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.type = DVD_INVALIDATE_AGID;    auth_info.lsa.agid = *pi_agid;    i_ret = ioctl( i_fd, DVD_AUTH, &auth_info );#elif defined( HAVE_BSD_DVD_STRUCT )    struct dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.format = DVD_INVALIDATE_AGID;    auth_info.agid = *pi_agid;    i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info );#elif defined( SYS_BEOS )    INIT_RDC( GPCMD_REPORT_KEY, 0 );    rdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);    i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );#elif defined( HPUX_SCTL_IO )    INIT_SCTL_IO( GPCMD_REPORT_KEY, 0 );    sctl_io.cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );#elif defined( SOLARIS_USCSI )    INIT_USCSI( GPCMD_REPORT_KEY, 0 );    rs_cdb.cdb_opaque[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);    i_ret = SolarisSendUSCSI( i_fd, &sc );    if( i_ret < 0 || sc.uscsi_status )    {        i_ret = -1;    }#elif defined( DARWIN_DVD_IOCTL )    INIT_DVDIOCTL( dk_dvd_send_key_t, DVDAuthenticationGrantIDInfo,                   kDVDKeyFormatAGID_Invalidate );    dvd.grantID = *pi_agid;    i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd );#elif defined( WIN32 )    if( WIN2K ) /* NT/2k/XP */    {        DWORD tmp;        i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_END_SESSION,                    pi_agid, sizeof( *pi_agid ), NULL, 0, &tmp, NULL ) ? 0 : -1;    }    else    {#if defined( __MINGW32__ )        INIT_SSC( GPCMD_REPORT_KEY, 0 );#else        INIT_SSC( GPCMD_REPORT_KEY, 1 );        ssc.SRB_BufLen    = 0;        ssc.CDBByte[ 8 ]  = 0;        ssc.CDBByte[ 9 ]  = 0;#endif        ssc.CDBByte[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);        i_ret = WinSendSSC( i_fd, &ssc );    }#elif defined( __QNXNTO__ )    INIT_CPT( GPCMD_REPORT_KEY, 0 );    p_cpt->cam_cdb[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);    i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL);#elif defined( SYS_OS2 )    INIT_SSC( GPCMD_REPORT_KEY, 1 );    sdc.data_length = 0;    sdc.command[ 8 ] = 0;    sdc.command[ 9 ] = 0;    sdc.command[ 10 ] = DVD_INVALIDATE_AGID | (*pi_agid << 6);    i_ret = DosDevIOCtl(i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,                        &sdc, sizeof(sdc), &ulParamLen,                        NULL, 0, &ulDataLen);#else#   error "DVD ioctls are unavailable on this system"#endif    return i_ret;}/***************************************************************************** * ioctl_SendChallenge: send challenge to the drive *****************************************************************************/int ioctl_SendChallenge( int i_fd, int *pi_agid, uint8_t *p_challenge ){    int i_ret;#if defined( HAVE_LINUX_DVD_STRUCT )    dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.type = DVD_HOST_SEND_CHALLENGE;    auth_info.hsc.agid = *pi_agid;    memcpy( auth_info.hsc.chal, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = ioctl( i_fd, DVD_AUTH, &auth_info );#elif defined( HAVE_BSD_DVD_STRUCT )    struct dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.format = DVD_SEND_CHALLENGE;    auth_info.agid = *pi_agid;    memcpy( auth_info.keychal, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = ioctl( i_fd, DVDIOCSENDKEY, &auth_info );#elif defined( SYS_BEOS )    INIT_RDC( GPCMD_SEND_KEY, 16 );    rdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);    p_buffer[ 1 ] = 0xe;    memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );#elif defined( HPUX_SCTL_IO )    INIT_SCTL_IO( GPCMD_SEND_KEY, 16 );    sctl_io.cdb[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);    p_buffer[ 1 ] = 0xe;    memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );#elif defined( SOLARIS_USCSI )    INIT_USCSI( GPCMD_SEND_KEY, 16 );    rs_cdb.cdb_opaque[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);    p_buffer[ 1 ] = 0xe;    memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );    if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status )    {        return -1;    }    i_ret = 0;#elif defined( DARWIN_DVD_IOCTL )    INIT_DVDIOCTL( dk_dvd_send_key_t, DVDChallengeKeyInfo,                   kDVDKeyFormatChallengeKey );    dvd.grantID = *pi_agid;    dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM;    dvdbs.dataLength[ 1 ] = 0xe;    memcpy( dvdbs.challengeKeyValue, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd );#elif defined( WIN32 )    if( WIN2K ) /* NT/2k/XP */    {        DWORD tmp;        uint8_t buffer[DVD_CHALLENGE_KEY_LENGTH];        PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer;        memset( &buffer, 0, sizeof( buffer ) );        key->KeyLength  = DVD_CHALLENGE_KEY_LENGTH;        key->SessionId  = *pi_agid;        key->KeyType    = DvdChallengeKey;        key->KeyFlags   = 0;        memcpy( key->KeyData, p_challenge, DVD_CHALLENGE_SIZE );        i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_SEND_KEY, key,                 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1;    }    else    {        INIT_SSC( GPCMD_SEND_KEY, 16 );        ssc.CDBByte[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);        p_buffer[ 1 ] = 0xe;        memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );        i_ret = WinSendSSC( i_fd, &ssc );    }#elif defined( __QNXNTO__ )    INIT_CPT( GPCMD_SEND_KEY, 16 );    p_cpt->cam_cdb[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);    p_buffer[ 1 ] = 0xe;    memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL);#elif defined( SYS_OS2 )    INIT_SSC( GPCMD_SEND_KEY, 16 );    sdc.command[ 10 ] = DVD_SEND_CHALLENGE | (*pi_agid << 6);    p_buffer[ 1 ] = 0xe;    memcpy( p_buffer + 4, p_challenge, DVD_CHALLENGE_SIZE );    i_ret = DosDevIOCtl( i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,                         &sdc, sizeof(sdc), &ulParamLen,                         p_buffer, sizeof(p_buffer), &ulDataLen );#else#   error "DVD ioctls are unavailable on this system"#endif    return i_ret;}/***************************************************************************** * ioctl_SendKey2: send the second key to the drive *****************************************************************************/int ioctl_SendKey2( int i_fd, int *pi_agid, uint8_t *p_key ){    int i_ret;#if defined( HAVE_LINUX_DVD_STRUCT )    dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.type = DVD_HOST_SEND_KEY2;    auth_info.hsk.agid = *pi_agid;    memcpy( auth_info.hsk.key, p_key, DVD_KEY_SIZE );    i_ret = ioctl( i_fd, DVD_AUTH, &auth_info );#elif defined( HAVE_BSD_DVD_STRUCT )    struct dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.format = DVD_SEND_KEY2;    auth_info.agid = *pi_agid;    memcpy( auth_info.keychal, p_key, DVD_KEY_SIZE );    i_ret = ioctl( i_fd, DVDIOCSENDKEY, &auth_info );#elif defined( SYS_BEOS )    INIT_RDC( GPCMD_SEND_KEY, 12 );    rdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);    p_buffer[ 1 ] = 0xa;    memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );    i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );#elif defined( HPUX_SCTL_IO )    INIT_SCTL_IO( GPCMD_SEND_KEY, 12 );    sctl_io.cdb[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);    p_buffer[ 1 ] = 0xa;    memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );#elif defined( SOLARIS_USCSI )    INIT_USCSI( GPCMD_SEND_KEY, 12 );    rs_cdb.cdb_opaque[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);    p_buffer[ 1 ] = 0xa;    memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );    if( SolarisSendUSCSI( i_fd, &sc ) < 0 || sc.uscsi_status )    {        return -1;    }    i_ret = 0;#elif defined( DARWIN_DVD_IOCTL )    INIT_DVDIOCTL( dk_dvd_send_key_t, DVDKey2Info,                   kDVDKeyFormatKey2 );    dvd.grantID = *pi_agid;    dvd.keyClass = kDVDKeyClassCSS_CPPM_CPRM;    dvdbs.dataLength[ 1 ] = 0xa;    memcpy( dvdbs.key2Value, p_key, DVD_KEY_SIZE );    i_ret = ioctl( i_fd, DKIOCDVDSENDKEY, &dvd );#elif defined( WIN32 )    if( WIN2K ) /* NT/2k/XP */    {        DWORD tmp;        uint8_t buffer[DVD_BUS_KEY_LENGTH];        PDVD_COPY_PROTECT_KEY key = (PDVD_COPY_PROTECT_KEY) &buffer;        memset( &buffer, 0, sizeof( buffer ) );        key->KeyLength  = DVD_BUS_KEY_LENGTH;        key->SessionId  = *pi_agid;        key->KeyType    = DvdBusKey2;        key->KeyFlags   = 0;        memcpy( key->KeyData, p_key, DVD_KEY_SIZE );        i_ret = DeviceIoControl( (HANDLE) i_fd, IOCTL_DVD_SEND_KEY, key,                 key->KeyLength, key, key->KeyLength, &tmp, NULL ) ? 0 : -1;    }    else    {        INIT_SSC( GPCMD_SEND_KEY, 12 );        ssc.CDBByte[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);        p_buffer[ 1 ] = 0xa;        memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );        i_ret = WinSendSSC( i_fd, &ssc );    }#elif defined( __QNXNTO__ )    INIT_CPT( GPCMD_SEND_KEY, 12 );    p_cpt->cam_cdb[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);    p_buffer[ 1 ] = 0xa;    memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );    i_ret = devctl(i_fd, DCMD_CAM_PASS_THRU, p_cpt, structSize, NULL);#elif defined( SYS_OS2 )    INIT_SSC( GPCMD_SEND_KEY, 12 );    sdc.command[ 10 ] = DVD_SEND_KEY2 | (*pi_agid << 6);    p_buffer[ 1 ] = 0xa;    memcpy( p_buffer + 4, p_key, DVD_KEY_SIZE );    i_ret = DosDevIOCtl( i_fd, IOCTL_CDROMDISK, CDROMDISK_EXECMD,                         &sdc, sizeof(sdc), &ulParamLen,                         p_buffer, sizeof(p_buffer), &ulDataLen );#else#   error "DVD ioctls are unavailable on this system"#endif    return i_ret;}/***************************************************************************** * ioctl_ReportRPC: get RPC status for the drive *****************************************************************************/int ioctl_ReportRPC( int i_fd, int *p_type, int *p_mask, int *p_scheme ){    int i_ret;#if defined( HAVE_LINUX_DVD_STRUCT ) && defined( DVD_LU_SEND_RPC_STATE )    dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.type = DVD_LU_SEND_RPC_STATE;    i_ret = ioctl( i_fd, DVD_AUTH, &auth_info );    *p_type = auth_info.lrpcs.type;    *p_mask = auth_info.lrpcs.region_mask;    *p_scheme = auth_info.lrpcs.rpc_scheme;#elif defined( HAVE_LINUX_DVD_STRUCT )    /* FIXME: OpenBSD doesn't know this */    i_ret = -1;#elif defined( HAVE_BSD_DVD_STRUCT )    struct dvd_authinfo auth_info;    memset( &auth_info, 0, sizeof( auth_info ) );    auth_info.format = DVD_REPORT_RPC;    i_ret = ioctl( i_fd, DVDIOCREPORTKEY, &auth_info );    *p_type = auth_info.reg_type;    *p_mask = auth_info.region; // ??    *p_scheme = auth_info.rpc_scheme;#elif defined( SYS_BEOS )    INIT_RDC( GPCMD_REPORT_KEY, 8 );    rdc.command[ 10 ] = DVD_REPORT_RPC;    i_ret = ioctl( i_fd, B_RAW_DEVICE_COMMAND, &rdc, sizeof(rdc) );    *p_type = p_buffer[ 4 ] >> 6;    *p_mask = p_buffer[ 5 ];    *p_scheme = p_buffer[ 6 ];#elif defined( HPUX_SCTL_IO )    INIT_SCTL_IO( GPCMD_REPORT_KEY, 8 );    sctl_io.cdb[ 10 ] = DVD_REPORT_RPC;    i_ret = ioctl( i_fd, SIOC_IO, &sctl_io );    *p_type = p_buffer[ 4 ] >> 6;    *p_mask = p_buffer[ 5 ];    *p_scheme = p_buffer[ 6 ];#elif defined( SOLARIS_USCSI )    INIT_USCSI( GPCMD_REPORT_KEY, 8 );    rs_cdb.cdb_opaque[ 10 ] = DVD_REPORT_RPC;    i_ret = SolarisSendUSCSI( i_fd, &sc );    if( i_ret < 0 || sc.uscsi_status )    {        i_ret = -1;    }    *p_type = p_buffer[ 4 ] >> 6;    *p_mask = p_buffer[ 5 ];    *p_scheme = p_buffer[ 6 ];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?