我有掛鉤ntdll.dll的NtCreateFile()函數來允許/拒絕某些文件的訪問。與kernel32.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#版本的「從文件句柄獲取文件名」。
任何見解,代碼修復,鏈接?
我會問一個顯而易見的問題:爲什麼在世界上你在幹什麼呢? *掛鉤*使用託管有效內容的本地API函數調用已經夠糟糕了(我當然希望您已經授權了Detours,因爲沒有其他方法可以支持),但是其目的是應用一個安全層?爲什麼不使用內置在文件系統中的安全性? – 2010-07-23 00:03:47
看起來你需要看寫迷你過濾驅動程序,這將允許您在更合適的上下文中做出訪問決策。請參閱:http://msdn.microsoft.com/en-us/library/ff540402(v=VS.85).aspx請不要掛鉤...嘗試打開網絡共享上的文件或在Vista/7上運行它64。微過濾器將工作,你的解決方案將炸燬。 – 2010-07-23 06:00:07