public static NT_FILE_BASIC_INFO GetFileInfo_basic(string file_name) { IntPtr file_handle = IntPtr.Zero; try { //open file file_handle = WinApiFS.CreateFile_intptr (file_name, Win32FileAccess.GENERIC_READ, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, CreateFileOptions.BACKUP_SEMANTICS, IntPtr.Zero); if (file_handle.ToInt32() == WinApiFS.INVALID_HANDLE_VALUE) { int win_err = Marshal.GetLastWin32Error(); Exception ex = new Win32Exception(win_err); throw ex; } NT_FILE_BASIC_INFO ret = GetFileInfo_basic(file_handle); return(ret); } finally { if ((file_handle != IntPtr.Zero) && (file_handle.ToInt32() != WinApiFS.INVALID_HANDLE_VALUE)) { WinApiFS.CloseHandle(file_handle); } } }
public static NT_FILE_BASIC_INFO GetFileInfo_basic(IntPtr file_handle) { IntPtr ret_ptr = IntPtr.Zero; try { //нинциализируем IO_STATUS IO_STATUS_BLOCK status_block = new IO_STATUS_BLOCK(); //инициализируем NT_FILE_BASIC_INFO int ret_len = Marshal.SizeOf(typeof(NT_FILE_BASIC_INFO)); ret_ptr = Marshal.AllocHGlobal(ret_len); //вызываем - по некторым сведениям вызов может в некоторых случаях блокироваться до //бесконечности! uint res = ntApiFS.NtQueryInformationFile (file_handle, ref status_block, ret_ptr, ret_len, FILE_INFORMATION_CLASS.FileBasicInformation); //обрабатываем исключения NTSTATUS_helper.ThrowOnError(res, status_block, NTSTATUS_severity.Warning); //получаем управляемую структуру из указателя NT_FILE_BASIC_INFO ret = (NT_FILE_BASIC_INFO)Marshal.PtrToStructure (ret_ptr, typeof(NT_FILE_BASIC_INFO)); return(ret); } finally { if (ret_ptr != IntPtr.Zero) { Marshal.FreeHGlobal(ret_ptr); } } }