Je suis en train d'examiner le code source (écrit en C) de bkhive -- un utilitaire pour extraire la clé de démarrage SysKey d'un répertoire de stockage de Windows NT/2K/XP -- et j'aimerais savoir s'il y a une justification pour quelque chose que l'auteur original a fait : passer un pointeur à une clé de stockage de Windows NT/2K/XP. struct
dans une fonction et de renvoyer le même pointeur. Voici le code source correspondant :
En main()
il y a un appel qui ressemble à ceci :
struct hive h;
char *root_key;
// Do some stuff to init
_RegGetRootKey(&h, &root_key)
Quels appels :
int _RegGetRootKey(struct hive *h, char **root_key)
{
nk_hdr *n;
n = (nk_hdr*) malloc(sizeof(nk_hdr));
/* ************************************************
* RELEVANT FUNCTION CALL
* Why pass n as a parameter and use return value?
* ************************************************/
n = read_nk(n, h, 0x1020);
if (n->id == NK_ID && n->type == NK_ROOT)
{
*root_key = (char *) malloc(n->name_len + 1);
strncpy(*root_key, n->key_name, n->name_len);
(*root_key)[n->name_len] = 0;
free(n);
return 0;
}
free(n);
return -1;
}
Quels appels :
nk_hdr* read_nk(nk_hdr *nk, struct hive *h, int offset)
{
memcpy(nk, h->base + offset + 4, sizeof(nk_hdr));
nk->key_name = (h->base + offset + 4 + 76);
return nk;
}
Quel est donc l'objectif de l'adoption de la struct
et le renvoie ensuite ? La fonction ne pourrait-elle pas ne rien renvoyer et utiliser la fonction n
après l'appel de la fonction ?