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);
}