Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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. |
|
Doorloop de subsleutels van de sleutel en bekijk de eigenschappen van elke sleutel. |
|
Bekijk de eigenschappen van een sleutelwaarde, inclusief de gegevens van de waarde. |
|
Doorloop de waarden van een sleutel en bekijk de eigenschappen van elke sleutel. |
|
Stel de gegevens in voor een waarde die is gekoppeld aan een sleutel. |
|
Een sleutel verwijderen. |
|
Een sleutelwaarde verwijderen. |
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.