|
|
//**************************************************************************
//
// Title : CTVCtrl.cpp
//
// Date : 1998.06.29 1st making
//
// Author : Toshiba [PCS](PSY) Hideki Yagi
//
// Copyright 1997-1998 Toshiba Corporation. All Rights Reserved.
//
// -------------------------------------------------------------------------
//
// Change log :
//
// Date Revision Description
// ------------ ---------- -----------------------------------------------
// 1998.06.29 000.0000 1st making.
//
//**************************************************************************
#include "includes.h"
#include "ctvctrl.h"
//#include <ntddk.h>
//#include <string.h>
//#include <devioctl.h>
//#include <windef.h>
#include "Acpiioct.h" // ACPI Driver Interface
CTVControl::CTVControl( void ) { ; };
CTVControl::~CTVControl( void ) { ; };
BOOL CTVControl :: Initialize( void ) { PFILE_OBJECT TvaldFileObject; STRING NameString; NTSTATUS status;
#ifndef TVALD
UNICODE_STRING RegPath; STRING KeyPathString; DWORD DeviceReference, Count; char keyname[512]; #endif
DBG_PRINTF( ( "CTVControl::Initialize() RtlInitString\n") ); RtlInitString( &NameString, TVALDDRVR_DEVICE_OPEN_NAME ); DBG_PRINTF( ( "CTVControl::Initialize() RtlAnsiStringToUnicodeString\n") ); RtlAnsiStringToUnicodeString( &UNameString, &NameString, TRUE );
is_init_success = TRUE; // add by do '98-08-04
//
// get the device object for the TVALD.sys
//
DBG_PRINTF( ( "CTVControl::Initialize() IoGetDeviceObjectPointer\n") ); status = IoGetDeviceObjectPointer( &UNameString, FILE_ANY_ACCESS, &TvaldFileObject, &TvaldDeviceObject ); if (status != STATUS_SUCCESS){ DBG_PRINTF( ( "CTVControl::Initialize() IoGetDeviceObjectPointer Error!!\n") );
#ifndef TVALD
RTL_QUERY_REGISTRY_TABLE Table[2]; //
// TVALD Install check
//
RtlInitUnicodeString( &RegPath, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\TVALD\\Enum"); RtlZeroMemory( Table, sizeof(Table) ); Table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; Table[0].Name = L"Count"; Table[0].EntryContext = &Count; Table[0].DefaultType = REG_DWORD; Table[0].DefaultData = &RegPath; Table[0].DefaultLength = sizeof(ULONG); DBG_PRINTF( ("DVDINIT:RtlQueryRegistryValues Count\n\r") );
status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, RegPath.Buffer, Table, NULL, NULL ); if (status != STATUS_SUCCESS){ DBG_PRINTF( ( "CTVControl::Initialize() RtlQueryRegistryValues Get Count Error!!\n") ); RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
return( FALSE ); } DBG_PRINTF( ("DVDINIT:RtlQueryRegistryValues success Count = %x\n\r", Count) ); if (Count != 1) { DBG_PRINTF( ( "CTVControl::Initialize() RtlQueryRegistryValues Count != 1!!\n") ); RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
return( FALSE ); }
//
// Search control-key
//
RtlInitUnicodeString( &RegPath, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Enum\\ACPI\\TOS6200"); PKEY_BASIC_INFORMATION pControllerKeyInformation; OBJECT_ATTRIBUTES objectAttributes; UCHAR keyBuffer[256]; // Allow for variable length name at end
ULONG resultLength; HANDLE openKey = NULL;
InitializeObjectAttributes(&objectAttributes, &RegPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwOpenKey(&openKey, KEY_READ, &objectAttributes);
if (status != STATUS_SUCCESS){ DBG_PRINTF( ( "CTVControl::Initialize() ZwOpenKey Error!!\n") ); RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
return( FALSE ); } RtlZeroMemory(keyBuffer, sizeof(keyBuffer)); pControllerKeyInformation = (PKEY_BASIC_INFORMATION) keyBuffer; for(int Index=0; Index < 256; Index++) { status = ZwEnumerateKey(openKey, Index, KeyBasicInformation, pControllerKeyInformation, sizeof(keyBuffer), &resultLength);
if (status != STATUS_SUCCESS) { DBG_PRINTF( ( "CTVControl::Initialize() ZwOpenKey Error!!\n") ); RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
ZwClose(openKey); return( FALSE ); } char szSchKey[256]; for(int schcnt = 0; schcnt < 256; schcnt++) { szSchKey[schcnt] = (char)pControllerKeyInformation->Name[schcnt]; if (szSchKey[schcnt] == NULL) break; } memset(keyname,NULL,sizeof(keyname)); memcpy( keyname, "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Enum\\ACPI\\TOS6200\\",61); memcpy((&(keyname[61])), szSchKey,(pControllerKeyInformation->NameLength / 2)); memcpy((&(keyname[61 + (pControllerKeyInformation->NameLength / 2)])),"\\Control",8); DBG_PRINTF( ("DVDINIT:ZwEnumerateKey NameString = %s\n\r", keyname) ); break; } ZwClose(openKey); //
// get the device object for the TVALD.sys
//
RtlInitString( &KeyPathString, keyname ); RtlAnsiStringToUnicodeString( &RegPath, &KeyPathString, TRUE ); RtlZeroMemory( Table, sizeof(Table) ); Table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; Table[0].Name = L"DeviceReference"; Table[0].EntryContext = &DeviceReference; Table[0].DefaultType = REG_DWORD; Table[0].DefaultData = &RegPath; Table[0].DefaultLength = sizeof(ULONG); DBG_PRINTF( ("DVDINIT:RtlQueryRegistryValues DeviceReference\n\r") ); status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, RegPath.Buffer, Table, NULL, NULL ); if (status != STATUS_SUCCESS){ DBG_PRINTF( ( "CTVControl::Initialize() RtlQueryRegistryValues Get DeviceReference Error!!\n") ); RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
return( FALSE ); } DBG_PRINTF( ("DVDINIT:RtlQueryRegistryValues success DeviceReference = %x\n\r", DeviceReference) );
TvaldDeviceObject = (PDEVICE_OBJECT)DeviceReference; TvaldDeviceObject = TvaldDeviceObject->AttachedDevice; #else
RtlFreeUnicodeString( &UNameString ); is_init_success = FALSE; // add by do '98-08-04
return( FALSE ); #endif TVALD
}
DBG_PRINTF( ( "CTVControl::Initialize() KeInitializeObject\n") ); KeInitializeEvent(&event, NotificationEvent, FALSE);
inputreg.GHCI_EAX = 0x0000f100; inputreg.GHCI_EBX = inputreg.GHCI_ECX = inputreg.GHCI_EDX = inputreg.GHCI_ESI = inputreg.GHCI_EDI = 0x0; if( Tvald_GHCI( &inputreg ) == FALSE ){ // SCI Interface Open
DBG_PRINTF( ( "CTVControl::Initialize() SCI Interface Open Error! \n") ); is_init_success = FALSE; // add by do '98-08-04
return (FALSE); } return( TRUE ); };
BOOL CTVControl :: Uninitialize( void ) { inputreg.GHCI_EAX = 0x0000f200; inputreg.GHCI_EBX = inputreg.GHCI_ECX = inputreg.GHCI_EDX = inputreg.GHCI_ESI = inputreg.GHCI_EDI = 0x0; if( Tvald_GHCI( &inputreg ) == FALSE ){ // SCI Interface Close
DBG_PRINTF( ( "CTVControl::Uninitialize() SCI Interface Close Error!\n") ); is_init_success = FALSE; // add by do '98-08-04
return (FALSE); }
DBG_PRINTF( ( "CTVControl::Uninitialize() RtlFreeUnicodeString\n") ); RtlFreeUnicodeString( &UNameString ); return( TRUE ); };
BOOL CTVControl :: GetDisplayStatus( PVOID status ) { DisplayStatusStruc *pDisplayStat; DBG_PRINTF( ( "CTVControl::GetDisplayStatus() begin --->\n") ); if(is_init_success == FALSE){ // add by do '98-08-04
DBG_PRINTF( ( "CTVControl::GetDisplayStatus() end <--- is_init_success == FALSE\n") ); return (FALSE); // add by do '98-08-04
}
pDisplayStat = (DisplayStatusStruc *)status; // Get Current Display Status from BIOS by using ASl call.
inputreg.GHCI_EAX = 0x0000fe00; inputreg.GHCI_EBX = 0x00000035; inputreg.GHCI_ECX = 0x0; inputreg.GHCI_EDX = 0x0; inputreg.GHCI_ESI = 0x0; inputreg.GHCI_EDI = 0x0; if( Tvald_GHCI( &inputreg ) == FALSE ){ DBG_PRINTF( ( "CTVControl::GetDisplayStatus() Tvald_GHCI Error!\n") ); return (FALSE); }
if( (inputreg.GHCI_EAX & 0x0000ff00) != 0 ){ DBG_PRINTF( ( "CTVControl::GetDisplayStatus() Get Display Status Error!!\n") ); return( FALSE ); }
pDisplayStat->SizeofStruc = sizeof(DisplayStatusStruc); pDisplayStat->AvailableDisplay = (inputreg.GHCI_EBX & 0x00000700)>>8; pDisplayStat->CurrentDisplay = ((inputreg.GHCI_EBX & 0x00000078) << 25)| (inputreg.GHCI_EBX & 0x00000007);
DBG_PRINTF( ( "CTVControl::GetDisplayStatus() end <---\n") ); return( TRUE ); };
BOOL CTVControl :: SetDisplayStatus( PVOID status ) { DisplayStatusStruc *pDisplayStat, currStat; ULONG setstatusreg, getstatusreg; DBG_PRINTF( ( "CTVControl::SetDisplayStatus() begin --->\n") ); if(is_init_success == FALSE){ // add by do '98-08-04
DBG_PRINTF( ( "CTVControl::SetDisplayStatus() end <--- is_init_success == FALSE\n") ); return (FALSE); // add by do '98-08-04
}
pDisplayStat = (DisplayStatusStruc *)status; setstatusreg = pDisplayStat->CurrentDisplay;
// 98.11.17 H.Yagi
currStat.AvailableDisplay = 0x0; currStat.CurrentDisplay = 0x0; GetDisplayStatus( &currStat ); getstatusreg = ( (currStat.CurrentDisplay & 0x0f0000000)>>25 ); if( (getstatusreg & 0x40)==0x00 ){ // single mode
getstatusreg = (getstatusreg & 0x008) | 0x040; // keep TV type bit
}
// getstatusreg = ((pDisplayStat->CurrentDisplay & 0x30000000) >> 25) | 0x00000040;
// Set Current Display Status from BIOS by using ASl call.
inputreg.GHCI_EAX = 0x0000ff00; inputreg.GHCI_EBX = 0x00000035; inputreg.GHCI_ECX = (setstatusreg & 0x00000007)| getstatusreg; inputreg.GHCI_EDX = 0x0; inputreg.GHCI_ESI = 0x0; inputreg.GHCI_EDI = 0x0; if( Tvald_GHCI( &inputreg ) == FALSE ){ DBG_PRINTF( ( "CTVControl::SetDisplayStatus() Tvald_GHCI Error!\n") ); return (FALSE); }
if( (inputreg.GHCI_EAX & 0x0000ff00) != 0 ){ DBG_PRINTF( ( "CTVControl::SetDisplayStatus() Set Display Status Error!!\n") ); DBG_PRINTF( ( "CTVControl::SetDisplayStatus() end <---\n") ); return( FALSE ); }
DBG_PRINTF( ( "CTVControl::SetDisplayStatus() end <---\n") ); return( TRUE ); };
BOOL CTVControl :: SetTVOutput( DWORD status ) { DBG_PRINTF( ( "CTVControl::SetTVOutput() begin --->\n") );
if(is_init_success == FALSE){ // add by do '98-08-04
DBG_PRINTF( ( "CTVControl::SetTVOutput() end <--- is_init_success == FALSE\n") ); return (FALSE); // add by do '98-08-04
}
switch( status ){ case DISABLE_TV: // Set status
inputreg.GHCI_ECX = 0x00000001; // Play back "In progress" copy protected DVD.
break;
case ENABLE_TV: // Set status
inputreg.GHCI_ECX = 0; // Play back "Done" copy protected DVD.
break;
default: break; } inputreg.GHCI_EAX = 0x0000ff00; inputreg.GHCI_EBX = 0x00000036; inputreg.GHCI_EDX = 0x0; inputreg.GHCI_ESI = 0x0; inputreg.GHCI_EDI = 0x0; if( Tvald_GHCI( &inputreg ) == FALSE ){ DBG_PRINTF( ( "CTVControl::SetTVOutput() Tvald_GHCI Error!\n") ); return (FALSE); }
if( (inputreg.GHCI_EAX & 0x0000ff00) != 0 ){ DBG_PRINTF( ( "CTVControl::SetTVOutput() Set Display Status Error!!\n") ); DBG_PRINTF( ( "CTVControl::SetTVOutput() end <---\n") ); return( FALSE ); }
DBG_PRINTF( ( "CTVControl::SetTVOutput() end <---\n") ); return( TRUE ); };
//void CTVControl :: Tvald_GHCI( PGHCI_INTERFACE pinputreg )
BOOL CTVControl :: Tvald_GHCI( PGHCI_INTERFACE pinputreg ) { PIRP irp; NTSTATUS status; IO_STATUS_BLOCK iostatus; USHORT index; PULONG pUlongTmpInput, pUlongTmpOutput;
DBG_PRINTF( ( "CTVControl::Tvald_GHCI() begin --->\n") ); status = STATUS_SUCCESS;
// KIRQL CurentIrql = KeGetCurrentIrql();
// DBG_PRINTF( ( "CTVControl::Tvald_GHCI() CurentIrql = %d \n", CurentIrql) );
DBG_PRINTF( ( "CTVControl::Tvald_GHCI() IoBuildDeviceIoControlRequest\n") ); irp = IoBuildDeviceIoControlRequest( IOCTL_TVALD_GHCI, TvaldDeviceObject, pinputreg, sizeof(GHCI_INTERFACE), pinputreg, sizeof(GHCI_INTERFACE), FALSE, &event, &iostatus ); if(!irp){ DBG_PRINTF( ( "CTVControl::Tvald_GHCI() IoBuildDeviceIoControlRequest Error!!\n") ); iostatus.Status = STATUS_INSUFFICIENT_RESOURCES; iostatus.Information = 0; DBG_PRINTF( ( "CTVControl::Tvald_GHCI() RtlFreeUnicodeString\n") ); RtlFreeUnicodeString( &UNameString ); // return;
return (FALSE); }
DBG_PRINTF( ( "CTVControl::Tvald_GHCI() IoCallDriver\n") ); status = IoCallDriver(TvaldDeviceObject, irp);
if( status == STATUS_PENDING ){ DBG_PRINTF( ( "CTVControl::Tvald_GHCI() KeWaitForSingleObject\n") ); KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL); } else if ( status != STATUS_SUCCESS ) return (FALSE);
pUlongTmpInput = (PULONG)pinputreg; pUlongTmpOutput = (PULONG)irp->AssociatedIrp.SystemBuffer; for(index = 0; index < 6; index++){ *pUlongTmpInput = *pUlongTmpOutput; pUlongTmpInput++; pUlongTmpOutput++; } return (TRUE); }
|