/*++ Copyright (c) 1991 Microsoft Corporation Module Name: regprintres.cpp Abstract: This file contains the implementation of the member functions of PRINT_MANAGER class. Author: Jaime Sasson (jaimes) 18-Sep-1991 Environment: Ulib, Regedit, Windows, User Mode --*/ #include "regprintres.h" #include "array.hxx" #include "regsys.hxx" #include "iterator.hxx" #include "regresid.h" extern "C" { // from regprint.c void PrintBinaryData(PBYTE ValueData, UINT cbcbValueData); void PrintLiteral(PTSTR lpLiteral); void PrintNewLine(); } BOOL PrintString(PWSTRING pwsString) { PrintLiteral((PTSTR)pwsString->GetWSTR()); return TRUE; } void PrintResourceData(PBYTE pbData, UINT uSize, DWORD dwType) { PRINT_RESOURCE::_PrintResources(pbData, uSize, dwType); } BOOL PRINT_RESOURCE::s_StringsInitialized = FALSE; PWSTRING PRINT_RESOURCE::s_IndentString; PWSTRING PRINT_RESOURCE::s_StringFullDescriptor; PWSTRING PRINT_RESOURCE::s_StringInterfaceType; PWSTRING PRINT_RESOURCE::s_StringBusNumber; PWSTRING PRINT_RESOURCE::s_StringVersion; PWSTRING PRINT_RESOURCE::s_StringRevision; PWSTRING PRINT_RESOURCE::s_StringPartialDescriptor; PWSTRING PRINT_RESOURCE::s_StringResource; PWSTRING PRINT_RESOURCE::s_StringDisposition; PWSTRING PRINT_RESOURCE::s_StringVector; PWSTRING PRINT_RESOURCE::s_StringLevel; PWSTRING PRINT_RESOURCE::s_StringAffinity; PWSTRING PRINT_RESOURCE::s_StringType; PWSTRING PRINT_RESOURCE::s_StringStart; PWSTRING PRINT_RESOURCE::s_StringLength; PWSTRING PRINT_RESOURCE::s_StringChannel; PWSTRING PRINT_RESOURCE::s_StringPort; PWSTRING PRINT_RESOURCE::s_StringReserved1; PWSTRING PRINT_RESOURCE::s_StringReserved2; PWSTRING PRINT_RESOURCE::s_StringDevSpecificData; PWSTRING PRINT_RESOURCE::s_StringIoInterfaceType; PWSTRING PRINT_RESOURCE::s_StringIoBusNumber; PWSTRING PRINT_RESOURCE::s_StringIoSlotNumber; PWSTRING PRINT_RESOURCE::s_StringIoListNumber; PWSTRING PRINT_RESOURCE::s_StringIoDescriptorNumber; PWSTRING PRINT_RESOURCE::s_StringIoOption; PWSTRING PRINT_RESOURCE::s_StringIoMinimumVector; PWSTRING PRINT_RESOURCE::s_StringIoMaximumVector; PWSTRING PRINT_RESOURCE::s_StringIoMinimumAddress; PWSTRING PRINT_RESOURCE::s_StringIoMaximumAddress; PWSTRING PRINT_RESOURCE::s_StringIoAlignment; PWSTRING PRINT_RESOURCE::s_StringIoMinimumChannel; PWSTRING PRINT_RESOURCE::s_StringIoMaximumChannel; //------------------------------------------------------------------------------ // PrintResources // // DESCRIPTION: Prints a resouce by type // //------------------------------------------------------------------------------ void PRINT_RESOURCE::_PrintResources(PBYTE pbData, UINT uSize, DWORD dwType) { if(!s_StringsInitialized) { s_StringsInitialized = _InitializeStrings(); } if (s_StringsInitialized) { switch (dwType) { case REG_RESOURCE_LIST: _PrintDataRegResourceList(pbData, uSize); break; case REG_FULL_RESOURCE_DESCRIPTOR: { FULL_DESCRIPTOR FullDescriptor; if (FullDescriptor.Initialize(pbData, uSize)) { _PrintFullResourceDescriptor(&FullDescriptor, 0, FALSE); } } break; case REG_RESOURCE_REQUIREMENTS_LIST: _PrintDataRegRequirementsList(pbData, uSize); break; default: PrintBinaryData(pbData, uSize); break; } } } //------------------------------------------------------------------------------ // PrintDataRegResourceList // // DESCRIPTION: Initializes the static strings. // //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_InitializeStrings() { PWSTR Buffer; ULONG Size; ULONG Count; BOOLEAN fSuccess = TRUE; s_IndentString = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_KEY_NAME_INDENT, "" ); s_StringFullDescriptor = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_FULL_DESCRIPTOR, "" ); s_StringPartialDescriptor = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_PARTIAL_DESCRIPTOR, "" ); s_StringInterfaceType = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_INTERFACE_TYPE, "" ); s_StringBusNumber = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_BUS_NUMBER, "" ); s_StringVersion = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_VERSION, "" ); s_StringRevision = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_REVISION, "" ); s_StringResource = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_RESOURCE, "" ); s_StringDisposition = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_DISPOSITION, "" ); s_StringType = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_TYPE, "" ); s_StringStart = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_START, "" ); s_StringLength = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_LENGTH, "" ); s_StringLevel = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_LEVEL, "" ); s_StringVector = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_VECTOR, "" ); s_StringAffinity = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_AFFINITY, "" ); s_StringChannel = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_CHANNEL, "" ); s_StringPort = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_PORT, "" ); s_StringReserved1 = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_RESERVED1, "" ); s_StringReserved2 = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_RESERVED2, "" ); s_StringDevSpecificData = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_DEV_SPECIFIC_DATA, "" ); s_StringIoInterfaceType = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_INTERFACE_TYPE, "" ); s_StringIoBusNumber = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_BUS_NUMBER, "" ); s_StringIoSlotNumber = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_SLOT_NUMBER, "" ); s_StringIoListNumber = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_LIST_NUMBER, "" ); s_StringIoOption = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_OPTION, "" ); s_StringIoDescriptorNumber = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_DESCRIPTOR_NUMBER, "" ); s_StringIoAlignment = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_ALIGNMENT, "" ); s_StringIoMinimumAddress = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MINIMUM_ADDRESS, "" ); s_StringIoMaximumAddress = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MAXIMUM_ADDRESS, "" ); s_StringIoMinimumVector = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MINIMUM_VECTOR, "" ); s_StringIoMaximumVector = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MAXIMUM_VECTOR, "" ); s_StringIoMinimumChannel = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MINIMUM_CHANNEL, "" ); s_StringIoMaximumChannel = REGEDIT_BASE_SYSTEM::QueryString(IDS_PRINT_IO_MAXIMUM_CHANNEL, "" ); if ((s_StringFullDescriptor == NULL) || (s_StringPartialDescriptor == NULL) || (s_StringInterfaceType == NULL) || (s_StringBusNumber == NULL) || (s_StringVersion == NULL) || (s_StringRevision == NULL) || (s_StringResource == NULL) || (s_StringDisposition == NULL) || (s_StringType == NULL) || (s_StringStart == NULL) || (s_StringLength == NULL) || (s_StringLevel == NULL) || (s_StringVector == NULL) || (s_StringAffinity == NULL) || (s_StringChannel == NULL) || (s_StringPort == NULL) || (s_StringReserved1 == NULL) || (s_StringReserved2 == NULL) || (s_StringDevSpecificData == NULL) || (s_StringIoInterfaceType == NULL) || (s_StringIoBusNumber == NULL) || (s_StringIoSlotNumber == NULL) || (s_StringIoListNumber == NULL) || (s_StringIoOption == NULL) || (s_StringIoDescriptorNumber == NULL) || (s_StringIoAlignment == NULL) || (s_StringIoMinimumAddress == NULL) || (s_StringIoMaximumAddress == NULL) || (s_StringIoMinimumVector == NULL) || (s_StringIoMaximumVector == NULL) || (s_StringIoMinimumChannel == NULL) || (s_StringIoMaximumChannel == NULL)) { DELETE(s_StringFullDescriptor); DELETE(s_StringPartialDescriptor); DELETE(s_StringInterfaceType); DELETE(s_StringBusNumber); DELETE(s_StringVersion); DELETE(s_StringRevision); DELETE(s_StringResource); DELETE(s_StringDisposition); DELETE(s_StringType); DELETE(s_StringStart); DELETE(s_StringLength); DELETE(s_StringLevel); DELETE(s_StringVector); DELETE(s_StringAffinity); DELETE(s_StringChannel); DELETE(s_StringPort); DELETE(s_StringReserved1); DELETE(s_StringReserved2); DELETE(s_StringDevSpecificData); DELETE(s_StringIoInterfaceType); DELETE(s_StringIoBusNumber); DELETE(s_StringIoSlotNumber); DELETE(s_StringIoListNumber); DELETE(s_StringIoOption); DELETE(s_StringIoDescriptorNumber); DELETE(s_StringIoAlignment); DELETE(s_StringIoMinimumAddress); DELETE(s_StringIoMaximumAddress); DELETE(s_StringIoMinimumVector); DELETE(s_StringIoMaximumVector); DELETE(s_StringIoMinimumChannel); DELETE(s_StringIoMaximumChannel); fSuccess = FALSE; } return fSuccess; } //------------------------------------------------------------------------------ // PrintDataRegResourceList // // DESCRIPTION: Print a REG_RESOURCE_LIST stored in a value entry of a registry // key. // PARAMETERS: Data - Pointer to the buffer that contais a REG_RESOURCE_LIST // data. // Size - Number of bytes in the buffer. //------------------------------------------------------------------------------ void PRINT_RESOURCE::_PrintDataRegResourceList(PBYTE Data, UINT Size) { RESOURCE_LIST ResourceList; PARRAY FullResourceDescriptors; PITERATOR Iterator; PCFULL_DESCRIPTOR FullDescriptor; ULONG DescriptorNumber; PrintNewLine(); if( ( Size == 0 ) || ( Data == NULL ) || !ResourceList.Initialize( Data, Size ) ) { return; } if( ( ( FullResourceDescriptors = ResourceList.GetFullResourceDescriptors() ) == NULL ) || ( ( Iterator = FullResourceDescriptors->QueryIterator() ) == NULL ) ) { return; } DescriptorNumber = 0; while( ( FullDescriptor = ( PCFULL_DESCRIPTOR )( Iterator->GetNext() ) ) != NULL ) { if( !_PrintFullResourceDescriptor( FullDescriptor, DescriptorNumber ) ) { DELETE( Iterator ); return; } DescriptorNumber++; } DELETE( Iterator ); return; } //------------------------------------------------------------------------------ // PrintFullResourceDescriptor // // DESCRIPTION: Print the contents of a FULL_DESCRIPTOR object. // // PARAMETERS: FullDescriptor - Pointer to object to be printed. // DescriptorNumber - // PrintDescriptorNumber - A flag that indicates whether or not the // descriptor number should be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintFullResourceDescriptor(PCFULL_DESCRIPTOR FullDescriptor, UINT DescriptorNumber, BOOL PrintDescriptorNumber) { DSTRING FullDescriptorNumberString; DSTRING AuxString; DSTRING InterfaceType; DSTRING BusNumber; DSTRING Version; DSTRING Revision; WCHAR AuxNumber[11]; PWSTRING TypeString; ULONG InterfaceId; PARRAY Descriptors; PITERATOR Iterator; PCPARTIAL_DESCRIPTOR PartialDescriptor; ULONG Count; if( !FullDescriptorNumberString.Initialize( s_IndentString ) || !FullDescriptorNumberString.Strcat( s_StringFullDescriptor ) || !InterfaceType.Initialize( s_IndentString ) || !InterfaceType.Strcat( s_StringInterfaceType ) || !BusNumber.Initialize( s_IndentString ) || !BusNumber.Strcat( s_StringBusNumber ) || !Version.Initialize( s_IndentString ) || !Version.Strcat( s_StringVersion ) || !Revision.Initialize( s_IndentString ) || !Revision.Strcat( s_StringRevision ) ) { return FALSE; } // // Build a string that contains the full descriptor number // and print it // if( PrintDescriptorNumber ) { wsprintf( AuxNumber, (LPWSTR)L"%d", DescriptorNumber ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } FullDescriptorNumberString.Strcat( &AuxString ); if( !PrintString( &FullDescriptorNumberString ) ) { return FALSE; } } PrintNewLine(); // // Print the interface type switch( FullDescriptor->GetInterfaceType() ) { case Internal: InterfaceId = IDS_BUS_INTERNAL; break; case Isa: InterfaceId = IDS_BUS_ISA; break; case Eisa: InterfaceId = IDS_BUS_EISA; break; case MicroChannel: InterfaceId = IDS_BUS_MICRO_CHANNEL; break; case TurboChannel: InterfaceId = IDS_BUS_TURBO_CHANNEL; break; case PCIBus: InterfaceId = IDS_BUS_PCI_BUS; break; case VMEBus: InterfaceId = IDS_BUS_VME_BUS; break; case NuBus: InterfaceId = IDS_BUS_NU_BUS; break; case PCMCIABus: InterfaceId = IDS_BUS_PCMCIA_BUS; break; case CBus: InterfaceId = IDS_BUS_C_BUS; break; case MPIBus: InterfaceId = IDS_BUS_MPI_BUS; break; case MPSABus: InterfaceId = IDS_BUS_MPSA_BUS; break; default: InterfaceId = IDS_INVALID; break; } TypeString = REGEDIT_BASE_SYSTEM::QueryString( InterfaceId, "" ); if( TypeString == NULL ) { return FALSE; } InterfaceType.Strcat( TypeString ); DELETE( TypeString ); if(!PrintString( &InterfaceType )) { return FALSE; } PrintNewLine(); // // Print the bus number // wsprintf( AuxNumber, (LPWSTR)L"%d", FullDescriptor->GetBusNumber() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } BusNumber.Strcat( &AuxString ); if( !PrintString( &BusNumber ) ) { return FALSE; } PrintNewLine(); // // Print version // wsprintf( AuxNumber, (LPWSTR)L"%d", FullDescriptor->GetVersion() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } Version.Strcat( &AuxString ); if( !PrintString( &Version ) ) { return FALSE; } PrintNewLine(); // // Print revision // wsprintf( AuxNumber, (LPWSTR)L"%d", FullDescriptor->GetRevision() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } Revision.Strcat( &AuxString ); if( !PrintString( &Revision ) ) { return FALSE; } PrintNewLine(); Descriptors = FullDescriptor->GetResourceDescriptors(); if( ( Descriptors == NULL ) || ( ( Iterator = Descriptors->QueryIterator() ) == NULL ) ) { return FALSE; } Count = 0; while( ( PartialDescriptor = ( PCPARTIAL_DESCRIPTOR )( Iterator->GetNext() ) ) != NULL ) { if( !_PrintPartialDescriptor( PartialDescriptor, Count ) ) { DELETE( Iterator ); return FALSE; } Count++; } DELETE( Iterator ); PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintPartialDescriptor // // DESCRIPTION: Print the contents of a PARTIAL_DESCRIPTOR object. // // PARAMETERS: PartialDescriptor - Pointer to object to be printed. // DescriptorNumber - //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintPartialDescriptor(PCPARTIAL_DESCRIPTOR PartialDescriptor, ULONG DescriptorNumber) { DSTRING PartialDescriptorNumberString; DSTRING AuxString; WCHAR AuxNumber[11]; DSTRING ResourceString; DSTRING DispositionString; ULONG StringId; PWSTRING String; if( !PartialDescriptorNumberString.Initialize( s_IndentString ) || !PartialDescriptorNumberString.Strcat( s_StringPartialDescriptor ) || !ResourceString.Initialize( s_IndentString ) || !ResourceString.Strcat( s_StringResource ) || !DispositionString.Initialize( s_IndentString ) || !DispositionString.Strcat( s_StringDisposition ) ) { return FALSE; } // // Build a string that contains the full descriptor number // and print it // wsprintf( AuxNumber, (LPWSTR)L"%d", DescriptorNumber ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } PartialDescriptorNumberString.Strcat( &AuxString ); if( !PrintString( &PartialDescriptorNumberString ) ) { return FALSE; } PrintNewLine(); // // Print the resource type // if( PartialDescriptor->IsDescriptorTypeDma() ) { StringId = IDS_DEV_DMA; } else if( PartialDescriptor->IsDescriptorTypeInterrupt() ) { StringId = IDS_DEV_INTERRUPT; } else if( PartialDescriptor->IsDescriptorTypeMemory() ) { StringId = IDS_DEV_MEMORY; } else if( PartialDescriptor->IsDescriptorTypePort() ) { StringId = IDS_DEV_PORT; } else if( PartialDescriptor->IsDescriptorTypeDeviceSpecific() ) { StringId = IDS_DEV_DEVICE_SPECIFIC; } else { StringId = IDS_INVALID; } String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { return FALSE; } ResourceString.Strcat( String ); DELETE( String ); if( !PrintString( &ResourceString ) ) { return FALSE; } PrintNewLine(); // // Print the disposition // if( PartialDescriptor->IsResourceShareUndetermined() ) { StringId = IDS_SHARE_UNDETERMINED; } else if( PartialDescriptor->IsResourceShareDeviceExclusive() ) { StringId = IDS_SHARE_DEVICE_EXCLUSIVE; } else if( PartialDescriptor->IsResourceShareDriverExclusive() ) { StringId = IDS_SHARE_DRIVER_EXCLUSIVE; } else { StringId = IDS_SHARE_SHARED; } String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { return FALSE; } DispositionString.Strcat( String ); DELETE( String ); if( !PrintString( &DispositionString ) ) { return FALSE; } PrintNewLine(); if( PartialDescriptor->IsDescriptorTypeDma() ) { if( !_PrintDmaDescriptor( ( PCDMA_DESCRIPTOR )PartialDescriptor ) ) { return FALSE; } } else if( PartialDescriptor->IsDescriptorTypeInterrupt() ) { if( !_PrintInterruptDescriptor( ( PCINTERRUPT_DESCRIPTOR )PartialDescriptor ) ) { return FALSE; } } else if( PartialDescriptor->IsDescriptorTypeMemory() ) { if( !_PrintMemoryDescriptor( ( PCMEMORY_DESCRIPTOR )PartialDescriptor ) ) { return FALSE; } } else if( PartialDescriptor->IsDescriptorTypePort() ) { if( !_PrintPortDescriptor( ( PCPORT_DESCRIPTOR )PartialDescriptor ) ) { return FALSE; } } else if( PartialDescriptor->IsDescriptorTypeDeviceSpecific() ) { if( !_PrintDeviceSpecificDescriptor( ( PCDEVICE_SPECIFIC_DESCRIPTOR )PartialDescriptor ) ) { return FALSE; } } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintInterruptDescriptor // // DESCRIPTION: Print the contents of a INTERRUPT_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintInterruptDescriptor(PCINTERRUPT_DESCRIPTOR Descriptor) { DSTRING VectorString; DSTRING LevelString; DSTRING AffinityString;; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !VectorString.Initialize( s_IndentString ) || !VectorString.Strcat( s_StringVector ) || !LevelString.Initialize( s_IndentString ) || !LevelString.Strcat( s_StringLevel ) || !AffinityString.Initialize( s_IndentString ) || !AffinityString.Strcat( s_StringAffinity ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { return FALSE; } // // Print the vector // wsprintf( AuxNumber, (LPWSTR)L"%d", Descriptor->GetVector() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } VectorString.Strcat( &AuxString ); if( !PrintString( &VectorString ) ) { return FALSE; } PrintNewLine(); // // Print the level // wsprintf( AuxNumber, (LPWSTR)L"%d", Descriptor->GetLevel() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } LevelString.Strcat( &AuxString ); if( !PrintString( &LevelString ) ) { return FALSE; } PrintNewLine(); // // Print the affinity // wsprintf( AuxNumber, (LPWSTR)L"0x%08x", Descriptor->GetAffinity() ); if( !AuxString.Initialize( AuxNumber ) ) { return FALSE; } AffinityString.Strcat( &AuxString ); if( !PrintString( &AffinityString ) ) { return FALSE; } PrintNewLine(); // Print the type StringId = ( Descriptor->IsInterruptLevelSensitive() )? IDS_INT_LEVEL_SENSITIVE : IDS_INT_LATCHED; String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintPortDescriptor // // DESCRIPTION: Print the contents of a PORT_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintPortDescriptor(PCPORT_DESCRIPTOR Descriptor) { DSTRING StartAddressString; DSTRING LengthString; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !StartAddressString.Initialize( s_IndentString ) || !StartAddressString.Strcat( s_StringStart ) || !LengthString.Initialize( s_IndentString ) || !LengthString.Strcat( s_StringLength ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the start address // if( ( ( ( PPORT_DESCRIPTOR )Descriptor )->GetPhysicalAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PPORT_DESCRIPTOR )Descriptor )->GetPhysicalAddress() )->HighPart, ( ( ( PPORT_DESCRIPTOR )Descriptor )->GetPhysicalAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PPORT_DESCRIPTOR )Descriptor )->GetPhysicalAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } StartAddressString.Strcat( &AuxString ); if( !PrintString( &StartAddressString ) ) { return FALSE; } PrintNewLine(); // // Print the length // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetLength() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } LengthString.Strcat( &AuxString ); if( !PrintString( &LengthString ) ) { return FALSE; } PrintNewLine(); // // Print the type // StringId = ( Descriptor->IsPortMemory() )? IDS_PORT_MEMORY : IDS_PORT_PORT; String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintMemoryDescriptor // // DESCRIPTION: Print the contents of a MEMORY_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintMemoryDescriptor(PCMEMORY_DESCRIPTOR Descriptor) { DSTRING StartAddressString; DSTRING LengthString; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !StartAddressString.Initialize( s_IndentString ) || !StartAddressString.Strcat( s_StringStart ) || !LengthString.Initialize( s_IndentString ) || !LengthString.Strcat( s_StringLength ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the start address // if( ( ( ( PMEMORY_DESCRIPTOR )Descriptor )->GetStartAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PMEMORY_DESCRIPTOR )Descriptor )->GetStartAddress() )->HighPart, ( ( ( PMEMORY_DESCRIPTOR )Descriptor )->GetStartAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PMEMORY_DESCRIPTOR )Descriptor )->GetStartAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } StartAddressString.Strcat( &AuxString ); if( !PrintString( &StartAddressString ) ) { return FALSE; } PrintNewLine(); // // Print the length // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetLength() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } LengthString.Strcat( &AuxString ); if( !PrintString( &LengthString ) ) { return FALSE; } PrintNewLine(); // // Print the type // StringId = ( Descriptor->IsMemoryReadWrite() )? IDS_MEM_READ_WRITE : ( ( Descriptor->IsMemoryReadWrite() )? IDS_MEM_READ_ONLY : IDS_MEM_WRITE_ONLY ); String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintDmaDescriptor // // DESCRIPTION: Print the contents of a DMA_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintDmaDescriptor(PCDMA_DESCRIPTOR Descriptor) { DSTRING ChannelString; DSTRING PortString; DSTRING AuxString; WCHAR AuxNumber[19]; if( !ChannelString.Initialize( s_IndentString ) || !ChannelString.Strcat( s_StringChannel ) || !PortString.Initialize( s_IndentString ) || !PortString.Strcat( s_StringPort ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the channel // wsprintf( AuxNumber, (LPWSTR)L"%d", Descriptor->GetChannel() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } ChannelString.Strcat( &AuxString ); if( !PrintString( &ChannelString ) ) { return FALSE; } PrintNewLine(); // // Print the port // wsprintf( AuxNumber, (LPWSTR)L"%d", Descriptor->GetPort() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } PortString.Strcat( &AuxString ); if( !PrintString( &PortString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintDeviceSpecificDescriptor // // DESCRIPTION: Print the contents of a DEVICE_SPECIFIC_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintDeviceSpecificDescriptor(PCDEVICE_SPECIFIC_DESCRIPTOR Descriptor) { DSTRING Reserved1String; DSTRING Reserved2String; DSTRING DataString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG Size; PCBYTE Data; if( !Reserved1String.Initialize( s_IndentString ) || !Reserved1String.Strcat( s_StringReserved1 ) || !Reserved2String.Initialize( s_IndentString ) || !Reserved2String.Strcat( s_StringReserved2 ) || !DataString.Initialize( s_IndentString ) || !DataString.Strcat( s_StringDevSpecificData ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print reserved1 // wsprintf( AuxNumber, (LPWSTR)L"0x%08x", Descriptor->GetReserved1() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } Reserved1String.Strcat( &AuxString ); if( !PrintString( &Reserved1String ) ) { return FALSE; } PrintNewLine(); // // Print reserved2 // wsprintf( AuxNumber, (LPWSTR)L"0x%08x", Descriptor->GetReserved2() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } Reserved2String.Strcat( &AuxString ); if( !PrintString( &Reserved2String ) ) { return FALSE; } PrintNewLine(); Size = Descriptor->GetData( &Data ); if( ( Size != 0 ) && ( Data != NULL ) ) { if( !PrintString( &DataString ) ) { return FALSE; } PrintBinaryData((PBYTE)Data, Size); PrintNewLine(); } return TRUE; } //------------------------------------------------------------------------------ // PrintDataRegRequirementsList // // DESCRIPTION: Print the contents of a DEVICE_SPECIFIC_DESCRIPTOR object. // // PARAMETERS: //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintDataRegRequirementsList(PBYTE Data, ULONG Size) { IO_REQUIREMENTS_LIST RequirementsList; PARRAY AlternativeLists; PITERATOR Iterator; PCIO_DESCRIPTOR_LIST ResourceList; ULONG ListNumber; DSTRING AuxString; DSTRING InterfaceType; DSTRING BusNumber; DSTRING SlotNumber; WCHAR AuxNumber[11]; PWSTRING TypeString; ULONG InterfaceId; PrintNewLine(); if( ( Size == 0 ) || ( Data == NULL ) || !RequirementsList.Initialize( Data, Size ) ) { DebugPrintTrace(( "REGEDT32: Unable to initialize RequirementsList \n" )); return FALSE; } if( !InterfaceType.Initialize( s_IndentString ) || !InterfaceType.Strcat( s_StringIoInterfaceType ) || !BusNumber.Initialize( s_IndentString ) || !BusNumber.Strcat( s_StringIoBusNumber ) || !SlotNumber.Initialize( s_IndentString ) || !SlotNumber.Strcat( s_StringIoSlotNumber ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the interface type // switch( RequirementsList.GetInterfaceType() ) { case Internal: InterfaceId = IDS_BUS_INTERNAL; break; case Isa: InterfaceId = IDS_BUS_ISA; break; case Eisa: InterfaceId = IDS_BUS_EISA; break; case MicroChannel: InterfaceId = IDS_BUS_MICRO_CHANNEL; break; case TurboChannel: InterfaceId = IDS_BUS_TURBO_CHANNEL; break; case PCIBus: InterfaceId = IDS_BUS_PCI_BUS; break; case VMEBus: InterfaceId = IDS_BUS_VME_BUS; break; case NuBus: InterfaceId = IDS_BUS_NU_BUS; break; case PCMCIABus: InterfaceId = IDS_BUS_PCMCIA_BUS; break; case CBus: InterfaceId = IDS_BUS_C_BUS; break; case MPIBus: InterfaceId = IDS_BUS_MPI_BUS; break; case MPSABus: InterfaceId = IDS_BUS_MPSA_BUS; break; default: InterfaceId = IDS_INVALID; break; } TypeString = REGEDIT_BASE_SYSTEM::QueryString( InterfaceId, "" ); if( TypeString == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } InterfaceType.Strcat( TypeString ); DELETE( TypeString ); if( !PrintString( &InterfaceType ) ) { return FALSE; } PrintNewLine(); // // Print the bus number // wsprintf( AuxNumber, (LPWSTR)L"%d", RequirementsList.GetBusNumber() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } BusNumber.Strcat( &AuxString ); if( !PrintString( &BusNumber ) ) { return FALSE; } PrintNewLine(); // // Print the slot number // wsprintf( AuxNumber, (LPWSTR)L"%d", RequirementsList.GetSlotNumber() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } SlotNumber.Strcat( &AuxString ); if( !PrintString( &SlotNumber ) ) { return FALSE; } PrintNewLine(); // // Print the resource lists // if( ( ( AlternativeLists = RequirementsList.GetAlternativeLists() ) == NULL ) || ( ( Iterator = AlternativeLists->QueryIterator() ) == NULL ) ) { DebugPrintTrace(( "REGEDT32: Out of memory! \n" )); return FALSE; } ListNumber = 0; while( ( ResourceList = ( PCIO_DESCRIPTOR_LIST )( Iterator->GetNext() ) ) != NULL ) { if( !_PrintIoResourceList( ResourceList, ListNumber ) ) { DELETE( Iterator ); return FALSE; } ListNumber++; } DELETE( Iterator ); return TRUE; } //------------------------------------------------------------------------------ // PrintIoResourceList // // DESCRIPTION: Print the contents of an IO_DESCRIPTOR_LIST object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoResourceList(PCIO_DESCRIPTOR_LIST DescriptorList, UINT ListNumber) { DSTRING ListNumberString; DSTRING AuxString; WCHAR AuxNumber[11]; PARRAY Descriptors; PITERATOR Iterator; PCIO_DESCRIPTOR IoDescriptor; ULONG Count; if( !ListNumberString.Initialize( s_IndentString ) || !ListNumberString.Strcat( s_StringIoListNumber ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Build a string that contains the list number // and print it // wsprintf( AuxNumber, (LPWSTR)L"%d", ListNumber ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } ListNumberString.Strcat( &AuxString ); if( !PrintString( &ListNumberString ) ) { return FALSE; } PrintNewLine(); Descriptors = DescriptorList->GetDescriptorsList(); if( ( Descriptors == NULL ) || ( ( Iterator = Descriptors->QueryIterator() ) == NULL ) ) { return FALSE; } Count = 0; while( ( IoDescriptor = ( PCIO_DESCRIPTOR )( Iterator->GetNext() ) ) != NULL ) { if( !_PrintIoDescriptor( IoDescriptor, Count ) ) { DELETE( Iterator ); return FALSE; } Count++; } DELETE( Iterator ); PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintIoDescriptor // // DESCRIPTION: Print the contents of an IO_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoDescriptor(PCIO_DESCRIPTOR IoDescriptor, ULONG DescriptorNumber) { DSTRING IoDescriptorNumberString; DSTRING AuxString; WCHAR AuxNumber[11]; DSTRING ResourceString; DSTRING DispositionString; DSTRING OptionString; ULONG StringId; PWSTRING String; if( !IoDescriptorNumberString.Initialize( s_IndentString ) || !IoDescriptorNumberString.Strcat( s_StringIoDescriptorNumber ) || !ResourceString.Initialize( s_IndentString ) || !ResourceString.Strcat( s_StringResource ) || !OptionString.Initialize( s_IndentString ) || !OptionString.Strcat( s_StringIoOption ) || !DispositionString.Initialize( s_IndentString ) || !DispositionString.Strcat( s_StringDisposition ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Build a string that contains the full descriptor number // and print it // wsprintf( AuxNumber, (LPWSTR)L"%d", DescriptorNumber ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } IoDescriptorNumberString.Strcat( &AuxString ); if( !PrintString( &IoDescriptorNumberString ) ) { return FALSE; } PrintNewLine(); // // Print the resource type // if( IoDescriptor->IsDescriptorTypeDma() ) { StringId = IDS_DEV_DMA; } else if( IoDescriptor->IsDescriptorTypeInterrupt() ) { StringId = IDS_DEV_INTERRUPT; } else if( IoDescriptor->IsDescriptorTypeMemory() ) { StringId = IDS_DEV_MEMORY; } else if( IoDescriptor->IsDescriptorTypePort() ) { StringId = IDS_DEV_PORT; } else { StringId = IDS_INVALID; } String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } ResourceString.Strcat( String ); DELETE( String ); if( !PrintString( &ResourceString ) ) { return FALSE; } PrintNewLine(); // // Print the option // wsprintf( AuxNumber, (LPWSTR)L"0x%08x", IoDescriptor->GetOption() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } OptionString.Strcat( &AuxString ); if( !PrintString( &OptionString ) ) { return FALSE; } PrintNewLine(); // // Print the disposition // if( IoDescriptor->IsResourceShareUndetermined() ) { StringId = IDS_SHARE_UNDETERMINED; } else if( IoDescriptor->IsResourceShareDeviceExclusive() ) { StringId = IDS_SHARE_DEVICE_EXCLUSIVE; } else if( IoDescriptor->IsResourceShareDriverExclusive() ) { StringId = IDS_SHARE_DRIVER_EXCLUSIVE; } else { StringId = IDS_SHARE_SHARED; } String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } DispositionString.Strcat( String ); DELETE( String ); if( !PrintString( &DispositionString ) ) { return FALSE; } PrintNewLine(); if( IoDescriptor->IsDescriptorTypeDma() ) { if( !_PrintIoDmaDescriptor( ( PCIO_DMA_DESCRIPTOR )IoDescriptor ) ) { return FALSE; } } else if( IoDescriptor->IsDescriptorTypeInterrupt() ) { if( !_PrintIoInterruptDescriptor( ( PCIO_INTERRUPT_DESCRIPTOR )IoDescriptor ) ) { return FALSE; } } else if( IoDescriptor->IsDescriptorTypeMemory() ) { if( !_PrintIoMemoryDescriptor( ( PCIO_MEMORY_DESCRIPTOR )IoDescriptor ) ) { return FALSE; } } else if( IoDescriptor->IsDescriptorTypePort() ) { if( !_PrintIoPortDescriptor( ( PCIO_PORT_DESCRIPTOR )IoDescriptor ) ) { return FALSE; } } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintIoInterruptDescriptor // // DESCRIPTION: Print the contents of an IO_INTERRUPT_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoInterruptDescriptor(PCIO_INTERRUPT_DESCRIPTOR Descriptor) { DSTRING MinimumVectorString; DSTRING MaximumVectorString; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !MinimumVectorString.Initialize( s_IndentString ) || !MinimumVectorString.Strcat( s_StringIoMinimumVector ) || !MaximumVectorString.Initialize( s_IndentString ) || !MaximumVectorString.Strcat( s_StringIoMaximumVector ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the type // StringId = ( Descriptor->IsInterruptLevelSensitive() )? IDS_INT_LEVEL_SENSITIVE : IDS_INT_LATCHED; String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); // // Print the minimum vector // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetMinimumVector() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MinimumVectorString.Strcat( &AuxString ); if( !PrintString( &MinimumVectorString ) ) { return FALSE; } PrintNewLine(); // // Print the maximum vector // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetMaximumVector() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MaximumVectorString.Strcat( &AuxString ); if( !PrintString( &MaximumVectorString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintIoPortDescriptor // // DESCRIPTION: Print the contents of an IO_PORT_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoPortDescriptor(PCIO_PORT_DESCRIPTOR Descriptor) { DSTRING MinimumAddressString; DSTRING MaximumAddressString; DSTRING LengthString; DSTRING AlignmentString; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !MinimumAddressString.Initialize( s_IndentString ) || !MinimumAddressString.Strcat( s_StringIoMinimumAddress ) || !MaximumAddressString.Initialize( s_IndentString ) || !MaximumAddressString.Strcat( s_StringIoMaximumAddress ) || !LengthString.Initialize( s_IndentString ) || !LengthString.Strcat( s_StringLength ) || !AlignmentString.Initialize( s_IndentString ) || !AlignmentString.Strcat( s_StringIoAlignment ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the type // StringId = ( Descriptor->IsPortMemory() )? IDS_PORT_MEMORY : IDS_PORT_PORT; String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); // // Print the length // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetLength() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } LengthString.Strcat( &AuxString ); if( !PrintString( &LengthString ) ) { return FALSE; } PrintNewLine(); // // Print the alignment // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetAlignment() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } AlignmentString.Strcat( &AuxString ); if( !PrintString( &AlignmentString ) ) { return FALSE; } PrintNewLine(); // // Print the minimum address // if( ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->HighPart, ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MinimumAddressString.Strcat( &AuxString ); if( !PrintString( &MinimumAddressString ) ) { return FALSE; } PrintNewLine(); // // Print the maximum address // if( ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->HighPart, ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MaximumAddressString.Strcat( &AuxString ); if( !PrintString( &MaximumAddressString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintIoMemoryDescriptor // // DESCRIPTION: Print the contents of an IO_MEMORY_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoMemoryDescriptor(PCIO_MEMORY_DESCRIPTOR Descriptor) { DSTRING MinimumAddressString; DSTRING MaximumAddressString; DSTRING LengthString; DSTRING AlignmentString; DSTRING TypeString; DSTRING AuxString; WCHAR AuxNumber[19]; ULONG StringId; PWSTRING String; if( !MinimumAddressString.Initialize( s_IndentString ) || !MinimumAddressString.Strcat( s_StringIoMinimumAddress ) || !MaximumAddressString.Initialize( s_IndentString ) || !MaximumAddressString.Strcat( s_StringIoMaximumAddress ) || !LengthString.Initialize( s_IndentString ) || !LengthString.Strcat( s_StringLength ) || !AlignmentString.Initialize( s_IndentString ) || !AlignmentString.Strcat( s_StringIoAlignment ) || !TypeString.Initialize( s_IndentString ) || !TypeString.Strcat( s_StringType ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the type // StringId = ( Descriptor->IsMemoryReadWrite() )? IDS_MEM_READ_WRITE : ( ( Descriptor->IsMemoryReadWrite() )? IDS_MEM_READ_ONLY : IDS_MEM_WRITE_ONLY ); String = REGEDIT_BASE_SYSTEM::QueryString( StringId, "" ); if( String == NULL ) { DebugPrintTrace(( "REGEDT32: Unable to retrieve string \n" )); return FALSE; } TypeString.Strcat( String ); DELETE( String ); if( !PrintString( &TypeString ) ) { return FALSE; } PrintNewLine(); // // Print the length // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetLength() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } LengthString.Strcat( &AuxString ); if( !PrintString( &LengthString ) ) { return FALSE; } PrintNewLine(); // // Print the alignment // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetAlignment() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } AlignmentString.Strcat( &AuxString ); if( !PrintString( &AlignmentString ) ) { return FALSE; } PrintNewLine(); // // Print the minimum address // if( ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->HighPart, ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMinimumAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MinimumAddressString.Strcat( &AuxString ); if( !PrintString( &MinimumAddressString ) ) { return FALSE; } PrintNewLine(); // // Print the maximum address // if( ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->HighPart != 0 ) { wsprintf( AuxNumber, (LPWSTR)L"0x%08x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->HighPart, ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->LowPart ); } else { wsprintf( AuxNumber, (LPWSTR)L"0x%08x", ( ( ( PIO_PORT_DESCRIPTOR )Descriptor )->GetMaximumAddress() )->LowPart ); } if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MaximumAddressString.Strcat( &AuxString ); if( !PrintString( &MaximumAddressString ) ) { return FALSE; } PrintNewLine(); return TRUE; } //------------------------------------------------------------------------------ // PrintIoDmaDescriptor // // DESCRIPTION: Print the contents of an IO_DMA_DESCRIPTOR object. // // PARAMETERS: Descriptor - Pointer to object to be printed. //------------------------------------------------------------------------------ BOOL PRINT_RESOURCE::_PrintIoDmaDescriptor(PCIO_DMA_DESCRIPTOR Descriptor) { DSTRING MinimumChannelString; DSTRING MaximumChannelString; DSTRING AuxString; WCHAR AuxNumber[19]; if( !MinimumChannelString.Initialize( s_IndentString ) || !MinimumChannelString.Strcat( s_StringIoMinimumChannel ) || !MaximumChannelString.Initialize( s_IndentString ) || !MaximumChannelString.Strcat( s_StringIoMaximumChannel ) ) { DebugPrint( "REGEDT32: Initialization failure" ); return FALSE; } // // Print the minimum channel // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetMinimumChannel() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MinimumChannelString.Strcat( &AuxString ); if( !PrintString( &MinimumChannelString ) ) { return FALSE; } PrintNewLine(); // // Print the maximum channel // wsprintf( AuxNumber, (LPWSTR)L"%#x", Descriptor->GetMaximumChannel() ); if( !AuxString.Initialize( AuxNumber ) ) { DebugPrint( "AuxString.Initialize() failed" ); return FALSE; } MaximumChannelString.Strcat( &AuxString ); if( !PrintString( &MaximumChannelString ) ) { return FALSE; } PrintNewLine(); return TRUE; }