コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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);
                }
            }
        }