ReadDirectoryChangesW()

Le
Vincent
Bonjour,

J'ai un soucis concernant ReadDirectoryChangesW(). Il doit s'agir d'une
erreur bête de ma part car je ne vois pas grand chose sur le sujet lors
de mes recherches sur le net. Mon soucis est sur l'utilisation du champ
NextEntryOffset de la structure FILE_NOTIFY_INFORMATION.

Le cas que je teste est le renommage d'un fichier. Je fait mon appel
ReadDirectoryChangesW() qui remplis le buffer (alloué plus de 16K).

J'arrive à lire la première entrée (FILE_ACTION_RENAMED_OLD_NAME), mais
dès que j'essaie de pointer sur la seconde entrée, j'ai des valeurs
délirante de positionnées dans les champs de FILE_NOTIFY_INFORMATION.
J'ai un doute sur la ligne de la fonction suivante :
ChangeInfo += ChangeInfo->NextEntryOffset;

Merci de m'orienter sur mon erreur, car à force de boucler sur le pb, je
ne vois plus rien.

void DispatchChanges (LPVOID Buffer)
{
FILE_NOTIFY_INFORMATION *ChangeInfo = NULL;
char filename[MAX_PATH];

ChangeInfo = Buffer;
if (ChangeInfo == NULL)
return;

while (TRUE)
{
memset(filename, '', MAX_PATH);
memcpy(filename, ChangeInfo->FileName, ChangeInfo->FileNameLength);

switch (ChangeInfo->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"File added : %s", filename);
break;
case FILE_ACTION_REMOVED:
wprintf(L"File removed : %s", filename);
break;
case FILE_ACTION_MODIFIED:
wprintf(L"File modified : %s", filename);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"File renamed (old name) : %s", filename);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"File renamed (new name): %s", filename);
break;
default:
wprintf(L"Default%s", filename);
break;
}

/* Is there any further entry ? */
if (ChangeInfo->NextEntryOffset == 0)
break;
else
ChangeInfo += ChangeInfo->NextEntryOffset;
}
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
robert
Le #19757471
Vincent a écrit :

Bonjour,

J'ai un soucis concernant ReadDirectoryChangesW(). Il doit s'agir d'une
erreur bête de ma part car je ne vois pas grand chose sur le sujet lors
de mes recherches sur le net. Mon soucis est sur l'utilisation du champ
NextEntryOffset de la structure FILE_NOTIFY_INFORMATION.

Le cas que je teste est le renommage d'un fichier. Je fait mon appel
ReadDirectoryChangesW() qui remplis le buffer (alloué plus de 16K).

J'arrive à lire la première entrée (FILE_ACTION_RENAMED_OLD_NAME), mais
dès que j'essaie de pointer sur la seconde entrée, j'ai des valeurs
délirante de positionnées dans les champs de FILE_NOTIFY_INFORMATION.
J'ai un doute sur la ligne de la fonction suivante :
ChangeInfo += ChangeInfo->NextEntryOffset;

Merci de m'orienter sur mon erreur, car à force de boucler sur le pb, je
ne vois plus rien.

void DispatchChanges (LPVOID Buffer)
{
FILE_NOTIFY_INFORMATION *ChangeInfo = NULL;
char filename[MAX_PATH];

ChangeInfo = Buffer;
if (ChangeInfo == NULL)
return;

while (TRUE)
{
memset(filename, '', MAX_PATH);
memcpy(filename, ChangeInfo->FileName, ChangeInfo->FileNameLength);

switch (ChangeInfo->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"File added : %sn", filename);
break;
case FILE_ACTION_REMOVED:
wprintf(L"File removed : %sn", filename);
break;
case FILE_ACTION_MODIFIED:
wprintf(L"File modified : %sn", filename);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"File renamed (old name) : %sn", filename);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"File renamed (new name): %sn", filename);
break;
default:
wprintf(L"Default...%sn", filename);
break;
}

/* Is there any further entry ? */
if (ChangeInfo->NextEntryOffset == 0)
break;
else
ChangeInfo += ChangeInfo->NextEntryOffset;
}
}


ChangeInfo += (FILE_NOTIFY_INFORMATION)((char*)ChangeInfo +
ChangeInfo->NextEntryOffset);

car l'ajout de pointeur multiplie automatiquement par
sizeof(FILE_NOTIFY_INFORMATION)
Vincent
Le #19762991
On 15/07/2009 08:21, robert wrote:

ChangeInfo += (FILE_NOTIFY_INFORMATION)((char*)ChangeInfo +
ChangeInfo->NextEntryOffset);

car l'ajout de pointeur multiplie automatiquement par
sizeof(FILE_NOTIFY_INFORMATION)



Mais c'est bien sûr, quelle truffe!!
D'ailleurs ça serait plutot :

ChangeInfo = (FILE_NOTIFY_INFORMATION*)((char*)ChangeInfo
+ChangeInfo->NextEntryOffset);

Merci de l'aide.

Vincent
Publicité
Poster une réponse
Anonyme