Delen via


Een handvat gebruiken voor een Registry-Key-object

De volgende tabel bevat de bewerkingen die stuurprogramma's kunnen uitvoeren op een open sleutel, evenals de juiste routines die moeten worden aangeroepen.

Operatie Routine om te bellen

Bekijk de eigenschappen van de sleutel, zoals de naam of het aantal subsleutels.

ZwQueryKey

Doorloop de subsleutels van de sleutel en bekijk de eigenschappen van elke sleutel.

ZwEnumerateKey

Bekijk de eigenschappen van een sleutelwaarde, inclusief de gegevens van de waarde.

ZwQueryValueKey

Doorloop de waarden van een sleutel en bekijk de eigenschappen van elke sleutel.

ZwEnumerateValueKey

Stel de gegevens in voor een waarde die is gekoppeld aan een sleutel.

ZwSetValueKey

Een sleutel verwijderen.

ZwDeleteKey

Een sleutelwaarde verwijderen.

ZwDeleteValueKey

Zodra het stuurprogramma de bewerkingen heeft voltooid, moet het ZwClose- aanroepen om de ingang te sluiten, zelfs als het al ZwDeleteKey- heeft aangeroepen om de sleutel te verwijderen. (Zodra een sleutel is verwijderd, worden alle geopende ingangen ongeldig, maar moet het stuurprogramma de ingang nog steeds sluiten.)

In het volgende codevoorbeeld ziet u hoe u een ingang opent voor een sleutel met de naam \Registry\Machine\Software\MyCompany\MyApp, vervolgens sleutelgegevens ophaalt en de ingang sluit.

//
// Get the frame location from the registry key
// HKLM\SOFTWARE\MyCompany\MyApp.
// For example: "FrameLocation"="X:\\MyApp\\Frames"
// 
HANDLE              handleRegKey = NULL;
for (int n = 0; n < 1; n++) 
{
    NTSTATUS           status = NULL;
    UNICODE_STRING     RegistryKeyName;
    OBJECT_ATTRIBUTES  ObjectAttributes;

    RtlInitUnicodeString(&RegistryKeyName, L"\\Registry\\Machine\\Software\\MyCompany\\MyApp");
    InitializeObjectAttributes(&ObjectAttributes, 
                               &RegistryKeyName,
                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                               NULL,    // handle
                               NULL);
    status = ZwOpenKey(&handleRegKey, KEY_READ, &ObjectAttributes);

    // If the driver cannot open the key, the driver cannot continue. 
    // In this situation, the driver was probably set up incorrectly 
    // and worst case, the driver cannot stream.
    if( NT_SUCCESS(status) == FALSE ) 
    {
        break;
    }
    // The driver obtained the registry key.
    PKEY_VALUE_FULL_INFORMATION  pKeyInfo = NULL;
    UNICODE_STRING               ValueName;
    ULONG                        ulKeyInfoSize = 0;
    ULONG                        ulKeyInfoSizeNeeded = 0;

    // The driver requires the following value.
    RtlInitUnicodeString(&ValueName, L"FrameLocation");

    // Determine the required size of keyInfo.
    status = ZwQueryValueKey( handleRegKey,
                              &ValueName,
                              KeyValueFullInformation,
                              pKeyInfo,
                              ulKeyInfoSize,
                              &ulKeyInfoSizeNeeded );

    // The driver expects one of the following errors.
    if( (status == STATUS_BUFFER_TOO_SMALL) || (status == STATUS_BUFFER_OVERFLOW) )
    {
        // Allocate the memory required for the key.
        ulKeyInfoSize = ulKeyInfoSizeNeeded;
        pKeyInfo = (PKEY_VALUE_FULL_INFORMATION) ExAllocatePoolWithTag( NonPagedPool, ulKeyInfoSizeNeeded, g_ulTag);
        if( NULL == pKeyInfo )
        {
            break;
        }
        RtlZeroMemory( pKeyInfo, ulKeyInfoSize );

        // Get the key data.
        status = ZwQueryValueKey( handleRegKey,
                                  &ValueName,
                                  KeyValueFullInformation,
                                  pKeyInfo,
                                  ulKeyInfoSize,
                                  &ulKeyInfoSizeNeeded );
        if( (status != STATUS_SUCCESS) || (ulKeyInfoSizeNeeded != ulKeyInfoSize) || (NULL == pKeyInfo) )
        {
            break;
        }

        // Fill in the frame location if it has not been filled in already.
        if ( NULL == m_szwFramePath )
        {
            m_ulFramePathLength = pKeyInfo->DataLength;
            ULONG_PTR   pSrc = NULL;

            pSrc = (ULONG_PTR) ( (PBYTE) pKeyInfo + pKeyInfo->DataOffset);

            m_szwFramePath = (LPWSTR) ExAllocatePoolWithTag( NonPagedPool, m_ulFramePathLength, g_ulTag);
            if ( NULL == m_szwFramePath )
            {
                m_ulFramePathLength = 0;
                break;
            }

            // Copy the frame path.
            RtlCopyMemory(m_szwFramePath, (PVOID) pSrc, m_ulFramePathLength);
        }
        // The driver is done with the pKeyInfo.
        xFreePoolWithTag(pKeyInfo, g_ulTag);

    } // if( (status == STATUS_BUFFER_TOO_SMALL) || (status == STATUS_BUFFER_OVERFLOW) )
} // Get the Frame location from the registry key.

// All done with the registry.
if (NULL != handleRegKey)
{
    ZwClose(handleRegKey);
}

Het systeem slaat belangrijke wijzigingen in het geheugen op en schrijft ze om de paar seconden naar de schijf. Als u een sleutelwijziging naar schijf wilt afdwingen, roept u ZwFlushKeyaan.

Als u het register wilt bewerken via een eenvoudigere interface, kunnen stuurprogramma's ook de RtlXxxRegistryXxx routines aanroepen. Zie Registry Run-Time Library Routinesvoor meer informatie.