J'ai la fonction NtCreateFile() ntdll.dll accroché pour permettre/refuser l'accès de certains fichiers. Contrairement à CreateFile() de kernel32.dll qui vous donne facilement le chemin d'accès complet au fichier en question, la fonction NtCreateFile() de ntdll.dll ne vous donne que le handle du fichier. J'ai besoin d'obtenir le chemin complet du fichier depuis un descripteur de fichier, pour autoriser/refuser l'accès. J'ai cherché autour et il ne semble pas y avoir une solution de C# fonctionnante.Obtenir un nom de fichier à partir d'un descripteur de fichier?
This La solution est en C++ et documentée par Microsoft. J'ai essayé de le porter sur C# avec peu de succès. Voici ma tentative de C# équivalent de la version C de de « l'obtention d'un nom de fichier à partir d'un descripteur de fichier »:
public string GetFileNameFromHandle(IntPtr FileHandle)
{
string fileName = String.Empty;
IntPtr fileMap = IntPtr.Zero, fileSizeHi = IntPtr.Zero;
UInt32 fileSizeLo = 0;
fileSizeLo = GetFileSize(FileHandle, fileSizeHi);
if (fileSizeLo == 0 && fileSizeHi == IntPtr.Zero)
{
// cannot map an 0 byte file
return String.Empty;
}
fileMap = CreateFileMapping(FileHandle, IntPtr.Zero, FileMapProtection.PageReadonly, 0, 1, null);
if (fileMap != IntPtr.Zero)
{
IntPtr pMem = MapViewOfFile(fileMap, FileMapAccess.FileMapRead, 0, 0, 1);
if (pMem != IntPtr.Zero)
{
StringBuilder fn = new StringBuilder(250);
GetMappedFileName(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle, pMem, fn, 250);
if (fileName.Length > 0)
{
UnmapViewOfFile(pMem);
CloseHandle(FileHandle);
return fn.ToString();
}
else
{
UnmapViewOfFile(pMem);
CloseHandle(FileHandle);
return String.Empty;
}
}
}
return String.Empty;
}
je, bien sûr, tous les DLLImports nécessaires et types définis par l'utilisateur. Lorsque j'utilise cette fonction sur des poignées, j'obtiens une chaîne vide en retour. Il est également assez difficile de déboguer ceci, puisque cette méthode est dans une DLL qui est injectée dans un processus cible, pas comme quelque chose que vous pouvez définir un point d'arrêt et profiter du système de débogage de Visual Studio. Je suppose que je pourrais écrire un fichier journal ou un système de trace, mais je ne suis pas encore désespéré. J'ai juste besoin d'une version C# réussie de "get filename from handle de fichier".
Des informations, des corrections de code, des liens?
Je vais poser la question évidente: pourquoi dans le monde que tu fais ça? * Hooking * un appel de fonction API natif avec une charge utile gérée est assez mauvais (j'espère que vous avez sous licence Détours, car aucune autre approche n'est prise en charge), mais dans le but d'appliquer une couche de sécurité? Pourquoi ne pas utiliser la sécurité intégrée dans le système de fichiers? –
On dirait que vous avez besoin de regarder l'écriture pilote minifiltre qui vous permettra de prendre des décisions d'accès dans un contexte beaucoup plus approprié. Voir: http://msdn.microsoft.com/en-us/library/ff540402(v=VS.85).aspx S'il vous plaît, pas d'accrochage ... Essayez d'ouvrir un fichier sur un partage réseau ou l'exécuter sur Vista/7 x64. Le minifiltre fonctionnera, votre solution explosera. –