|
|
/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
regdesc.hxx
Abstract:
This module contains the declarations for the following base classes: PARTIAL_DESCRIPTOR, PORT_DESCRIPTOR, INTERRUPT_DESCRIPTOR, MEMORY_DESCRIPTOR, DMA_DESCRIPTOR and DEVICE_SPECIFIC_DESCRIPTOR. The last 5 classes are derived from the first one.
These classes model a CM_PARTIAL_RESOURCE_DESCRIPTOR structure, used on registry data of type REG_FULL_RESOURCE_DESCRIPTOR and REG_RESOURCE_LIST.
Author:
Jaime Sasson (jaimes) 01-Dec-1993
Environment:
ULIB, User Mode
--*/
#if !defined( _PARTIAL_DESCRIPTOR_ )
#define _PARTIAL_DESCRIPTOR_
#define _NTAPI_ULIB_
// don't let ntdddisk.h (included in ulib.hxx"
// redefine values
#define _NTDDDISK_H_
#include "ulib.hxx"
DECLARE_CLASS( PARTIAL_DESCRIPTOR );
class PARTIAL_DESCRIPTOR : public OBJECT {
public:
VIRTUAL ~PARTIAL_DESCRIPTOR( );
VIRTUAL UCHAR GetShareDisposition( ) CONST;
VIRTUAL USHORT GetFlags( ) CONST;
VIRTUAL BOOLEAN IsDescriptorTypePort( ) CONST;
VIRTUAL BOOLEAN IsDescriptorTypeInterrupt( ) CONST;
VIRTUAL BOOLEAN IsDescriptorTypeMemory( ) CONST;
VIRTUAL BOOLEAN IsDescriptorTypeDma( ) CONST;
VIRTUAL BOOLEAN IsDescriptorTypeDeviceSpecific( ) CONST;
VIRTUAL BOOLEAN IsResourceShareUndetermined( ) CONST;
VIRTUAL BOOLEAN IsResourceShareDeviceExclusive( ) CONST;
VIRTUAL BOOLEAN IsResourceShareDriverExclusive( ) CONST;
VIRTUAL BOOLEAN IsResourceShareShared( ) CONST;
protected:
DECLARE_CONSTRUCTOR( PARTIAL_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN UCHAR Type, IN UCHAR ShareDisposition, IN USHORT Flags );
private:
NONVIRTUAL VOID Construct( );
UCHAR _Type; UCHAR _ShareDisposition; USHORT _Flags; };
INLINE BOOLEAN PARTIAL_DESCRIPTOR::Initialize( IN UCHAR Type, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initializes an object of type PARTIAL_DESCRIPTOR.
Arguments:
Type -
ShareDisposition -
Flags -
Return Value:
Returns TRUE if the initialization succeeded, or FALSE otherwise.
--*/
{ _Type = Type; _ShareDisposition = ShareDisposition; _Flags = Flags; return( TRUE ); }
INLINE UCHAR PARTIAL_DESCRIPTOR::GetShareDisposition( ) CONST
/*++
Routine Description:
Return the device descriptor's share disposition.
Arguments:
None.
Return Value:
Returns the device descriptor's share disposition.
--*/
{ return( _ShareDisposition ); }
INLINE USHORT PARTIAL_DESCRIPTOR::GetFlags( ) CONST
/*++
Routine Description:
Return the device descriptor's flags.
Arguments:
None.
Return Value:
Returns the device descriptor's flags.
--*/
{ return( _Flags ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsDescriptorTypePort( ) CONST
/*++
Routine Description:
Determine whether or not this object represents a PORT_DESCRIPTOR.
Arguments:
None.
Return Value:
Returns TRUE if the object represents a PORT_DESCRIPTOR.
--*/
{ return( _Type == CmResourceTypePort ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsDescriptorTypeInterrupt( ) CONST
/*++
Routine Description:
Determine whether or not this object represents a INTERRUPT_DESCRIPTOR.
Arguments:
None.
Return Value:
Returns TRUE if the object represents a INTERRUPT_DESCRIPTOR.
--*/
{ return( _Type == CmResourceTypeInterrupt ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsDescriptorTypeMemory( ) CONST
/*++
Routine Description:
Determine whether or not this object represents a MEMORY_DESCRIPTOR.
Arguments:
None.
Return Value:
Returns TRUE if the object represents a MEMORY_DESCRIPTOR.
--*/
{ return( _Type == CmResourceTypeMemory ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsDescriptorTypeDma( ) CONST
/*++
Routine Description:
Determine whether or not this object represents a DMA_DESCRIPTOR.
Arguments:
None.
Return Value:
Returns TRUE if the object represents a DMA_DESCRIPTOR.
--*/
{ return( _Type == CmResourceTypeDma ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsDescriptorTypeDeviceSpecific( ) CONST
/*++
Routine Description:
Determine whether or not this object represents a DEVICE_SPECIFIC_DESCRIPTOR.
Arguments:
None.
Return Value:
Returns TRUE if the object represents a DEVICE_SPECIFIC_DESCRIPTOR.
--*/
{ return( _Type == CmResourceTypeDeviceSpecific ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsResourceShareUndetermined( ) CONST
/*++
Routine Description:
Determine whether or not the share of the device represented by this object is undetermined.
Arguments:
None.
Return Value:
Returns TRUE if the share is undetermined.
--*/
{ return( _ShareDisposition == CmResourceShareUndetermined ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsResourceShareDeviceExclusive( ) CONST
/*++
Routine Description:
Determine whether or not the share of the device represented by this object is device exclusive.
Arguments:
None.
Return Value:
Returns TRUE if the share is device exclusive.
--*/
{ return( _ShareDisposition == CmResourceShareDeviceExclusive ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsResourceShareDriverExclusive( ) CONST
/*++
Routine Description:
Determine whether or not the share of the device represented by this object is driver exclusive.
Arguments:
None.
Return Value:
Returns TRUE if the share is driver exclusive.
--*/
{ return( _ShareDisposition == CmResourceShareDriverExclusive ); }
INLINE BOOLEAN PARTIAL_DESCRIPTOR::IsResourceShareShared( ) CONST
/*++
Routine Description:
Determine whether or not the share of the device represented by this object is shared.
Arguments:
None.
Return Value:
Returns TRUE if the share is shared.
--*/
{ return( _ShareDisposition == CmResourceShareShared ); }
// #endif // _PARTIAL_DESCRIPTOR_
// #if !defined( _PORT_DESCRIPTOR_ )
// #define _PORT_DESCRIPTOR_
// #define _NTAPI_ULIB_
// #include "ulib.hxx"
DECLARE_CLASS( PORT_DESCRIPTOR );
class PORT_DESCRIPTOR : public PARTIAL_DESCRIPTOR {
public:
NONVIRTUAL ~PORT_DESCRIPTOR( );
DECLARE_CONSTRUCTOR( PORT_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN PPHYSICAL_ADDRESS PhysicalAddress, IN ULONG Length, IN UCHAR ShareDisposition, IN USHORT Flags );
NONVIRTUAL PPHYSICAL_ADDRESS GetPhysicalAddress( ); // CONST;
NONVIRTUAL ULONG GetLength( ) CONST;
NONVIRTUAL BOOLEAN IsPortIo( ) CONST;
NONVIRTUAL BOOLEAN IsPortMemory( ) CONST;
private:
NONVIRTUAL VOID Construct( );
PHYSICAL_ADDRESS _PhysicalAddress; ULONG _Length; };
INLINE BOOLEAN PORT_DESCRIPTOR::Initialize( IN PPHYSICAL_ADDRESS PhysicalAddress, IN ULONG Length, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initialize a PORT_DESCRIPTOR object.
Arguments:
PhysicalAddress -
Length -
ShareDisposition -
Flags -
Return Value:
BOOLEAN - Returns TRUE if the operation succeeeds.
--*/
{ _PhysicalAddress = *PhysicalAddress; _Length = Length; return( PARTIAL_DESCRIPTOR::Initialize( CmResourceTypePort, ShareDisposition, Flags ) ); }
INLINE PPHYSICAL_ADDRESS PORT_DESCRIPTOR::GetPhysicalAddress( ) // CONST
/*++
Routine Description:
Returns the port's physical address.
Arguments:
None.
Return Value:
PPHYSICAL_ADDRESS - Pointer to the structure that describes the port's physical address.
--*/
{ return( &_PhysicalAddress ); }
INLINE ULONG PORT_DESCRIPTOR::GetLength( ) CONST
/*++
Routine Description:
Returns the port's length.
Arguments:
None.
Return Value:
ULONG - Return the port's length.
--*/
{ return( _Length ); }
INLINE BOOLEAN PORT_DESCRIPTOR::IsPortIo( ) CONST
/*++
Routine Description:
Return whether or not the port is an I/O.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if the port is an I/O. Returns FALSE otherwise.
--*/
{ return( ( PARTIAL_DESCRIPTOR::GetFlags() & CM_RESOURCE_PORT_IO ) == CM_RESOURCE_PORT_IO ); }
INLINE BOOLEAN PORT_DESCRIPTOR::IsPortMemory( ) CONST
/*++
Routine Description:
Return whether or not the port is mapped in memory.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if the port is mapped in memory. Returns FALSE otherwise.
--*/
{ return( PARTIAL_DESCRIPTOR::GetFlags() == CM_RESOURCE_PORT_MEMORY ); }
// #endif // _PORT_DESCRIPTOR_
// #if !defined( _INTERRUPT_DESCRIPTOR_ )
// #define _INTERRUPT_DESCRIPTOR_
// #define _NTAPI_ULIB_
// #include "ulib.hxx"
DECLARE_CLASS( INTERRUPT_DESCRIPTOR );
class INTERRUPT_DESCRIPTOR : public PARTIAL_DESCRIPTOR {
public:
NONVIRTUAL ~INTERRUPT_DESCRIPTOR( );
DECLARE_CONSTRUCTOR( INTERRUPT_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN KAFFINITY Affinity, IN ULONG Level, IN ULONG Vector, IN UCHAR ShareDisposition, IN USHORT Flags );
NONVIRTUAL KAFFINITY GetAffinity( ) CONST;
NONVIRTUAL ULONG GetLevel( ) CONST;
NONVIRTUAL ULONG GetVector( ) CONST;
NONVIRTUAL BOOLEAN IsInterruptLevelSensitive( ) CONST;
NONVIRTUAL BOOLEAN IsInterruptLatched( ) CONST;
private:
NONVIRTUAL VOID Construct( );
KAFFINITY _Affinity; ULONG _Level; ULONG _Vector; };
INLINE BOOLEAN INTERRUPT_DESCRIPTOR::Initialize( IN KAFFINITY Affinity, IN ULONG Level, IN ULONG Vector, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initialize an INTERRUPT_DESCRIPTOR object.
Arguments:
Affinity -
Level -
Vector -
ShareDisposition -
Flags -
Return Value:
BOOLEAN - Returns TRUE if the operation succeeeds.
--*/
{ _Affinity = Affinity; _Level = Level; _Vector = Vector; return( PARTIAL_DESCRIPTOR::Initialize( CmResourceTypeInterrupt, ShareDisposition, Flags ) ); }
INLINE KAFFINITY INTERRUPT_DESCRIPTOR::GetAffinity( ) CONST
/*++
Routine Description:
Returns the interrupt's affinity.
Arguments:
None.
Return Value:
ULONG - Interrupt's affinity.
--*/
{ return( _Affinity ); }
INLINE ULONG INTERRUPT_DESCRIPTOR::GetLevel( ) CONST
/*++
Routine Description:
Returns the interrupt's level.
Arguments:
None.
Return Value:
ULONG - Return the interrupt's level.
--*/
{ return( _Level ); }
INLINE ULONG INTERRUPT_DESCRIPTOR::GetVector( ) CONST
/*++
Routine Description:
Returns the interrupt's vector.
Arguments:
None.
Return Value:
ULONG - Return the interrupt's vector.
--*/
{ return( _Vector ); }
INLINE BOOLEAN INTERRUPT_DESCRIPTOR::IsInterruptLevelSensitive( ) CONST
/*++
Routine Description:
Return whether or not the interrupt is level sensitive.
Arguments:
None.
Return Value:
BOOLEAN - Return TRUE if the interrupt is level sensitive.
--*/
{ return( PARTIAL_DESCRIPTOR::GetFlags() == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE ); }
INLINE BOOLEAN INTERRUPT_DESCRIPTOR::IsInterruptLatched( ) CONST
/*++
Routine Description:
Return whether or not the interrupt is latched.
Arguments:
None.
Return Value:
BOOLEAN - Return TRUE if the interrupt is latched.
--*/
{ return( ( PARTIAL_DESCRIPTOR::GetFlags() & CM_RESOURCE_INTERRUPT_LATCHED ) == CM_RESOURCE_INTERRUPT_LATCHED ); }
// #endif // _INTERRUPT_DESCRIPTOR_
// #if !defined( _MEMORY_DESCRIPTOR_ )
// #define _MEMORY_DESCRIPTOR_
// #define _NTAPI_ULIB_
// #include "ulib.hxx"
DECLARE_CLASS( MEMORY_DESCRIPTOR );
class MEMORY_DESCRIPTOR : public PARTIAL_DESCRIPTOR {
public:
NONVIRTUAL ~MEMORY_DESCRIPTOR( );
DECLARE_CONSTRUCTOR( MEMORY_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN PPHYSICAL_ADDRESS StartAddress, IN ULONG Length, IN UCHAR ShareDisposition, IN USHORT Flags );
NONVIRTUAL PPHYSICAL_ADDRESS GetStartAddress( ); // CONST;
NONVIRTUAL ULONG GetLength( ) CONST;
NONVIRTUAL BOOLEAN IsMemoryReadWrite( ) CONST;
NONVIRTUAL BOOLEAN IsMemoryReadOnly( ) CONST;
NONVIRTUAL BOOLEAN IsMemoryWriteOnly( ) CONST;
private:
NONVIRTUAL VOID Construct( );
PHYSICAL_ADDRESS _StartAddress; ULONG _Length; };
INLINE BOOLEAN MEMORY_DESCRIPTOR::Initialize( IN PPHYSICAL_ADDRESS StartAddress, IN ULONG Length, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initialize a MEMORY_DESCRIPTOR object.
Arguments:
StartAddress -
Length -
ShareDisposition -
Flags -
Return Value:
BOOLEAN - Returns TRUE if the operation succeeeds.
--*/
{ _StartAddress = *StartAddress; _Length = Length; return( PARTIAL_DESCRIPTOR::Initialize( CmResourceTypeMemory, ShareDisposition, Flags ) ); }
INLINE PPHYSICAL_ADDRESS MEMORY_DESCRIPTOR::GetStartAddress( ) // CONST
/*++
Routine Description:
Returns the memory's start address.
Arguments:
None.
Return Value:
ULONG - Memory's start address.
--*/
{ return( &_StartAddress ); }
INLINE ULONG MEMORY_DESCRIPTOR::GetLength( ) CONST
/*++
Routine Description:
Returns the memory's length.
Arguments:
None.
Return Value:
ULONG - Return the memory's length.
--*/
{ return( _Length ); }
INLINE BOOLEAN MEMORY_DESCRIPTOR::IsMemoryReadWrite( ) CONST
/*++
Routine Description:
Return whether or not the memory is Read/Write.
Arguments:
None.
Return Value:
BOOLEAN - Return TRUE if the memory is Read/Write.
--*/
{ return( PARTIAL_DESCRIPTOR::GetFlags() == CM_RESOURCE_MEMORY_READ_WRITE ); }
INLINE BOOLEAN MEMORY_DESCRIPTOR::IsMemoryReadOnly( ) CONST
/*++
Routine Description:
Return whether or not the memory is ReadOnly.
Arguments:
None.
Return Value:
BOOLEAN - Return TRUE if the memory is ReadOnly.
--*/
{ return( ( PARTIAL_DESCRIPTOR::GetFlags() & CM_RESOURCE_MEMORY_READ_ONLY ) == CM_RESOURCE_MEMORY_READ_ONLY ); }
INLINE BOOLEAN MEMORY_DESCRIPTOR::IsMemoryWriteOnly( ) CONST
/*++
Routine Description:
Return whether or not the memory is WriteOnly.
Arguments:
None.
Return Value:
BOOLEAN - Return TRUE if the memory is WriteOnly.
--*/
{ return( ( PARTIAL_DESCRIPTOR::GetFlags() & CM_RESOURCE_MEMORY_WRITE_ONLY ) == CM_RESOURCE_MEMORY_WRITE_ONLY ); }
// #endif // _MEMORY_DESCRIPTOR_
// #if !defined( _DMA_DESCRIPTOR_ )
// #define _DMA_DESCRIPTOR_
// #define _NTAPI_ULIB_
// #include "ulib.hxx"
DECLARE_CLASS( DMA_DESCRIPTOR );
class DMA_DESCRIPTOR : public PARTIAL_DESCRIPTOR {
public:
NONVIRTUAL ~DMA_DESCRIPTOR( );
DECLARE_CONSTRUCTOR( DMA_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN ULONG Channel, IN ULONG Port, IN ULONG Reserved1, IN UCHAR ShareDisposition, IN USHORT Flags );
NONVIRTUAL ULONG GetChannel( ) CONST;
NONVIRTUAL ULONG GetPort( ) CONST;
NONVIRTUAL ULONG GetReserved( ) CONST;
private:
NONVIRTUAL VOID Construct( );
ULONG _Channel; ULONG _Port; ULONG _Reserved1; };
INLINE BOOLEAN DMA_DESCRIPTOR::Initialize( IN ULONG Channel, IN ULONG Port, IN ULONG Reserved1, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initialize a DMA_DESCRIPTOR object.
Arguments:
Channel -
Port -
Reserved1 -
ShareDisposition -
Flags -
Return Value:
BOOLEAN - Returns TRUE if the operation succeeeds.
--*/
{ _Channel = Channel; _Port = Port; _Reserved1 = Reserved1; return( PARTIAL_DESCRIPTOR::Initialize( CmResourceTypeDma, ShareDisposition, Flags ) ); }
INLINE ULONG DMA_DESCRIPTOR::GetChannel( ) CONST
/*++
Routine Description:
Returns the DMA's channel.
Arguments:
None.
Return Value:
ULONG - DMA's channel.
--*/
{ return( _Channel ); }
INLINE ULONG DMA_DESCRIPTOR::GetPort( ) CONST
/*++
Routine Description:
Returns the DMA's port.
Arguments:
None.
Return Value:
ULONG - Return the DMA's length.
--*/
{ return( _Port ); }
INLINE ULONG DMA_DESCRIPTOR::GetReserved( ) CONST
/*++
Routine Description:
Returns the DMA's reserved data.
Arguments:
None.
Return Value:
ULONG - Return the DMA's reserved data.
--*/
{ return( _Reserved1 ); }
// #endif // _DMA_DESCRIPTOR_
// #if !defined( _DEVICE_SPECIFIC_DESCRIPTOR_ )
// #define _DEVICE_SPECIFIC_DESCRIPTOR_
// #define _NTAPI_ULIB_
// #include "ulib.hxx"
DECLARE_CLASS( DEVICE_SPECIFIC_DESCRIPTOR );
class DEVICE_SPECIFIC_DESCRIPTOR : public PARTIAL_DESCRIPTOR {
public:
NONVIRTUAL ~DEVICE_SPECIFIC_DESCRIPTOR( );
DECLARE_CONSTRUCTOR( DEVICE_SPECIFIC_DESCRIPTOR );
NONVIRTUAL BOOLEAN Initialize( IN ULONG Reserved1, IN ULONG Reserved2, IN ULONG DataSize, IN PCBYTE Data, IN UCHAR ShareDisposition, IN USHORT Flags );
NONVIRTUAL ULONG GetReserved1( ) CONST;
NONVIRTUAL ULONG GetReserved2( ) CONST;
NONVIRTUAL ULONG GetData( IN OUT PCBYTE* Pointer ) CONST;
private:
NONVIRTUAL VOID Construct( );
ULONG _Reserved1; ULONG _Reserved2; PBYTE _Data; ULONG _DataSize; };
INLINE BOOLEAN DEVICE_SPECIFIC_DESCRIPTOR::Initialize( IN ULONG Reserved1, IN ULONG Reserved2, IN ULONG DataSize, IN PCBYTE Data, IN UCHAR ShareDisposition, IN USHORT Flags )
/*++
Routine Description:
Initialize a DEVICE_SPECIFIC_DESCRIPTOR object.
Arguments:
Reserved1 -
Reserved2 -
Size -
Data -
ShareDisposition -
Flags -
Return Value:
BOOLEAN - Returns TRUE if the operation succeeeds.
--*/
{ _Reserved1 = Reserved1; _Reserved2 = Reserved2; _DataSize = DataSize; if( Data != NULL ) { _Data = ( PBYTE )MALLOC( _DataSize ); if( _Data == NULL ) { return( FALSE ); } memcpy( _Data, Data, _DataSize ); } return( PARTIAL_DESCRIPTOR::Initialize( CmResourceTypeDeviceSpecific, ShareDisposition, Flags ) ); }
INLINE ULONG DEVICE_SPECIFIC_DESCRIPTOR::GetReserved1( ) CONST
/*++
Routine Description:
Returns the first reserved device specific data.
Arguments:
None.
Return Value:
ULONG - First reserved device specific data.
--*/
{ return( _Reserved1 ); }
INLINE ULONG DEVICE_SPECIFIC_DESCRIPTOR::GetReserved2( ) CONST
/*++
Routine Description:
Returns the second reserved device specific data.
Arguments:
None.
Return Value:
ULONG - Second reserved device specific data.
--*/
{ return( _Reserved2 ); }
INLINE ULONG DEVICE_SPECIFIC_DESCRIPTOR::GetData( IN OUT PCBYTE* Pointer ) CONST
/*++
Routine Description:
Returns the device specific data.
Arguments:
Pointer - Address of the variable that will contain the pointer to the device specific data.
Return Value:
ULONG - Return the number of bytes in the buffer.
--*/
{ if( Pointer != NULL ) { *Pointer = _Data; return( _DataSize ); } else { return( 0 ); } }
// #endif // _DEVICE_SPECIFIC_DESCRIPTOR_
#endif // _PARTIAL_DESCRIPTOR_
|