|
|
//==========================================================================;
//
// PinMedia.CPP
// WDM MiniDrivers.
// AIW Hardware platform.
// Global shared in Mediums support functions inplementation
// Copyright (c) 1996 - 1997 ATI Technologies Inc. All Rights Reserved.
//
//==========================================================================;
extern "C" { #include "strmini.h"
#include "ksmedia.h"
#include "wdmdebug.h"
}
#include "wdmdrv.h"
#include "pinmedia.h"
/*^^*
* GetDriverInstanceNumber() * Purpose : gets the instance number of the driver. I think it can be retrived from the * Registry path, where Instance is a part of the PCI device address * * Inputs : PDEVICE_OBJECT pDeviceObject : pointer to DeviceObject * * Outputs : ULONG Instance of the driver * Author : IKLEBANOV *^^*/ ULONG GetDriverInstanceNumber( PDEVICE_OBJECT pDeviceObject) {
return( 0); }
/*^^*
* ReadPinMediumFromRegistryFolder() * Purpose : Reads the pin GUID from the Registry if the default is overwritten * by user .INF file. Also construct medium from this GUID and two ULONG 0. * * Inputs : HANDLE hFolder : Registry folder handle * ULONG nPin : pin number to get Medium data of * PKSPIN_MEDIUM pMediumKSPin : pointer to return pin Medium data * * Outputs : BOOL, TRUE if Registry Medium data found for this pin and valid * Author : IKLEBANOV *^^*/ BOOL ReadPinMediumFromRegistryFolder( HANDLE hFolder, ULONG nPin, PKSPIN_MEDIUM pPinMedium) { NTSTATUS ntStatus; UNICODE_STRING unicodeValueName, unicodeNumber, unicodeResult, unicodeGUID; ULONG ulBufLength; PKEY_VALUE_FULL_INFORMATION pRegistryFullInfo = NULL; GUID guidPin; WCHAR wchBuffer[PINMEDIA_REGISTRY_BUFFER_LENGTH]; WCHAR wchResultBuffer[PINMEDIA_REGISTRY_BUFFER_LENGTH];
ENSURE { if( hFolder == NULL) FAIL;
unicodeNumber.Buffer = wchBuffer; unicodeNumber.MaximumLength = sizeof( wchBuffer); unicodeNumber.Length = 0; ntStatus = ::RtlIntegerToUnicodeString( nPin, 10, &unicodeNumber); if( !NT_SUCCESS( ntStatus)) FAIL;
::RtlInitUnicodeString( &unicodeValueName, UNICODE_WDM_REG_PIN_NUMBER);
unicodeResult.Buffer = wchResultBuffer; unicodeResult.MaximumLength = sizeof( wchResultBuffer); unicodeResult.Length = 0;
::RtlCopyUnicodeString( &unicodeResult, &unicodeValueName);
ntStatus = ::RtlAppendUnicodeStringToString( &unicodeResult, &unicodeNumber); if( !NT_SUCCESS( ntStatus)) FAIL;
ulBufLength = 0; ntStatus = ::ZwQueryValueKey( hFolder, &unicodeResult, KeyValueFullInformation, pRegistryFullInfo, ulBufLength, &ulBufLength); //
// This call is expected to fail. It's called only to retrieve the required
// buffer length
//
if( !ulBufLength || ( ulBufLength >= sizeof( KEY_VALUE_FULL_INFORMATION) + 100)) FAIL;
pRegistryFullInfo = ( PKEY_VALUE_FULL_INFORMATION) \ ::ExAllocatePool( PagedPool, ulBufLength);
if( pRegistryFullInfo == NULL) FAIL;
ntStatus = ::ZwQueryValueKey( hFolder, &unicodeResult, KeyValueFullInformation, pRegistryFullInfo, ulBufLength, &ulBufLength); if( !NT_SUCCESS( ntStatus)) FAIL;
if( !pRegistryFullInfo->DataLength || !pRegistryFullInfo->DataOffset) FAIL;
::RtlInitUnicodeString( &unicodeGUID, ( WCHAR*)((( PUCHAR)pRegistryFullInfo) + pRegistryFullInfo->DataOffset));
ntStatus = ::RtlGUIDFromString( &unicodeGUID, &guidPin); if( !NT_SUCCESS( ntStatus)) FAIL;
::RtlCopyMemory( &pPinMedium->Set, ( PUCHAR)&guidPin, sizeof( GUID)); pPinMedium->Id = 0; pPinMedium->Flags = 0;
::ExFreePool( pRegistryFullInfo);
return( TRUE);
} END_ENSURE;
if( pRegistryFullInfo != NULL) ::ExFreePool( pRegistryFullInfo);
return( FALSE); }
|