diff -uNr BonCasLink/Common/BcasCard.cpp BonCasLink.patched/Common/BcasCard.cpp --- BonCasLink/Common/BcasCard.cpp 2015-08-14 00:46:02.589869700 +0900 +++ BonCasLink.patched/Common/BcasCard.cpp 2015-08-14 01:09:52.126113900 +0900 @@ -87,6 +87,18 @@ m_dwLastError = BCEC_CARDOPENERROR; return false; } +// for SPHD + // 初期化コマンドでスカパーHD用CASカードかどうか確認 + static const BYTE InitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U}; + BYTE tmp[256] ; + DWORD RecvSize = 0UL; + if ( !TransmitCommand(InitSettingCmd, sizeof(InitSettingCmd), tmp, sizeof(tmp), &RecvSize) || + RecvSize != 46 ) { + CloseCard(); + m_dwLastError = BCEC_CARDOPENERROR; + return false; + } +// for SPHD } else{ // 全てのカードリーダに対してオープンを試みる @@ -191,7 +203,7 @@ const bool CBcasCard::InitialSetting(void) { - static const BYTE InitSettingCmd[] = {0x90U, 0x30U, 0x00U, 0x00U, 0x00U}; + static const BYTE InitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U}; // INITIAL_SETTING_CONDITIONS_CMD {CLA, INS, P1, P2, P3} // 「Initial Setting Conditions Command」を処理する if(!m_hBcasCard){ @@ -210,15 +222,15 @@ return false; } - if(dwRecvSize < 57UL){ + if(dwRecvSize < 46UL){ m_dwLastError = BCEC_TRANSMITERROR; return false; } // レスポンス解析 - ::CopyMemory(m_BcasCardInfo.BcasCardID, &RecvData[8], 6UL); // +8 Card ID - ::CopyMemory(m_BcasCardInfo.SystemKey, &RecvData[16], 32UL); // +16 Descrambling system key - ::CopyMemory(m_BcasCardInfo.InitialCbc, &RecvData[48], 8UL); // +48 Descrambler CBC initial value + ::CopyMemory(m_BcasCardInfo.BcasCardID, &RecvData[2], 6UL); // +8 Card ID + ::CopyMemory(m_BcasCardInfo.SystemKey, &RecvData[8], 32UL); // +16 Descrambling system key + ::CopyMemory(m_BcasCardInfo.InitialCbc, &RecvData[8], 8UL); // +48 Descrambler CBC initial value // ECMステータス初期化 ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus)); @@ -267,7 +279,7 @@ const BYTE * CBcasCard::GetKsFromEcm(const BYTE *pEcmData, const DWORD dwEcmSize) { - static const BYTE EcmReceiveCmd[] = {0x90U, 0x34U, 0x00U, 0x00U}; + static const BYTE EcmReceiveCmd[] = {0x80U, 0x34U, 0x00U, 0x00U}; // ECM_RECEIVE_CMD {CLA, INS, P1, P2} // 「ECM Receive Command」を処理する if(!m_hBcasCard){ @@ -308,29 +320,17 @@ } // サイズチェック - if(dwRecvSize != 25UL){ + if(dwRecvSize != 22UL){ ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus)); m_dwLastError = BCEC_TRANSMITERROR; return NULL; } // レスポンス解析 - ::CopyMemory(m_EcmStatus.KsData, &RecvData[6], sizeof(m_EcmStatus.KsData)); + ::CopyMemory(m_EcmStatus.KsData, &RecvData[0], sizeof(m_EcmStatus.KsData)); - // リターンコード解析 - switch(((WORD)RecvData[4] << 8) | (WORD)RecvData[5]){ - // Purchased: Viewing - case 0x0200U : // Payment-deferred PPV - case 0x0400U : // Prepaid PPV - case 0x0800U : // Tier - m_dwLastError = BCEC_NOERROR; - return m_EcmStatus.KsData; - - // 上記以外(視聴不可) - default : - m_dwLastError = BCEC_ECMREFUSED; - return NULL; - } + m_dwLastError = BCEC_NOERROR; + return m_EcmStatus.KsData; } const bool CBcasCard::StoreEcmData(const BYTE *pEcmData, const DWORD dwEcmSize)