Compartilhar via


Função RtlInsertElementGenericTableAvl (ntddk.h)

A rotina RtlInsertElementGenericTableAvl adiciona uma nova entrada a uma tabela genérica.

Sintaxe

NTSYSAPI PVOID RtlInsertElementGenericTableAvl(
  [in]            PRTL_AVL_TABLE Table,
  [in]            PVOID          Buffer,
  [in]            CLONG          BufferSize,
  [out, optional] PBOOLEAN       NewElement
);

Parâmetros

[in] Table

Ponteiro para uma tabela genérica Desiniciar/Landis (AVL) (RTL_AVL_TABLE) que foi inicializada por uma chamada para RtlInitializeGenericTableAvl.

[in] Buffer

Um buffer alocado pelo chamador que contém os dados do usuário a serem copiados para o novo elemento. Para obter mais informações, consulte RtlInitializeGenericTableAvl.

[in] BufferSize

Tamanho em bytes de dados no Buffer.

[out, optional] NewElement

Na saída, um valor true significa que a inserção do novo elemento na tabela genérica foi bem-sucedida. Um valor false significa que a inserção falhou.

Retornar valor

RtlInsertElementGenericTableAvl retorna um ponteiro para os dados do usuário para a entrada recém-inserida ou os dados do usuário para uma entrada correspondente que já está na tabela genérica. Se nenhuma entrada correspondente for encontrada, mas RtlInsertElementGenericTableAvl não puder inserir a nova entrada (por exemplo, porque a AllocateRoutine falha), RtlInsertElementGenericTableAvl retornará NULL.

Comentários

Para inserir uma entrada, RtlInsertElementGenericTableAvl chama CompareRoutine e AllocateRoutine que foram registrados quando a tabela genérica foi inicializada por RtlInitializeGenericTableAvl. Depois de inserir a nova entrada, RtlInsertElementGenericTableAvl reequilibra a árvore de link AVL.

Quando uma nova entrada é inserida na tabela, seus dados são copiados do Buffer para a nova entrada. Portanto, o ponteiro retornado por RtlInsertElementGenericTableAvl nunca é igual a Buffer.

Se a CompareRoutine do chamador retornar GenericEqual, os dados no Buffer serão considerados duplicados para uma entrada existente na tabela genérica. Nesse caso, RtlInsertElementGenericTableAvl não adiciona a nova entrada (e, portanto, não chama a AllocateRoutine), porque uma tabela genérica não pode ter entradas duplicadas.

Se já existir uma entrada correspondente na tabela genérica, RtlInsertElementGenericTableAvl retornará um ponteiro para os dados da entrada existente e definirá NewElement como FALSE.

Se ainda não houver nenhuma entrada correspondente na tabela, a rotina RtlInsertElementGenericTableAvl alocará espaço suficiente para os dados do usuário da nova entrada (BufferSize) mais os links associados à nova entrada. Portanto, o número total de bytes será pelo menos BufferSize + sizeof(RTL_BALANCED_LINKS). O chamador não deve usar os primeiros bytes sizeof(RTL_BALANCED_LINKS) da memória alocada pela AllocateRoutine.

Chamadores do Rtl. As rotinas GenericTableAvl são responsáveis por sincronizar exclusivamente o acesso à tabela genérica. Um mutex rápido exclusivo é o mecanismo de sincronização mais eficiente a ser usado para essa finalidade.

Por padrão, o sistema operacional usa árvores de reprodução para implementar tabelas genéricas, mas a rotina RtlInsertElementGenericTableAvl só funciona com árvores Desvelsky/Landis (AVL). Para configurar as rotinas de tabela genéricas para usar árvores AVL em vez de árvores de reprodução no driver, insira a seguinte instrução define em um arquivo de cabeçalho comum antes de incluir Ntddk.h:

#define RTL_USE_AVL_TABLES 0

Se RTL_USE_AVL_TABLES não estiver definido, você deverá usar a forma AVL das rotinas de tabela genéricas. Por exemplo, use a rotina RtlInsertElementGenericTableAvl em vez de RtlInsertElementGenericTable. Na chamada para RtlInsertElementGenericTableAvl, o chamador deve passar uma estrutura de tabela RTL_AVL_TABLE em vez de RTL_GENERIC_TABLE.

Os chamadores de RtlInsertElementGenericTableAvl devem estar em execução no IRQL < DISPATCH_LEVEL se uma das seguintes condições for mantida:

  • A memória alocada pelo chamador em Table ou em Buffer é paginável.
  • A CompareRoutine ou AllocateRoutine fornecida pelo chamador contém código paginável.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows XP.
Plataforma de Destino Universal
Cabeçalho ntddk.h (inclua Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL (consulte a seção Comentários)

Confira também

RtlDeleteElementGenericTableAvl

RtlInitializeGenericTableAvl