You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
12 KiB
352 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
regfdesc.cxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the definitions of the member functions
|
|
of FULL_DESCRIPTOR class.
|
|
|
|
Author:
|
|
|
|
Jaime Sasson (jaimes) 02-Dec-1993
|
|
|
|
Environment:
|
|
|
|
ULIB, User Mode
|
|
|
|
|
|
--*/
|
|
|
|
#include "regfdesc.hxx"
|
|
#include "regdesc.hxx"
|
|
#include "iterator.hxx"
|
|
|
|
|
|
DEFINE_CONSTRUCTOR ( FULL_DESCRIPTOR, OBJECT );
|
|
|
|
|
|
FULL_DESCRIPTOR::~FULL_DESCRIPTOR (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destroy a FULL_DESCRIPTOR.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
|
|
VOID
|
|
FULL_DESCRIPTOR::Construct (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Construct a FULL_DESCRIPTOR object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
_InterfaceType = Internal;
|
|
_BusNumber = 0;
|
|
_Version = 0;
|
|
_Revision = 0;
|
|
_ResourceDescriptors = NULL;
|
|
}
|
|
|
|
|
|
VOID
|
|
FULL_DESCRIPTOR::Destroy (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Worker method for object destruction.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
_InterfaceType = Internal;
|
|
_BusNumber = 0;
|
|
_Version = 0;
|
|
_Revision = 0;
|
|
if( _ResourceDescriptors != NULL ) {
|
|
_ResourceDescriptors->DeleteAllMembers();
|
|
DELETE( _ResourceDescriptors );
|
|
}
|
|
_ResourceDescriptors = NULL;
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
FULL_DESCRIPTOR::Initialize(
|
|
IN PCBYTE Data,
|
|
IN ULONG Size,
|
|
OUT PULONG DescriptorSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize an object of type FULL_DESCRIPTOR.
|
|
|
|
Arguments:
|
|
|
|
Data - Pointer to a buffer that contains a CM_FULL_RESOURCE_DESCRIPTOR.
|
|
|
|
Size - Buffer size.
|
|
|
|
Return Value:
|
|
|
|
BOOLEAN - Returns TRUE if the initialization succeeds.
|
|
|
|
--*/
|
|
|
|
{
|
|
PCM_FULL_RESOURCE_DESCRIPTOR FullResource;
|
|
ULONG Count;
|
|
ULONG i;
|
|
ULONG j;
|
|
|
|
PARRAY TmpList;
|
|
PPORT_DESCRIPTOR PortDescriptor;
|
|
PINTERRUPT_DESCRIPTOR InterruptDescriptor;
|
|
PMEMORY_DESCRIPTOR MemoryDescriptor;
|
|
PDMA_DESCRIPTOR DmaDescriptor;
|
|
PDEVICE_SPECIFIC_DESCRIPTOR DeviceSpecificDescriptor;
|
|
ULONG DeviceSpecificDataSize;
|
|
|
|
if( Data == NULL ) {
|
|
return( FALSE );
|
|
}
|
|
|
|
Count = 1;
|
|
FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR )Data;
|
|
|
|
TmpList = ( PARRAY )NEW( ARRAY );
|
|
if( ( TmpList == NULL ) ||
|
|
( !TmpList->Initialize() ) ) {
|
|
DebugPrintTrace(("REGEDT32: Out of memory" ));
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
|
|
_InterfaceType = FullResource->InterfaceType;
|
|
_BusNumber = FullResource->BusNumber;
|
|
_Version = FullResource->PartialResourceList.Version;
|
|
_Revision = FullResource->PartialResourceList.Revision;
|
|
|
|
//
|
|
// For each CM_FULL_RESOURCE DESCRIPTOR in the current value...
|
|
//
|
|
|
|
for( i = 0; i < Count; i++ ) {
|
|
|
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor;
|
|
|
|
//
|
|
// For each CM_PARTIAL_RESOURCE_DESCRIPTOR in the list...
|
|
//
|
|
|
|
DeviceSpecificDataSize = 0;
|
|
for( j = 0; j < FullResource->PartialResourceList.Count; j++ ) {
|
|
|
|
//
|
|
// Get a pointer to the current CM_PARTIAL_RESOURCE_DESCRIPTOR
|
|
// in the current CM_FULLRESOURCE_DESCRIPTOR in the list.
|
|
//
|
|
|
|
PartialResourceDescriptor = &( FullResource[ i ].PartialResourceList.PartialDescriptors[ j ]);
|
|
//
|
|
// Ignore invalid data
|
|
//
|
|
if( ( ULONG_PTR )PartialResourceDescriptor >
|
|
( ULONG_PTR )( Data + Size - sizeof( CM_PARTIAL_RESOURCE_DESCRIPTOR ) ) ) {
|
|
DebugPrintTrace(( "REGEDT32: Invalid CM_PARTIAL_RESOURCE_DESCRIPTOR, j = %d \n", j ));
|
|
if( DescriptorSize != NULL ) {
|
|
*DescriptorSize = Size;
|
|
}
|
|
_ResourceDescriptors = TmpList;
|
|
return( TRUE );
|
|
}
|
|
|
|
switch( PartialResourceDescriptor->Type )
|
|
{
|
|
case CmResourceTypePort:
|
|
{
|
|
PortDescriptor = ( PPORT_DESCRIPTOR )NEW( PORT_DESCRIPTOR );
|
|
PHYSICAL_ADDRESS portStartAddr = (PHYSICAL_ADDRESS) PartialResourceDescriptor->u.Port.Start;
|
|
if ( (PortDescriptor == NULL) ||
|
|
( !PortDescriptor->Initialize( &portStartAddr,
|
|
PartialResourceDescriptor->u.Port.Length,
|
|
PartialResourceDescriptor->ShareDisposition,
|
|
PartialResourceDescriptor->Flags ) )
|
|
)
|
|
{
|
|
DebugPrintTrace(( "REGEDT32: Unable to create PORT_DESCRIPTOR" ));
|
|
DELETE( PortDescriptor );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( PortDescriptor );
|
|
}
|
|
break;
|
|
|
|
case CmResourceTypeInterrupt:
|
|
{
|
|
InterruptDescriptor = ( PINTERRUPT_DESCRIPTOR )NEW( INTERRUPT_DESCRIPTOR );
|
|
if ( ( InterruptDescriptor == NULL ) ||
|
|
( !InterruptDescriptor->Initialize( PartialResourceDescriptor->u.Interrupt.Affinity,
|
|
PartialResourceDescriptor->u.Interrupt.Level,
|
|
PartialResourceDescriptor->u.Interrupt.Vector,
|
|
PartialResourceDescriptor->ShareDisposition,
|
|
PartialResourceDescriptor->Flags ) )
|
|
)
|
|
{
|
|
DebugPrintTrace(( "REGEDT32: Unable to create INTERRUPT_DESCRIPTOR" ));
|
|
DELETE( InterruptDescriptor );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( InterruptDescriptor );
|
|
}
|
|
break;
|
|
|
|
case CmResourceTypeMemory:
|
|
{
|
|
MemoryDescriptor = ( PMEMORY_DESCRIPTOR )NEW( MEMORY_DESCRIPTOR );
|
|
PHYSICAL_ADDRESS memStartAddr = (PHYSICAL_ADDRESS) PartialResourceDescriptor->u.Memory.Start;
|
|
if ( ( MemoryDescriptor == NULL ) ||
|
|
( !MemoryDescriptor->Initialize( &memStartAddr,
|
|
PartialResourceDescriptor->u.Memory.Length,
|
|
PartialResourceDescriptor->ShareDisposition,
|
|
PartialResourceDescriptor->Flags ) )
|
|
)
|
|
{
|
|
DebugPrintTrace(( "REGEDT32: Unable to create MEMORY_DESCRIPTOR" ));
|
|
DELETE( MemoryDescriptor );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( MemoryDescriptor );
|
|
}
|
|
break;
|
|
|
|
case CmResourceTypeDma:
|
|
{
|
|
DmaDescriptor = ( PDMA_DESCRIPTOR )NEW( DMA_DESCRIPTOR );
|
|
if ( ( DmaDescriptor == NULL ) ||
|
|
( !DmaDescriptor->Initialize( PartialResourceDescriptor->u.Dma.Channel,
|
|
PartialResourceDescriptor->u.Dma.Port,
|
|
PartialResourceDescriptor->u.Dma.Reserved1,
|
|
PartialResourceDescriptor->ShareDisposition,
|
|
PartialResourceDescriptor->Flags ) )
|
|
)
|
|
{
|
|
DebugPrintTrace(( "REGEDT32: Unable to create DMA_DESCRIPTOR" ));
|
|
DELETE( DmaDescriptor );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( DmaDescriptor );
|
|
}
|
|
break;
|
|
|
|
case CmResourceTypeDeviceSpecific:
|
|
{
|
|
DeviceSpecificDataSize = PartialResourceDescriptor->u.DeviceSpecificData.DataSize;
|
|
DeviceSpecificDescriptor = ( PDEVICE_SPECIFIC_DESCRIPTOR )NEW( DEVICE_SPECIFIC_DESCRIPTOR );
|
|
if ( ( DeviceSpecificDescriptor == NULL ) ||
|
|
( !DeviceSpecificDescriptor->Initialize(
|
|
PartialResourceDescriptor->u.DeviceSpecificData.Reserved1,
|
|
PartialResourceDescriptor->u.DeviceSpecificData.Reserved2,
|
|
PartialResourceDescriptor->u.DeviceSpecificData.DataSize,
|
|
( PBYTE )&PartialResourceDescriptor->u.DeviceSpecificData + 3*sizeof( ULONG ),
|
|
PartialResourceDescriptor->ShareDisposition,
|
|
PartialResourceDescriptor->Flags ) )
|
|
)
|
|
{
|
|
DebugPrintTrace(( "REGEDT32: Unable to create DEVICE_SPECIFIC_DESCRIPTOR" ));
|
|
DELETE( DeviceSpecificDescriptor );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( DeviceSpecificDescriptor );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
DebugPrintTrace(( "REGEDT32: Unknown PartialResourceDescriptor->Type == %#x \n", PartialResourceDescriptor->Type ));
|
|
continue;
|
|
}
|
|
}
|
|
|
|
_ResourceDescriptors = TmpList;
|
|
//
|
|
// Get the next CM_FULL_RESOURCE_DESCRIPTOR from the list.
|
|
//
|
|
|
|
FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR ) ( ( ULONG_PTR )FullResource +
|
|
sizeof( ULONG ) +
|
|
sizeof( ULONG ) +
|
|
sizeof( USHORT ) +
|
|
sizeof( USHORT ) +
|
|
sizeof( ULONG ) +
|
|
j*sizeof( CM_PARTIAL_RESOURCE_DESCRIPTOR ) +
|
|
DeviceSpecificDataSize );
|
|
// FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR )( PartialResourceDescriptor + 1 );
|
|
// FullResource = ( PCM_FULL_RESOURCE_DESCRIPTOR )( ( ULONG )FullResource +
|
|
// DeviceSpecificDataSize );
|
|
}
|
|
if( DescriptorSize != NULL ) {
|
|
*DescriptorSize = ( ULONG )( ( ULONG_PTR )FullResource - ( ULONG_PTR )Data );
|
|
|
|
}
|
|
return( TRUE );
|
|
}
|
|
|