|
|
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Registry.cpp 1.7 1998/05/07 15:24:55 tomz Exp $
extern "C" { #include <strmini.h>
} #include "device.h"
//LONG PsDevice::PinTypes_ [MaxInpPins]; // just allocate maximum possible
//DWORD PsDevice::xtals_ [2]; // no more than 2 xtals
/*++
Routine Description:
Reads the specified registry value
Arguments:
Handle - handle to the registry key KeyNameString - value to read KeyNameStringLength - length of string Data - buffer to read data into DataLength - length of data buffer
Return Value:
NTSTATUS returned as appropriate
--*/ NTSTATUS GetRegistryValue( IN HANDLE Handle, IN const PUNICODE_STRING KeyName, IN PCHAR Data, IN ULONG DataLength ) { NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES; ULONG Length; PKEY_VALUE_FULL_INFORMATION FullInfo;
Length = sizeof( KEY_VALUE_FULL_INFORMATION ) + DataLength + KeyName->MaximumLength;
FullInfo = (struct _KEY_VALUE_FULL_INFORMATION *)ExAllocatePool(PagedPool, Length);
if ( FullInfo ) { Status = ZwQueryValueKey( Handle, KeyName, KeyValueFullInformation, FullInfo, Length, &Length );
if ( NT_SUCCESS( Status ) ) {
if ( DataLength >= FullInfo->DataLength ) { RtlCopyMemory( Data, ((PUCHAR) FullInfo) + FullInfo->DataOffset, FullInfo->DataLength );
} else { Status = STATUS_BUFFER_TOO_SMALL; } // buffer right length
} // if success
ExFreePool( FullInfo ); } // if fullinfo
return Status; }
/* Function: OpenDriverKey
* Purpose: Opens the DriverData key off the main driver key * Input: PhysicalDeviceObject : DEVICE_OBJECT * * Output: Open key handle or NULL */ HANDLE OpenDriverKey( IN PDEVICE_OBJECT PhysicalDeviceObject ) { NTSTATUS Status; HANDLE DevHandle;
Status = IoOpenDeviceRegistryKey( PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL, &DevHandle );
HANDLE KeyHandle = NULL; if ( NT_SUCCESS( Status ) ) { OBJECT_ATTRIBUTES attr; UNICODE_STRING UDevDataName; PWCHAR WDataName = L"DriverData";
RtlInitUnicodeString( &UDevDataName, WDataName ); InitializeObjectAttributes( &attr, &UDevDataName, OBJ_INHERIT, DevHandle, NULL );
ZwOpenKey( &KeyHandle, KEY_QUERY_VALUE, &attr ); ZwClose( DevHandle ); } return KeyHandle; } /* Function: PrepareKeyName
* Purpose: Creates a UNICODE name for a key * Parameters: UKeyName: UNICODE_STRING * - key will be created here * name: PCHAR - regular "C" string * idx: int - number to append to the name * Note: this function is useful in creating numbered key names */ inline void PrepareKeyName( PUNICODE_STRING UKeyName, PCHAR name, int idx ) { char buf [80]; ANSI_STRING AKeyName;
if ( idx == -1 ) { RtlInitAnsiString( &AKeyName, name ); } else { sprintf( buf, "%s%d", name, idx ); RtlInitAnsiString( &AKeyName, buf ); }
RtlAnsiStringToUnicodeString( UKeyName, &AKeyName, TRUE ); }
/*++
Routine Description:
Reads the XBAR registry values for the device
Arguments:
PhysicalDeviceObject - pointer to the PDO
Return Value:
None.
--*/ void ReadXBarRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject ) { HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
if ( KeyHandle ) {
for ( int i = 0; i < MaxInpPins; i++ ) {
UNICODE_STRING UKeyName;
PrepareKeyName( &UKeyName, "XBarInPin", i );
CHAR buf [10];
NTSTATUS Status; Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
RtlFreeUnicodeString( &UKeyName );
if ( NT_SUCCESS(Status ) ) { DebugOut((1, "ReadRegistry %d\n", i ) ); PinTypes_ [i] = *(PDWORD)buf; } else PinTypes_ [i] = -1; } ZwClose( KeyHandle ); } else { // just use some default to make life eaiser for the xbar code
PinTypes_ [0] = KS_PhysConn_Video_SVideo; PinTypes_ [1] = KS_PhysConn_Video_Tuner; PinTypes_ [2] = KS_PhysConn_Video_Composite; PinTypes_ [3] = KS_PhysConn_Audio_Tuner; } }
/* Method: ReadXTalRegistryValues
* Purpose: Obtains number and types of the crystals for this device * Input: DEVICE_OBJECT * * Output: None */ void ReadXTalRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject ) { HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
if ( KeyHandle ) {
for ( int i = 0; i < 2; i++ ) {
UNICODE_STRING UKeyName;
PrepareKeyName( &UKeyName, "XTal", i );
CHAR buf [10];
NTSTATUS Status; Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
RtlFreeUnicodeString( &UKeyName );
if ( NT_SUCCESS(Status ) ) { DebugOut((1, "Got Xtal %d\n", i ) ); xtals_ [i] = *(PDWORD)buf; } else xtals_ [i] = 28; // is this a good default ? :0)
} ZwClose( KeyHandle ); } else // just use some default to make life eaiser for the xbar code
xtals_ [0] = 28; // default to NTSC only
}
TUNER_INFO TunerInfo;
void DumpTunerInfo( TUNER_INFO * pTunerInfo ) { DUMPX( pTunerInfo->TunerBrand ); DUMPX( pTunerInfo->TunerI2CAddress ); DUMPX( pTunerInfo->TunerBandCtrlLow ); DUMPX( pTunerInfo->TunerBandCtrlMid ); DUMPX( pTunerInfo->TunerBandCtrlHigh ); }
void ReadTunerRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject ) { HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
if ( KeyHandle ) {
CHAR buf [10]; NTSTATUS Status; UNICODE_STRING UKeyName; BOOL bSuccess = TRUE;
PrepareKeyName( &UKeyName, "TunerBrand", -1 ); Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) ); if ( bSuccess = NT_SUCCESS(Status ) ) { TunerInfo.TunerBrand = *(PDWORD)buf;
PrepareKeyName( &UKeyName, "TunerI2CAddress", -1 ); Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) ); if ( bSuccess = NT_SUCCESS(Status ) ) { TunerInfo.TunerI2CAddress = *(PBYTE)buf; } else { DebugOut((0, "Failed GetRegistryValue(TunerI2CAddress)\n")); } } else { DebugOut((0, "Failed GetRegistryValue(TunerBrand)\n")); }
if ( !bSuccess ) { TunerInfo.TunerBrand = TUNER_BRAND_TEMIC; TunerInfo.TunerI2CAddress = 0xC2; DebugOut((0, "Defaulting to Temic tuner at I2C address 0xC2\n")); }
RtlFreeUnicodeString( &UKeyName ); ZwClose( KeyHandle ); } else { TunerInfo.TunerBrand = TUNER_BRAND_TEMIC; TunerInfo.TunerI2CAddress = 0xC2; DebugOut((0, "Failed OpenDriverKey()\n")); DebugOut((0, "Defaulting to Temic tuner at I2C address 0xC2\n")); }
switch( TunerInfo.TunerBrand ) { case TUNER_BRAND_PHILIPS: TunerInfo.TunerBandCtrlLow = 0xCEA0; // Ctrl code for VHF low
TunerInfo.TunerBandCtrlMid = 0xCE90; // Ctrl code for VHF high
TunerInfo.TunerBandCtrlHigh = 0xCE30; // Ctrl code for UHF
break; case TUNER_BRAND_ALPS: TunerInfo.TunerBandCtrlLow = 0xC214; // Ctrl code for VHF low
TunerInfo.TunerBandCtrlMid = 0xC212; // Ctrl code for VHF high
TunerInfo.TunerBandCtrlHigh = 0xC211; // Ctrl code for UHF
break; case TUNER_BRAND_TEMIC: default: TunerInfo.TunerBandCtrlLow = 0x8E02; // Ctrl code for VHF low
TunerInfo.TunerBandCtrlMid = 0x8E04; // Ctrl code for VHF high
TunerInfo.TunerBandCtrlHigh = 0x8E01; // Ctrl code for UHF
break; }
DumpTunerInfo( &TunerInfo ); }
|