Registre

Accéder à la base de registre n'est pas si facile, il faut le faire via une structure.

Voici un exemple

 

#define MONDRIVERNT_NAME "MONDRIVERNT"
#define LMONDRIVERNT_NAME L"MONDRIVERNT"
// clef indiquant le nombre de cartes
#define MONDRIVERNT_KEY_NBCARDS "NbCards"
#define LMONDRIVERNT_KEY_NBCARDS L"NbCards"
// Clefs du sous-répertoire Cardn avec n=0/1 numéro de la carte
// entier décimal
#define MONDRIVERNT_KEY_ID "IdCard"
#define MONDRIVERNT_KEY_MEMORY "Memory"
#define LMONDRIVERNT_KEY_MEMORY L"Memory"
#define MONDRIVERNT_KEY_PORT "Port"
#define LMONDRIVERNT_KEY_PORT L"Port"
// enumeration IRQType
#define MONDRIVERNT_KEY_IRQ12 "Irq12"
#define LMONDRIVERNT_KEY_IRQ12 L"Irq12"
#define MONDRIVERNT_KEY_IRQ34 "Irq34"
#define LMONDRIVERNT_KEY_IRQ34 L"Irq34"

 

bool GetConfigFromRegister()
{

// paramètres pour manipulation du registre
unsigned defaultNbCards=0;
unsigned defaultMemory=0xC0000;
unsigned defaultPort=0x300;
unsigned defaultIrq12=IRQ3;
unsigned defaultIrq34=IRQ4;
PRTL_QUERY_REGISTRY_TABLE parameters = NULL; 
NTSTATUS status = STATUS_SUCCESS; 
PWSTR path = NULL; 
USHORT queriesPlusOne = 5*2+1+1; // 5 par carte + nbcartes + marque de fin 
PWSTR Subkey;
int numCard;
// NTSTATUS ntStatus;
// récupération de la configuration carte depuis la base de registres

parameters = (PRTL_QUERY_REGISTRY_TABLE)ExAllocatePool( 
PagedPool, 
sizeof(RTL_QUERY_REGISTRY_TABLE) * queriesPlusOne 
); 

if (!parameters) 


return false; 
DbgPrint("memoire insuffisante");
status = STATUS_UNSUCCESSFUL; 


else 


RtlZeroMemory( 
parameters, 
sizeof(RTL_QUERY_REGISTRY_TABLE) * queriesPlusOne 
); 




if (NT_SUCCESS(status)) 

// 
// Lecture du nombre de cartes 
// et des paramètres de chaque carte 
// 
for(numCard=0;numCard<=1;numCard++)
{
parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT; 
parameters[0].Name = LMONDRIVER_KEY_NBCARDS; 
parameters[0].EntryContext = &RegistryConfig.NbCards;
parameters[0].DefaultType = REG_DWORD; 
parameters[0].DefaultData = &defaultNbCards; 
parameters[0].DefaultLength = sizeof(ULONG); 

// carte 0
parameters[1].Flags = RTL_QUERY_REGISTRY_SUBKEY; 
if(numCard==0)
Subkey = L"Card0";
else
Subkey = L"Card1";
parameters[1].Name = Subkey; 

parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT; 
parameters[2].Name = LMONDRIVER_KEY_MEMORY; 
parameters[2].EntryContext = &RegistryConfig.Cards[numCard].Memory; 
parameters[2].DefaultType = REG_DWORD; 
parameters[2].DefaultData = &defaultMemory; 
parameters[2].DefaultLength = sizeof(DWORD); 

parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT; 
parameters[3].Name = LMONDRIVER_KEY_PORT; 
parameters[3].EntryContext = &RegistryConfig.Cards[numCard].Port; 
parameters[3].DefaultType = REG_DWORD; 
parameters[3].DefaultData = &defaultPort; 
parameters[3].DefaultLength = sizeof(DWORD); 

parameters[4].Flags = RTL_QUERY_REGISTRY_DIRECT; 
parameters[4].Name = LMONDRIVER_KEY_IRQ12; 
parameters[4].EntryContext = &RegistryConfig.Cards[numCard].Irq12; 
parameters[4].DefaultType = REG_DWORD; 
parameters[4].DefaultData = &defaultIrq12; 
parameters[4].DefaultLength = sizeof(DWORD); 

parameters[5].Flags = RTL_QUERY_REGISTRY_DIRECT; 
parameters[5].Name = LMONDRIVER_KEY_IRQ34; 
parameters[5].EntryContext = &RegistryConfig.Cards[numCard].Irq34; 
parameters[5].DefaultType = REG_DWORD; 
parameters[5].DefaultData = &defaultIrq34; 
parameters[5].DefaultLength = sizeof(DWORD); 

status = RtlQueryRegistryValues( 
RTL_REGISTRY_CONTROL, 
LMONDRIVER_NAME, 
parameters, 
NULL, 
NULL 
); 
if (!NT_SUCCESS(status)) 

DbgPrint("Echec à la lecture du registre\n"); 
switch(status)
{
case STATUS_INVALID_PARAMETER :
DbgPrint("parametre invalide\n");
break;
case STATUS_OBJECT_NAME_NOT_FOUND:
DbgPrint("nom d'objet non trouve\n");
break;
}
break; // sortie sur erreur sur carte en cours

else 
{
DbgPrint("registry : card %d/%d memory=%x,port=%x,irq12=%d,irq34=%d\n",
numCard,RegistryConfig.NbCards,
RegistryConfig.Cards[numCard].Memory,
RegistryConfig.Cards[numCard].Port,
RegistryConfig.Cards[numCard].Irq12,
RegistryConfig.Cards[numCard].Irq34);
if(RegistryConfig.NbCards<=1)
break; // pas de seconde carte
}



if (parameters) 
ExFreePool(parameters); 

return NT_SUCCESS(status);

}

Accueil ] Remonter ]