817 lines
10 KiB
C++
817 lines
10 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992-2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
regkey.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the declarations for the REGISTRY_KEY_INFO class.
|
|||
|
REGISTRY_KEY_INFO is class that contains all the information of a
|
|||
|
registry key, sucha as:
|
|||
|
|
|||
|
-Key Name
|
|||
|
-Title Index
|
|||
|
-Class
|
|||
|
-Security Attribute
|
|||
|
-Last Write Time
|
|||
|
-Number of Sub-keys
|
|||
|
-Number of Value Entries
|
|||
|
|
|||
|
A REGISTRY_KEY_INFO object is reinitializable.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jaime Sasson (jaimes) 01-Mar-1992
|
|||
|
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Ulib, User Mode
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#if !defined( _REGISTRY_KEY_INFO_ )
|
|||
|
|
|||
|
#define _REGISTRY_KEY_INFO_
|
|||
|
|
|||
|
#include "ulib.hxx"
|
|||
|
#include "wstring.hxx"
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
#include "timeinfo.hxx"
|
|||
|
#endif
|
|||
|
|
|||
|
DECLARE_CLASS( REGISTRY );
|
|||
|
DECLARE_CLASS( REGISTRY_KEY_INFO );
|
|||
|
|
|||
|
|
|||
|
#if defined( _AUTOCHECK_ )
|
|||
|
#define PSECURITY_ATTRIBUTES PVOID
|
|||
|
#endif
|
|||
|
|
|||
|
class REGISTRY_KEY_INFO : public OBJECT {
|
|||
|
|
|||
|
|
|||
|
FRIEND class REGISTRY;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
DECLARE_CONSTRUCTOR( REGISTRY_KEY_INFO );
|
|||
|
|
|||
|
DECLARE_CAST_MEMBER_FUNCTION( REGISTRY_KEY_INFO );
|
|||
|
|
|||
|
|
|||
|
VIRTUAL
|
|||
|
~REGISTRY_KEY_INFO(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Initialize(
|
|||
|
IN PCWSTRING KeyName,
|
|||
|
IN PCWSTRING ParentName,
|
|||
|
IN ULONG TitleIndex,
|
|||
|
IN PCWSTRING Class,
|
|||
|
IN PSECURITY_ATTRIBUTES SecurityAttributes DEFAULT NULL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCWSTRING
|
|||
|
GetClass(
|
|||
|
) CONST;
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCTIMEINFO
|
|||
|
GetLastWriteTime(
|
|||
|
) CONST;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCWSTRING
|
|||
|
GetName(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ULONG
|
|||
|
GetNumberOfSubKeys(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ULONG
|
|||
|
GetNumberOfValues(
|
|||
|
) CONST;
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PCWSTRING
|
|||
|
GetParentName(
|
|||
|
) CONST;
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK )
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PSECURITY_ATTRIBUTES
|
|||
|
GetSecurityAttributes(
|
|||
|
) CONST;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
ULONG
|
|||
|
GetTitleIndex(
|
|||
|
) CONST;
|
|||
|
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsKeyInitialized(
|
|||
|
) CONST;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
DbgPrintKeyInfo(
|
|||
|
);
|
|||
|
|
|||
|
#endif // DBG
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
NONVIRTUAL // Only REGISTRY can access it
|
|||
|
BOOLEAN
|
|||
|
Initialize(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Construct(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Destroy(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
PutClass(
|
|||
|
IN PCWSTRING Class
|
|||
|
);
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
PutLastWriteTime(
|
|||
|
IN PCTIMEINFO LastWriteTime
|
|||
|
);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
PutName(
|
|||
|
IN PCWSTRING Name
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
PutParentName(
|
|||
|
IN PCWSTRING ParentName
|
|||
|
);
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK )
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
PutSecurityAttributes(
|
|||
|
IN PSECURITY_ATTRIBUTES SecurityAttributes
|
|||
|
);
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#if defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetLastWriteTime(
|
|||
|
IN TIME LastWriteTime
|
|||
|
);
|
|||
|
|
|||
|
#endif
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetKeyInitializedFlag(
|
|||
|
IN BOOLEAN Initialized
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetNumberOfSubKeys(
|
|||
|
IN ULONG NumberOfSubKeys
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetNumberOfValues(
|
|||
|
IN ULONG NumberOfValues
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
SetTitleIndex(
|
|||
|
IN ULONG TitleIndex
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
DSTRING _Name;
|
|||
|
DSTRING _ParentName;
|
|||
|
ULONG _TitleIndex;
|
|||
|
DSTRING _Class;
|
|||
|
ULONG _NumberOfSubKeys;
|
|||
|
ULONG _NumberOfValues;
|
|||
|
BOOLEAN _KeyIsCompletelyInitialized;
|
|||
|
|
|||
|
#if defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
TIME _LastWriteTime;
|
|||
|
|
|||
|
#else
|
|||
|
TIMEINFO _LastWriteTime;
|
|||
|
SECURITY_ATTRIBUTES _SecurityAttributes;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCWSTRING
|
|||
|
REGISTRY_KEY_INFO::GetClass(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the class of a key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
PCWSTRING - Pointer to a WSTRING object that contains the key class.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( &_Class );
|
|||
|
}
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
INLINE
|
|||
|
PCTIMEINFO
|
|||
|
REGISTRY_KEY_INFO::GetLastWriteTime(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the Last Write Time of a key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
PCTIMEINFO - Pointer to a TIMEINFO object that contains the Last Write Time
|
|||
|
of the key.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( &_LastWriteTime );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCWSTRING
|
|||
|
REGISTRY_KEY_INFO::GetName(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the name of a key (relative to its parent).
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
PCWSTRING - Pointer to a WSTRING object that contains the key name.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( &_Name );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
PCWSTRING
|
|||
|
REGISTRY_KEY_INFO::GetParentName(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the name of parent of this key ( full name ).
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
PCWSTRING - Pointer to a WSTRING object that contains the parent's name.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( &_ParentName );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
ULONG
|
|||
|
REGISTRY_KEY_INFO::GetNumberOfSubKeys(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the number of subkeys in the key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
ULONG - The number of subkeys.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( _NumberOfSubKeys );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
ULONG
|
|||
|
REGISTRY_KEY_INFO::GetNumberOfValues(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the number of value entries in the key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
ULONG - The number of value entries.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( _NumberOfValues );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
INLINE
|
|||
|
PSECURITY_ATTRIBUTES
|
|||
|
REGISTRY_KEY_INFO::GetSecurityAttributes(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the security attributes of the key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
PVOID - Pointer to the security attribute
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( (PSECURITY_ATTRIBUTES)&_SecurityAttributes );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
ULONG
|
|||
|
REGISTRY_KEY_INFO::GetTitleIndex(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Return the title index of the key.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
ULONG - The title index.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( _TitleIndex );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
REGISTRY_KEY_INFO::IsKeyInitialized(
|
|||
|
) CONST
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Inform the caller if the object is completely initialized.
|
|||
|
This object will be completly initialized only if the registry
|
|||
|
class was able to query the key to retrieve its calss and last
|
|||
|
write time.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
BOOLEAN - Returns TRUE if the key is initialized, or FALSE otherwise.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return( _KeyIsCompletelyInitialized );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
REGISTRY_KEY_INFO::PutClass(
|
|||
|
IN PCWSTRING Class
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable _Class.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Class - Pointer to a WSTRING object that contains the key class.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DebugPtrAssert( Class );
|
|||
|
return( _Class.Initialize( Class ) );
|
|||
|
}
|
|||
|
|
|||
|
#if !defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::PutLastWriteTime(
|
|||
|
IN PCTIMEINFO LastWriteTime
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable _LastWriteTime.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LastWriteTime - Pointer to a TIMEINFO object that contains the
|
|||
|
LastWriteTime of the key.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DebugPtrAssert( LastWriteTime );
|
|||
|
_LastWriteTime.Initialize( LastWriteTime );
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#if defined( _AUTOCHECK_ )
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::SetLastWriteTime(
|
|||
|
IN TIME LastWriteTime
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable _LastWriteTime.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LastWriteTime - Pointer to a TIMEINFO object that contains the
|
|||
|
LastWriteTime of the key.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
_LastWriteTime = LastWriteTime;
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
REGISTRY_KEY_INFO::PutName(
|
|||
|
IN PCWSTRING Name
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the key name.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Name - Pointer to a WSTRING object that contains the key name.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DebugPtrAssert( Name );
|
|||
|
return( _Name.Initialize( Name ) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
BOOLEAN
|
|||
|
REGISTRY_KEY_INFO::PutParentName(
|
|||
|
IN PCWSTRING ParentName
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the parent name.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Name - Pointer to a WSTRING object that contains the parent name.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
DebugPtrAssert( ParentName );
|
|||
|
return( _ParentName.Initialize( ParentName ) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::SetKeyInitializedFlag(
|
|||
|
IN BOOLEAN Initialized
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initializes the flag that indicates whether the key is completely
|
|||
|
initialized. That is, the registry class was able to query the value,
|
|||
|
and its last write time is initialized.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Initialized - A flag that indicates whether the key is completely
|
|||
|
initialized.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
_KeyIsCompletelyInitialized = Initialized;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::SetNumberOfSubKeys(
|
|||
|
IN ULONG NumberOfSubKeys
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable NumberOfSubKeys.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
NumberOfSubkeys - The number of subkeys.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
_NumberOfSubKeys = NumberOfSubKeys;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::SetNumberOfValues(
|
|||
|
IN ULONG NumberOfValues
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable _NumberOfValues.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
NumberOfValues - The number of value entries in the key.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
_NumberOfValues = NumberOfValues;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
REGISTRY_KEY_INFO::SetTitleIndex(
|
|||
|
IN ULONG TitleIndex
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the variable _TitleIndex.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
TitleIndex - Title index of the key.
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
_TitleIndex = TitleIndex;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif // _REGISTRY_KEY_INFO_
|