Partager via


AuxKlibQueryModuleInformation, fonction (aux_klib.h)

La routine AuxKlibQueryModuleInformation récupère des informations sur les modules image que le système d’exploitation a chargés.

Syntaxe

NTSTATUS AuxKlibQueryModuleInformation(
  [in, out]       PULONG BufferSize,
  [in]            ULONG  ElementSize,
  [out, optional] PVOID  QueryInfo
);

Paramètres

[in, out] BufferSize

Pointeur vers un emplacement qui contient ou reçoit une taille de mémoire tampon, en octets. Si queryInfo est NULL, l’emplacement reçoit le nombre d’octets que le pilote doit allouer pour le tableau qui reçoit les informations récupérées. Si queryInfo n’est pas NULL, l’emplacement doit contenir le nombre spécifié d’octets.

[in] ElementSize

Taille, en octets, de chaque élément du tableau vers lequel QueryInfo pointe. Cette valeur doit être taille de(AUX_MODULE_BASIC_INFO) ou taille de(AUX_MODULE_EXTENDED_INFO).

[out, optional] QueryInfo

Pointeur vers un tableau de structures AUX_MODULE_BASIC_INFO ou AUX_MODULE_EXTENDED_INFO qui reçoivent des informations sur les modules d’image chargés. Si ce pointeur est NULL, AuxKlibQueryModuleInformation écrit la taille de mémoire tampon requise à l’emplacement vers lequel BufferSize pointe.

Valeur de retour

AuxKlibQueryModuleInformation retourne STATUS_SUCCESS si l’opération réussit. AuxKlibQueryModuleInformation retourne STATUS_BUFFER_TOO_SMALL si le pointeur QueryInfo n’est pas NULL et que la valeur de BufferSize fournie par le pilote est trop petite.

La routine peut retourner d’autres valeurs NTSTATUS .

Remarques

Pour obtenir des informations sur les modules d’image chargés du système d’exploitation, un pilote doit :

  1. Appelez AuxKlibQueryModuleInformation avec un pointeur NULLQueryInfo. Une fois AuxKlibQueryModuleInformation retourné, l’emplacement auquel le paramètre BufferSize pointe contiendra le nombre d’octets que le pilote devra allouer pour le tableau.
  2. Appelez une routine d’allocation de mémoire, telle que ExAllocatePoolWithTag, pour allouer une mémoire tampon pour le tableau.
  3. Appelez à nouveau AuxKlibQueryModuleInformation. Cette fois, le pointeur QueryInfo doit contenir l’adresse de la mémoire tampon allouée. Après AuxKlibQueryModuleInformation retourne, la mémoire tampon contient un tableau d’informations de module.
Le nombre de modules chargés peut changer entre les premiers et deuxième appels vers AuxKlibQueryModuleInformation. Par conséquent, le deuxième appel à AuxKlibQueryModuleInformation peut retourner STATUS_BUFFER_TOO_SMALL même si le pilote alloue une mémoire tampon basée sur la taille obtenue à partir du premier appel.

Si un appel à AuxKlibQueryModuleInformation réussit, la routine écrit une valeur ImageBase dans chaque élément du tableau QueryInfo . Chaque valeur ImageBase est un pointeur vers la base d’une image de pilote chargée. Ce pointeur reste valide uniquement lorsque le pilote reste chargé. L’appelant doit supposer que le pilote peut être déchargé à tout moment, sauf si l’appelant peut garantir autrement. Par exemple, un pilote peut être déchargé entre un appel à AuxKlibQueryModuleInformation qui obtient un pointeur vers l’image du pilote et un appel à AuxKlibGetImageExportDirectory qui utilise ce pointeur.

Les pilotes doivent appeler AuxKlibInitialize avant d’appeler AuxKlibQueryModuleInformation.

Exemples

L’exemple de code suivant illustre les étapes répertoriées dans la section Notes précédentes.

NTSTATUS  status;
ULONG  modulesSize;
AUX_MODULE_EXTENDED_INFO*  modules;
ULONG  numberOfModules;
//
// Get the required array size.
//
status = AuxKlibQueryModuleInformation(
                                       &modulesSize,
                                       sizeof(AUX_MODULE_EXTENDED_INFO),
                                       NULL
                                       );

if (!NT_SUCCESS(status) || modulesSize == 0) {
    break;
    }

//
// Calculate the number of modules.
//
numberOfModules = modulesSize / sizeof(AUX_MODULE_EXTENDED_INFO);

//
// Allocate memory to receive data.
//
modules = 
    (AUX_MODULE_EXTENDED_INFO*) ExAllocatePoolWithTag(
                                      PagedPool,
                                      modulesSize,
                                      '3LxF'
                                      );
if (modules == NULL) {
    status = STATUS_INSUFFICIENT_RESOURCES;
    break;
    }

RtlZeroMemory(
              modules,
              modulesSize
              );

//
// Obtain the module information.
//
status = AuxKlibQueryModuleInformation(
                                       &modulesSize,
                                       sizeof(AUX_MODULE_EXTENDED_INFO),
                                       modules
                                       );
if (!NT_SUCCESS(status)) {
    break;
    }

Exigences

Exigence Valeur
client minimum pris en charge Prise en charge à partir de Windows 2000.
plateforme cible Universel
d’en-tête aux_klib.h (include Aux_klib.h)
bibliothèque Aux_Klib.lib
IRQL PASSIVE_LEVEL

Voir aussi

AUX_MODULE_BASIC_INFO

AUX_MODULE_EXTENDED_INFO

AuxKlibGetImageExportDirectory

AuxKlibInitialize

ExAllocatePoolWithTag