2015-03-22 1 views
-1

La ligne OpenFileByID en test() me donne System.AccessViolationException Attempted to read or write protected memory. This is often an indication that other memory is corrupt.Win API NTFS OpenFileByID lancer AccessViolationException

Je suis en train de répliquer this code example (voir la réponse), que je suis en cours d'exécution dans Visual Studio Express 2013 pour Windows Desktop. Mais cet exemple ne semble pas fonctionner pour moi. Il se casse sur la ligne OpenFileByID dans test(). En un mot, j'obtiens l'ID d'un fichier, puis je tente de créer un identificateur de fichier à partir de cet ID. Plus tard, je prévois d'utiliser cette poignée pour obtenir des informations sur le fichier. La raison pour laquelle j'utilise les ID est que je peux réparer les liens rompus, car le GUID d'un fichier cible est beaucoup plus fiable que son emplacement présumé. Aide appréciée! Edit: Le fichier que j'essaie d'ouvrir est un fichier texte ordinaire sur mon bureau, rien de spécial.

+0

Vous semblez avoir négligé de publier du code. –

+0

Le code est dans le lien. J'ai essayé de l'afficher ici mais il se plaignait que le corps était trop grand. – Wes

+1

Obtenez un cas simple qui fonctionne en C++ d'abord, seulement après cela est correct, vous vous souciez d'écrire des déclarations C# pinvoke, obtenez le même cas simple en C# et enfin vous êtes prêt à intégrer un programme plus grand. –

Répondre

0

Vous ne vérifiez pas si vous avez une poignée de volume valide, ce que vous ne pouvez pas être. Pourrait être la source de votre A/V. Lorsque vous ouvrez le répertoire racine, le document indique que vous ne devez pas utiliser FILE_ATTRIBUTE_NORMAL avec d'autres indicateurs, mais que vous l'utilisez avec FILE_FLAG_BACKUP_SEMANTICS. Pour utiliser FILE_FLAG_BACKUP_SEMANTICS, vous devez obtenir des privilèges pour SE_BACKUP_NAME. Vous devrez être un administrateur ou un opérateur de sauvegarde pour le faire. Je ne peux pas imaginer que vous ayez besoin de ce drapeau.

Vous pouvez obtenir le handle de volume en ouvrant "\\. \ C:" (par exemple) ... qui est différent de ce handle dans le dossier racine. Je l'ouvre habituellement avec GenericRead, mais si tout ce dont vous avez besoin est pour OpenFileById, vous pouvez spécifier 0 pour l'accès. Il n'est pas non plus nécessaire d'ajouter des ID d'objet aux fichiers. Le numéro de référence du fichier (FRN) est l'identificateur principal du fichier. Il s'agit de l'ID "autre" que vous pouvez passer dans FILE_ID_DESCRIPTOR. Vous pouvez l'obtenir à partir d'un descripteur de fichier ouvert en appelant GetFileInformationByHandle - ce sont les nFileindexHigh et nFileIndexLow transformés en un long int. Lorsque vous déplacez un fichier, le FRN reste (seul son FRN parent est modifié). En outre, lorsque vous renommez un fichier, le FRN ne change pas. L'avantage d'utiliser ceci sur ObjectID est que vous ne modifiez pas le volume pour suivre un fichier ... et vous n'avez pas besoin d'utiliser DeviceIOControl - ce qui est un peu un mauvais rêve d'interopérabilité. Encore une réflexion - OpenFileByID ne s'est pas présenté jusqu'à Vista et Windows Server 2008. Vous êtes là, n'est-ce pas?