windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/dxr2/copyprot.c
2020-09-26 16:20:57 +08:00

307 lines
9.7 KiB
C

/******************************************************************************\
* *
* COPYPROT.C - Copy protection related code. *
* *
* Copyright (c) C-Cube Microsystems 1996 *
* All Rights Reserved. *
* *
* Use of C-Cube Microsystems code is governed by terms and conditions *
* stated in the accompanying licensing statement. *
* *
\******************************************************************************/
#include "Headers.h"
#pragma hdrstop
#include "copyprot.h"
#include "cl6100.h"
/*
** CopyProtSetPropIfAdapterReady ()
**
** Set property handling routine for the Copy Protection on any pin
**
** Arguments:
**
** pSrb -> property command block
** pSrb->CommandData.PropertyInfo describes the requested property
**
** Returns:
**
** Side Effects:
*/
void CopyProtSetPropIfAdapterReady( PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = pSrb->HwDeviceExtension;
// First check if there any Srb or interrupt pending
if( !AdapterCanAuthenticateNow( pHwDevExt ) )
{
if( pHwDevExt->nTimeoutCount == AUTHENTICATION_TIMEOUT_COUNT )
MonoOutStr( " !!! Schedule CPP CB !!! " );
else
MonoOutStr( "*" );
if( --pHwDevExt->nTimeoutCount > 0 )
{
pSrb->Status = STATUS_PENDING;
StreamClassScheduleTimer( NULL, pHwDevExt,
10000,
(PHW_TIMER_ROUTINE)CopyProtSetPropIfAdapterReady,
pSrb );
return;
}
}
CopyProtSetProp( pSrb );
}
/*
** CopyProtSetProp ()
**
** Set property handling routine for the Copy Protection on any pin
**
** Arguments:
**
** pSrb -> property command block
** pSrb->CommandData.PropertyInfo describes the requested property
**
** Returns:
**
** Side Effects:
*/
void CopyProtSetProp( PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = pSrb->HwDeviceExtension;
// static BOOL bSwitchDecryptionOn = FALSE;
// static ZIVA_STATE zInitialState;
WORD wFunction;
BYTE *pData = NULL;
BYTE byDecryptionFlag = 0;
BOOL bWasPending;
bWasPending = (BOOL)(pSrb->Status == STATUS_PENDING);
pSrb->Status = STATUS_SUCCESS;
switch( pSrb->CommandData.PropertyInfo->Property->Id )
{
case KSPROPERTY_DVDCOPY_CHLG_KEY:
// set property for challenge key. This provides the dvd drive
// challenge key for the decoder
pData = (BYTE*)(PKS_DVDCOPY_CHLGKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo);
wFunction = DVD_SEND_CHALLENGE;
break;
case KSPROPERTY_DVDCOPY_DVD_KEY1:
// Set DVD Key1 provides the dvd drive bus key 1 for the decoer
pData = (BYTE*)((PKS_DVDCOPY_BUSKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->BusKey;
wFunction = DVD_SEND_RESPONSE;
break;
case KSPROPERTY_DVDCOPY_TITLE_KEY:
// Set DVD title key, provides the dvd drive title key to the decoder
// To make Toshiba CPP chip work copy LSB in the KeyFlags to the MSB...
((PKS_DVDCOPY_TITLEKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->KeyFlags =
((PKS_DVDCOPY_TITLEKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->KeyFlags |
((PKS_DVDCOPY_TITLEKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->KeyFlags << 24;
// And provide it to DVD_Authenticate() function
pData = (BYTE*)(((PKS_DVDCOPY_TITLEKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->TitleKey)-1;
wFunction = DVD_SEND_TITLE_KEY;
// The DVD_SECTOR_PROTECTED flag during Title Key exchange is not
// reliable. So just assume that if we are doing Title Key exchange
// we also have to switch decryption on.
// if( ((PKS_DVDCOPY_TITLEKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->KeyFlags &
// DVD_SECTOR_PROTECTED )
pHwDevExt->bSwitchDecryptionOn = TRUE;
break;
case KSPROPERTY_DVDCOPY_DISC_KEY:
// Set the DVD disc key. provides the dvd disc key to the decoder
pData = (BYTE*)((PKS_DVDCOPY_DISCKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo))->DiscKey;
wFunction = DVD_SEND_DISK_KEY;
#ifdef EZDVD
// Do nothing
#else
RtlCopyMemory( pHwDevExt->pDiscKeyBufferLinear, pData, DISC_KEY_SIZE );
pData = (BYTE *)pHwDevExt->pDiscKeyBufferPhysical.LowPart;
#endif
break;
case KSPROPERTY_DVDCOPY_SET_COPY_STATE:
switch( ((PKS_DVDCOPY_SET_COPY_STATE)(pSrb->CommandData.PropertyInfo->PropertyInfo))->DVDCopyState )
{
case KS_DVDCOPYSTATE_INITIALIZE:
MonoOutStr( "\n0. Copy Protection Init " );
// Make sure that Decryption will be switched off if
// Title Key exchange does not occur.
pHwDevExt->bSwitchDecryptionOn = FALSE;
// If decoder is not in the Stopped state - stop it but
// remember the initial state.
pHwDevExt->zInitialState = ZivaHw_GetState();
if( pHwDevExt->zInitialState != ZIVA_STATE_STOP)
ZivaHw_Abort() ;
// pSrb->Status = STATUS_IO_DEVICE_ERROR;
break;
case KS_DVDCOPYSTATE_DONE:
MonoOutStr( "\n8. Copy Protection Done " );
if( pHwDevExt->nTimeoutCount < AUTHENTICATION_TIMEOUT_COUNT )
{
MonoOutStr( " (" );
MonoOutInt( pHwDevExt->nTimeoutCount );
MonoOutStr( " timeouts left) " );
pHwDevExt->nTimeoutCount = AUTHENTICATION_TIMEOUT_COUNT;
}
// Make sure next Authentication request will be postponed
// until last packet flag has come on each stream.
AdapterClearAuthenticationStatus( pHwDevExt );
// Switch Decryption on if required.
if( pHwDevExt->bSwitchDecryptionOn )
{
wFunction = DVD_SET_DECRYPTION_MODE;
byDecryptionFlag = 1;
pData = &byDecryptionFlag;
}
// Make sure we will resume play state of the decoder
// when the first chunk of data comes in.
/*sri if( pHwDevExt->zInitialState == ZIVA_STATE_PLAY )
pHwDevExt->bPlayCommandPending = TRUE;
else if(pHwDevExt-> zInitialState == ZIVA_STATE_SCAN )
pHwDevExt->bScanCommandPending = TRUE;
else if( pHwDevExt->zInitialState == ZIVA_STATE_SLOWMOTION )
pHwDevExt->bSlowCommandPending = TRUE;*/
pHwDevExt->bPlayCommandPending = TRUE;
break;
// Indicates we are starting a title key copy protection sequence
case KS_DVDCOPYSTATE_INITIALIZE_TITLE:
MonoOutStr( "\nX. KS_DVDCOPYSTATE_INITIALIZE_TITLE" );
break;
case KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED:
MonoOutStr( "\nX. KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED" );
break;
case KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED:
MonoOutStr( "\nX. KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED" );
break;
default:
MonoOutStr( "\n!!!!!!!!!!!!! Unexpected DVDCopyState !!!!!!!!!!!!!!!! " );
DebugPrint(( DebugLevelVerbose, "ZiVA: !!!!!!!!!!!!! Unexpected DVDCopyState !!!!!!!!!!!!!!!!->0x%x", ((PKS_DVDCOPY_SET_COPY_STATE)(pSrb->CommandData.PropertyInfo->PropertyInfo))->DVDCopyState ));
break;
}
break;
#if 0//DECODER_DVDPC
case KSPROPERTY_COPY_MACROVISION:
{
int nNewApsMode;
nNewApsMode = ((PKS_COPY_MACROVISION)(pSrb->CommandData.PropertyInfo->PropertyInfo))->MACROVISIONLevel;
if(pHwDevExt->nApsMode != nNewApsMode)
{
pHwDevExt->nApsMode = nNewApsMode;
SetAPSMode(pHwDevExt->nApsMode,1);//pHwDevExt->VidSystem);
}
}
return;
#endif
default:
pSrb->Status = STATUS_NOT_IMPLEMENTED;
}
if( pData )
{
if( !DVD_Authenticate( wFunction, pData ) )
pSrb->Status = STATUS_IO_DEVICE_ERROR;
}
if( bWasPending )
{ // Release the current control request block to the Stream Class Driver
MonoOutStr( " !!! Releasing Scheduled CPP Srb !!! " );
AdapterReleaseRequest( pSrb );
}
}
/*
** CopyProtGetProp ()
**
** get property handling routine for the CopyProt encoder pin
**
** Arguments:
**
** pSrb -> property command block
** pSrb->CommandData.PropertyInfo describes the requested property
**
** Returns:
**
** Side Effects:
*/
void CopyProtGetProp( PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = pSrb->HwDeviceExtension;
WORD wFunction;
BYTE *pData = NULL;
pSrb->Status = STATUS_SUCCESS;
switch( pSrb->CommandData.PropertyInfo->Property->Id )
{
case KSPROPERTY_DVDCOPY_CHLG_KEY:
// get property for challenge key. This provides the dvd drive
// with the challenge key FROM the decoder
pData = (BYTE*)(PKS_DVDCOPY_CHLGKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo);
wFunction = DVD_GET_CHALLENGE;
pSrb->ActualBytesTransferred = sizeof( KS_DVDCOPY_CHLGKEY );
break;
case KSPROPERTY_DVDCOPY_DEC_KEY2:
//
// get DVD Key2 provides the dvd drive with bus key 2 from the decoder
//
pData = (BYTE*)(PKS_DVDCOPY_BUSKEY)(pSrb->CommandData.PropertyInfo->PropertyInfo);
wFunction = DVD_GET_RESPONSE;
pSrb->ActualBytesTransferred = sizeof( KS_DVDCOPY_BUSKEY );
break;
/* case KSPROPERTY_DVDCOPY_REGION:
// indicate region 1 for US content
((PKS_DVDCOPY_REGION)(pSrb->CommandData.PropertyInfo->PropertyInfo))->RegionData = 0x1;
pSrb->ActualBytesTransferred = sizeof( KS_DVDCOPY_REGION );
break; sri*/
case KSPROPERTY_DVDCOPY_SET_COPY_STATE:
if( pHwDevExt->iStreamToAuthenticateOn == -1 ||
pHwDevExt->iStreamToAuthenticateOn == (int)pSrb->StreamObject->StreamNumber )
{
pHwDevExt->iStreamToAuthenticateOn = pSrb->StreamObject->StreamNumber;
((PKS_DVDCOPY_SET_COPY_STATE)(pSrb->CommandData.PropertyInfo->PropertyInfo))->DVDCopyState
= KS_DVDCOPYSTATE_AUTHENTICATION_REQUIRED;
}
else
((PKS_DVDCOPY_SET_COPY_STATE)(pSrb->CommandData.PropertyInfo->PropertyInfo))->DVDCopyState
= KS_DVDCOPYSTATE_AUTHENTICATION_NOT_REQUIRED;
pSrb->ActualBytesTransferred = sizeof( KS_DVDCOPY_SET_COPY_STATE );
break;
default:
pSrb->Status = STATUS_NOT_IMPLEMENTED;
}
if( pData )
{
if( !DVD_Authenticate( wFunction, pData ) )
pSrb->Status = STATUS_IO_DEVICE_ERROR;
}
}