diff -uNr tvcas_attachment_20120915.orig/ICC/Multi2Decoder/Multi2DecoderSIMD.cpp tvcas_attachment_20120915/ICC/Multi2Decoder/Multi2DecoderSIMD.cpp --- tvcas_attachment_20120915.orig/ICC/Multi2Decoder/Multi2DecoderSIMD.cpp 2012-09-15 19:00:00.000000000 +0900 +++ tvcas_attachment_20120915/ICC/Multi2Decoder/Multi2DecoderSIMD.cpp 2013-04-17 04:01:36.937666500 +0900 @@ -1,5 +1,5 @@ #include -#include "../../BonTsEngine/Multi2Decoder.h" +#include "../../TVCAS/Multi2Decoder.h" #include #include #ifdef MULTI2_SSSE3 diff -uNr tvcas_attachment_20120915.orig/TVCAS/CardReader.cpp tvcas_attachment_20120915/TVCAS/CardReader.cpp --- tvcas_attachment_20120915.orig/TVCAS/CardReader.cpp 2012-09-15 19:00:00.000000000 +0900 +++ tvcas_attachment_20120915/TVCAS/CardReader.cpp 2013-04-17 04:44:10.522653400 +0900 @@ -401,6 +401,19 @@ return false; } +// for SPHD + // 初期化コマンドでスカパーHD用CASカードかどうか確認 + static const BYTE InitSettingCmd[] = {0x80U, 0x5EU, 0x00U, 0x00U, 0x00U}; + BYTE tmp[256] ; + DWORD RecvSize = sizeof(tmp) ; + if ( !Transmit( InitSettingCmd, sizeof(InitSettingCmd), tmp, &RecvSize ) || + RecvSize != 46 ) { + Close(); + SetError(TEXT("スカパーHD用ではないカードです。")); + return false; + } +// for SPHD + LPTSTR pszReaderName; BYTE Atr[32]; DWORD dwReaderLen = SCARD_AUTOALLOCATE, dwState, dwProtocol, dwAtrLen = sizeof(Atr); diff -uNr tvcas_attachment_20120915.orig/TVCAS/CasCard.cpp tvcas_attachment_20120915/TVCAS/CasCard.cpp --- tvcas_attachment_20120915.orig/TVCAS/CasCard.cpp 2012-09-15 19:00:00.000000000 +0900 +++ tvcas_attachment_20120915/TVCAS/CasCard.cpp 2013-04-17 04:30:26.388413700 +0900 @@ -183,7 +183,9 @@ BYTE RecvData[RECEIVE_BUFFER_SIZE]; // 初期設定条件コマンド送信 - static const BYTE InitSettingCmd[] = {0x90U, 0x30U, 0x00U, 0x00U, 0x00U}; +// for SPHD s 用変更 +// 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} ::ZeroMemory(RecvData, sizeof(RecvData)); dwRecvSize = sizeof(RecvData); TRACE(TEXT("Send \"Initial Setting Conditions Command\"\n")); @@ -192,11 +194,15 @@ return false; } - if (dwRecvSize < 57UL) { +// for SPHD s 用変更 +// if (dwRecvSize < 57UL) { + if (dwRecvSize < 46UL) { SetError(ERR_TRANSMITERROR, TEXT("受信データのサイズが不正です。")); return false; } +// for SPHD s 用変更 +/* // レスポンス解析 m_CasCardInfo.CASystemID = ((WORD)RecvData[6] << 8) | (WORD)RecvData[7]; ::CopyMemory(m_CasCardInfo.CardID, &RecvData[8], 6); // +8 Card ID @@ -233,6 +239,13 @@ SetError(ERR_TRANSMITERROR, TEXT("カードIDが不正です。")); return false; } +*/ + // レスポンス解析 + m_CasCardInfo.CASystemID = ((WORD)RecvData[0] << 8) | (WORD)RecvData[1]; // +0 CA System ID + ::CopyMemory(m_CasCardInfo.CardID, &RecvData[2], 6UL); // +2 Card ID + ::CopyMemory(m_CasCardInfo.SystemKey, &RecvData[8], 32UL); // +8 Descrambling system key + ::CopyMemory(m_CasCardInfo.InitialCbc, &RecvData[8], 8UL); // +8 Descrambler CBC initial value +// for SPHD s 用変更 // ECMステータス初期化 ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus)); @@ -407,7 +420,9 @@ } // バッファ準備 - static const BYTE EcmReceiveCmd[] = {0x90, 0x34, 0x00, 0x00}; +// for SPHD s 用変更 +// static const BYTE EcmReceiveCmd[] = {0x90, 0x34, 0x00, 0x00}; + static const BYTE EcmReceiveCmd[] = {0x80, 0x34, 0x00, 0x00}; // ECM_RECEIVE_CMD {CLA, INS, P1, P2} BYTE SendData[MAX_ECM_DATA_SIZE + 6]; BYTE RecvData[RECEIVE_BUFFER_SIZE]; ::ZeroMemory(RecvData, sizeof(RecvData)); @@ -426,6 +441,8 @@ return NULL; } +// for SPHD s 用変更 +/* // サイズチェック if (dwRecvSize != 25UL) { ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus)); @@ -459,11 +476,35 @@ SetError(ERR_ECMREFUSED, ECM_REFUSED_ERROR_TEXT); return NULL; +*/ + // サイズチェック + if (dwRecvSize != 22UL) { + ::ZeroMemory(&m_EcmStatus, sizeof(m_EcmStatus)); +// SetError(ERR_TRANSMITERROR, TEXT("ECMのレスポンスサイズが不正です。")); + SetError(ERR_ECMREFUSED, ECM_REFUSED_ERROR_TEXT); + return NULL; + } + + // ECMデータを保存する + m_EcmStatus.dwLastEcmSize = dwEcmSize; + ::CopyMemory(m_EcmStatus.LastEcmData, pEcmData, dwEcmSize); + + // レスポンス解析 + ::CopyMemory(m_EcmStatus.KsData, &RecvData[0], sizeof(m_EcmStatus.KsData)); + + // 正常終了 + ClearError(); + return m_EcmStatus.KsData; +// for SPHD s 用変更 + } const bool CCasCard::SendEmmSection(const BYTE *pEmmData, const DWORD dwEmmSize) { + +// for SPHD s 用変更 +/* // 「EMM Receive Command」を処理する if (!m_pCardReader) { SetError(ERR_CARDNOTOPEN, CARD_NOT_OPEN_ERROR_TEXT); @@ -516,6 +557,10 @@ SetError(ERR_EMMERROR, TEXT("EMMが受け付けられません。")); break; } +*/ +// for SPHD s 用変更 + + SetError(ERR_EMMERROR, TEXT("EMMが受け付けられません。")); return false; } diff -uNr tvcas_attachment_20120915.orig/TVCAS/Multi2Decoder.h tvcas_attachment_20120915/TVCAS/Multi2Decoder.h --- tvcas_attachment_20120915.orig/TVCAS/Multi2Decoder.h 2012-09-15 19:00:00.000000000 +0900 +++ tvcas_attachment_20120915/TVCAS/Multi2Decoder.h 2013-04-17 03:58:17.096390100 +0900 @@ -15,7 +15,7 @@ */ #define MULTI2_SSE2 // SSE2対応 #define MULTI2_SSSE3 // SSSE3対応 -#define MULTI2_SIMD_ICC // Intel C++ Compiler を利用する +//#define MULTI2_SIMD_ICC // Intel C++ Compiler を利用する namespace Multi2DecoderSIMD { struct WORKKEY; diff -uNr tvcas_attachment_20120915.orig/TVCAS/TsDescrambler.cpp tvcas_attachment_20120915/TVCAS/TsDescrambler.cpp --- tvcas_attachment_20120915.orig/TVCAS/TsDescrambler.cpp 2012-09-15 19:00:00.000000000 +0900 +++ tvcas_attachment_20120915/TVCAS/TsDescrambler.cpp 2013-04-17 04:47:54.216946900 +0900 @@ -1221,7 +1221,11 @@ if (PayloadSize < MIN_ECM_DATA_SIZE || PayloadSize > MAX_ECM_DATA_SIZE) return false; +// for SPHD s 用変更 +/* // ECMが変わったらキー取得が成功するまで無効にする + // (最初ECM本体のKsが変化したか比較するようにしたが、 + // ECM本体とECM応答のKsの変化は一致するわけではない) m_Multi2Lock.Lock(); if (m_LastChangedKey == 1) { m_bEvenKeyValid = false; @@ -1229,6 +1233,7 @@ m_bOddKeyValid = false; } m_Multi2Lock.Unlock(); +*/ // 前のECM処理が終わるまで待つ if (!m_EcmProcessEvent.IsSignaled()) {