mirror of https://github.com/tongzx/nt5src
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.
255 lines
5.2 KiB
255 lines
5.2 KiB
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
regresls.cxx
|
|
|
|
Abstract:
|
|
|
|
This module contains the definitions of the member functions
|
|
of IO_REQUIREMENTS_LIST class.
|
|
|
|
Author:
|
|
|
|
Jaime Sasson (jaimes) 02-Dec-1993
|
|
|
|
Environment:
|
|
|
|
ULIB, User Mode
|
|
|
|
|
|
--*/
|
|
|
|
#include "regioreq.hxx"
|
|
#include "iterator.hxx"
|
|
#include "regiodsc.hxx"
|
|
#include "regiodls.hxx"
|
|
|
|
|
|
DEFINE_CONSTRUCTOR ( IO_REQUIREMENTS_LIST, OBJECT );
|
|
|
|
|
|
IO_REQUIREMENTS_LIST::~IO_REQUIREMENTS_LIST (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destroy a IO_REQUIREMENTS_LIST.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
|
|
VOID
|
|
IO_REQUIREMENTS_LIST::Construct (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Construct an IO_REQUIREMENTS_LIST object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
_InterfaceType = Internal;
|
|
_BusNumber = 0;
|
|
_SlotNumber = 0;
|
|
_Reserved1 = 0;
|
|
_Reserved2 = 0;
|
|
_Reserved3 = 0;
|
|
_AlternativeLists = NULL;
|
|
}
|
|
|
|
|
|
VOID
|
|
IO_REQUIREMENTS_LIST::Destroy (
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Worker method for object destruction.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
if( _AlternativeLists != NULL ) {
|
|
_AlternativeLists->DeleteAllMembers();
|
|
DELETE( _AlternativeLists );
|
|
}
|
|
_AlternativeLists = NULL;
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
IO_REQUIREMENTS_LIST::Initialize(
|
|
IN PCBYTE Data,
|
|
IN ULONG Size
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize an object of type IO_REQUIREMENTS_LIST.
|
|
|
|
Arguments:
|
|
|
|
Data - Pointer to a buffer that contains a IO_RESOURCE_REQUIREMETS_LIST.
|
|
|
|
Size - Buffer size.
|
|
|
|
Return Value:
|
|
|
|
BOOLEAN - Returns TRUE if the initialization succeeds.
|
|
|
|
--*/
|
|
|
|
{
|
|
PIO_RESOURCE_LIST ResourceList;
|
|
ULONG Count;
|
|
ULONG i;
|
|
PARRAY TmpList;
|
|
ULONG BufferSize;
|
|
ULONG ResourceListSize;
|
|
|
|
if( Data == NULL ) {
|
|
return( FALSE );
|
|
}
|
|
|
|
Count = ( ( PIO_RESOURCE_REQUIREMENTS_LIST )Data )->AlternativeLists;
|
|
ResourceList = ( ( PIO_RESOURCE_REQUIREMENTS_LIST )Data )->List;
|
|
|
|
TmpList = ( PARRAY )NEW( ARRAY );
|
|
DebugPtrAssert( TmpList );
|
|
if( ( TmpList == NULL ) ||
|
|
( !TmpList->Initialize() ) ) {
|
|
DebugPrintTrace(("REGEDT32: Out of memory" ));
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
|
|
//
|
|
// For each IO_RESOURCE_LIST in the current value...
|
|
//
|
|
|
|
BufferSize = Size - // Data size
|
|
sizeof( ULONG ) - // ListSize
|
|
sizeof( INTERFACE_TYPE ) - // InterfaceType
|
|
sizeof( ULONG ) - // BusNumber
|
|
sizeof( ULONG ) - // SlotNumber
|
|
3*sizeof( ULONG ) - // Reserved1, 2 and 3
|
|
sizeof( ULONG ); // AlternativeLists
|
|
|
|
for( i = 0; i < Count; i++ ) {
|
|
|
|
PIO_DESCRIPTOR_LIST IoDescriptorList;
|
|
|
|
IoDescriptorList = ( PIO_DESCRIPTOR_LIST )NEW( IO_DESCRIPTOR_LIST );
|
|
if( ( IoDescriptorList == NULL ) ||
|
|
!IoDescriptorList->Initialize( ( PCBYTE )ResourceList,
|
|
BufferSize,
|
|
&ResourceListSize )
|
|
) {
|
|
DebugPrint( "REGEDT32: Unable to create or initialize IoDescriptorList \n" );
|
|
DELETE( IoDescriptorList );
|
|
TmpList->DeleteAllMembers();
|
|
DELETE( TmpList );
|
|
return( FALSE );
|
|
}
|
|
TmpList->Put( IoDescriptorList );
|
|
#if DBG
|
|
if( BufferSize < ResourceListSize ) {
|
|
DebugPrintTrace(( "REGEDT32: incorrect sizes, BufferSize = %d, ResourceListSize = %d \n",
|
|
BufferSize, ResourceListSize ));
|
|
}
|
|
#endif
|
|
ResourceList = ( PIO_RESOURCE_LIST )( ( ULONG_PTR )ResourceList + ResourceListSize );
|
|
BufferSize -= ResourceListSize;
|
|
}
|
|
_AlternativeLists = TmpList;
|
|
_InterfaceType = ( ( PIO_RESOURCE_REQUIREMENTS_LIST )Data )->InterfaceType;
|
|
_BusNumber = ( ( PIO_RESOURCE_REQUIREMENTS_LIST )Data )->BusNumber;
|
|
_SlotNumber = ( ( PIO_RESOURCE_REQUIREMENTS_LIST )Data )->SlotNumber;
|
|
return( TRUE );
|
|
}
|
|
|
|
#if DBG
|
|
VOID
|
|
IO_REQUIREMENTS_LIST::DbgDumpObject(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print an IO_REQUIREMENTS_LIST object.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
PITERATOR Iterator;
|
|
PIO_DESCRIPTOR_LIST DescriptorList;
|
|
|
|
DebugPrintTrace(( "*** Dumping IO_REQUIREMENTS_LIST \n\n" ));
|
|
DebugPrintTrace(( "InterfaceType = %d \n", _InterfaceType ));
|
|
DebugPrintTrace(( "BusNumber = %#lx \n", _BusNumber ));
|
|
DebugPrintTrace(( "SlotNumber = %#lx \n", _SlotNumber ));
|
|
DebugPrintTrace(( "Reserved1 = %#x \n", _Reserved1 ));
|
|
DebugPrintTrace(( "Reserved2 = %#x \n", _Reserved2 ));
|
|
DebugPrintTrace(( "Reserved3 = %#x \n", _Reserved3 ));
|
|
if( _AlternativeLists != NULL ) {
|
|
Iterator = _AlternativeLists->QueryIterator();
|
|
while( DescriptorList = ( PIO_DESCRIPTOR_LIST ) Iterator->GetNext() ) {
|
|
DescriptorList->DbgDumpObject();
|
|
}
|
|
DELETE( Iterator );
|
|
} else {
|
|
DebugPrintTrace(( "IO_REQUIREMENTS_LIST is empty \n\n" ));
|
|
}
|
|
|
|
}
|
|
#endif
|