У меня есть функция NtCreateFile() ntdll.dll, подключенная для разрешения/запрета доступа к определенным файлам. В отличие от файла CreateFile(), который легко дает вам полный путь к файлу, функция ntdll.dll NtCreateFile() предоставляет только дескриптор файла. Мне нужно получить полный путь к файлу из дескриптора файла, чтобы, следовательно, разрешить/запретить доступ. Я искал вокруг, и, похоже, не работает рабочее решение C#.Получить имя файла из дескриптора файла?
This решение находится на C++ и задокументировано Microsoft. Я попытался передать его на C# с небольшим успехом. Вот моя попытка на C# эквивалент версии C++ в «получении файла из дескриптора файла»:
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;
}
У меня есть, конечно, все необходимые DLLImports и определяемые пользователем типы. Когда я использую эту функцию на дескрипторах, я получаю пустую строку взамен. Также довольно сложно отладить это, так как этот метод находится в DLL, которая вводится в целевой процесс, а не как что-то, что вы можете установить точку останова и наслаждаться системой отладки Visual Studio. Думаю, я мог бы написать файл журнала или какую-то систему трассировки, но я еще не отчаялся. Мне просто нужна успешная версия C# «получить имя файла из дескриптора файла».
Любое понимание, исправления кода, ссылки?
я задать очевидный вопрос: почему в мире вы это делаете? * Hooking * собственный вызов функции API с управляемой полезной нагрузкой является достаточно плохим (я, конечно, надеюсь, что вы лицензировали Detours, потому что никакой другой подход не поддерживается), но с целью применения уровня безопасности? Почему бы не использовать защиту, встроенную в файловую систему? –
Похоже, вам нужно посмотреть на использование драйвера minifilter, который позволит вам принимать решения о доступе в гораздо более подходящем контексте. См. Http://msdn.microsoft.com/en-us/library/ff540402(v=VS.85).aspx Пожалуйста, не подключайтесь ... Попробуйте открыть файл на сетевом ресурсе или запустить его в Vista/7 x64. Minifilter будет работать, ваше решение взорвется. –