Beispiel #1
0
        public static string getFileUniqueSystemID(string fileName)
        {
            bool   fileRead = false;
            string fileId   = "-1";

            while (!fileRead)
            {
                try
                {
                    FileStream strem = File.Open(fileName, FileMode.Open);
                    BY_HANDLE_FILE_INFORMATION hInfo = new BY_HANDLE_FILE_INFORMATION();
                    GetFileInformationByHandle(strem.SafeFileHandle, out hInfo);
                    fileId = hInfo.FileIndexHigh.ToString() + hInfo.FileIndexLow.ToString() + "|" + hInfo.VolumeSerialNumber.ToString();
                    strem.Close();
                    fileRead = true;
                }
                catch (IOException e)
                {
                    if (e is FileNotFoundException || e is PathTooLongException)
                    {
                        fileRead = true;
                    }
                    else
                    {
                        Thread.Sleep(100);
                    }
                }
                catch (System.UnauthorizedAccessException)
                {
                    fileRead = true;
                }
            }

            return(fileId);
        }
Beispiel #2
0
        /// <summary>
        /// Checks if two file paths are identical.
        /// </summary>
        /// <param name="P1">Path 1</param>
        /// <param name="P2">Path 2</param>
        /// <remarks>
        /// At least one file has to exist
        /// </remarks>
        /// <returns>true, if identical</returns>
        public static bool ComparePath(string P1, string P2)
        {
            //Consider two null strings identical
            if (P1 == null && P2 == null)
            {
                return(true);
            }
            //Throw if only one arg is null
            if (P1 == null)
            {
                throw new ArgumentNullException("P1");
            }
            //Throw if only one arg is null
            if (P2 == null)
            {
                throw new ArgumentNullException("P1");
            }
            //Consider Paths equal if strings are
            if (P1 == P2)
            {
                return(true);
            }
            //Fail if both files don't exist
            if (!File.Exists(P1) && !File.Exists(P2))
            {
                throw new ArgumentException("At least one argument needs to point to an existing file");
            }

            //Consider Paths unequal if one of the files doesn't exists
            if (!File.Exists(P1) || !File.Exists(P2))
            {
                return(false);
            }
            using (SafeFileHandle sfh1 = CreateFile(P1, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, (FileAttributes)0x02000080, IntPtr.Zero))
            {
                if (sfh1.IsInvalid)
                {
                    Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                }
                using (SafeFileHandle sfh2 = CreateFile(P2, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, (FileAttributes)0x02000080, IntPtr.Zero))
                {
                    if (sfh2.IsInvalid)
                    {
                        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                    }
                    var fileInfo1 = new BY_HANDLE_FILE_INFORMATION();
                    var fileInfo2 = new BY_HANDLE_FILE_INFORMATION();
                    if (!GetFileInformationByHandle(sfh1, out fileInfo1))
                    {
                        throw new Win32Exception();
                    }
                    if (!GetFileInformationByHandle(sfh2, out fileInfo2))
                    {
                        throw new Win32Exception();
                    }
                    return(fileInfo1.FileEquals(fileInfo2));
                }
            }
        }
Beispiel #3
0
 public static void GetFileInformation(string path, out BY_HANDLE_FILE_INFORMATION info)
 {
     using (FileStream file = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
     {
         if (!GetFileInformationByHandle(file.SafeFileHandle, out info))
         {
             throw new Win32Exception();
         }
     }
 }
Beispiel #4
0
        public uint Def_GetFileInformation(string fileName, ref BY_HANDLE_FILE_INFORMATION information, IntPtr info)
        {
            try
            {
                RegistryFileBlock FileBlock = new RegistryFileBlock(fileName);


                if (FileBlock.level == 1)
                {
                    information.FileAttributes = (uint)FileAttributes.Directory;
                    information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    information.LastWriteTime  = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    information.CreationTime   = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());


                    return(0);
                }
                RegistryKey key = GetRegistoryEntry(FileBlock);
                if (key == null)
                {
                    return(0xC0000467);
                }
                if (FileBlock.level == 3)
                {
                    //  fileName = fileName.Remove(fileName.LastIndexOf("."));
                    string value;
                    if (key.GetValue(FileBlock.ValueName) == null)//.ToString();
                    {
                        value = "";
                    }
                    else
                    {
                        value = key.GetValue(FileBlock.ValueName).ToString();
                    }
                    information.FileAttributes = (uint)FileAttributes.Readonly;
                    information.FileSizeLow    = (uint)value.Length;
                    information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    information.LastWriteTime  = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    information.CreationTime   = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());

                    return(0);
                }
                information.FileAttributes = (uint)FileAttributes.Directory;
                information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                information.LastWriteTime  = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                information.CreationTime   = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                return(0);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error : {0}", ex.Message);
                return(0xC0000467);
            }
        }
Beispiel #5
0
 public static int GetFileLinkCount(string filepath)
 {
     using (var handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero))
     {
         if (handle.IsInvalid) return 0;
         var fileInfo = new BY_HANDLE_FILE_INFORMATION();
         if (GetFileInformationByHandle(handle, out fileInfo))
             return (int)fileInfo.NumberOfLinks;
     }
     return 0;
 }
Beispiel #6
0
        public static int GetFileLinkCount(string filepath)
        {
            int result = 0;

            SafeFileHandle             handle   = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero);
            BY_HANDLE_FILE_INFORMATION fileInfo = new BY_HANDLE_FILE_INFORMATION();

            if (GetFileInformationByHandle(handle, out fileInfo))
            {
                result = (int)fileInfo.NumberOfLinks;
            }
            CloseHandle(handle);
            return(result);
        }
Beispiel #7
0
 public static int GetFileLinkCount(string filepath)
 {
     using (var handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero))
     {
         if (handle.IsInvalid)
         {
             return(0);
         }
         var fileInfo = new BY_HANDLE_FILE_INFORMATION();
         if (GetFileInformationByHandle(handle, out fileInfo))
         {
             return((int)fileInfo.NumberOfLinks);
         }
     }
     return(0);
 }
        private bool internal_is_same_volume(IntPtr h1, IntPtr h2)
        {
            BY_HANDLE_FILE_INFORMATION info1 = new BY_HANDLE_FILE_INFORMATION();
            BY_HANDLE_FILE_INFORMATION info2 = new BY_HANDLE_FILE_INFORMATION();
            int res = Native.GetFileInformationByHandle(h1, ref info1);

            if (res == 0)
            {
                return(false);
            }
            res = Native.GetFileInformationByHandle(h2, ref info2);
            if (res == 0)
            {
                return(false);
            }
            return(info1.dwVolumeSerialNumber == info2.dwVolumeSerialNumber);
        }
Beispiel #9
0
        public uint GetFileSystemId(FileInfo file)
        {
            BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION();

            try {
                using (FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
                    GetFileInformationByHandle(fs.SafeFileHandle.DangerousGetHandle(), out objectFileInfo);
                }
            }
            catch (Exception) {
                return(0);
            }

            uint fileIndex = (objectFileInfo.FileIndexHigh << 32) + objectFileInfo.FileIndexLow;

            return(fileIndex);
        }
Beispiel #10
0
        public bool Is(string path)
        {
            if (File.GetAttributes(path).HasFlag(FileAttributes.Directory))
            {
                return(false);
            }

            BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION();

            FileInfo   fi = new FileInfo(path);
            FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            GetFileInformationByHandle(fs.Handle, out objectFileInfo);

            fs.Close();

            return(objectFileInfo.NumberOfLinks > 1);
        }
Beispiel #11
0
        public static bool CalculateFileId(string path, out BY_HANDLE_FILE_INFORMATION hfi)
        {
            hfi = new BY_HANDLE_FILE_INFORMATION {
            };
            IntPtr file = CreateFile(path, 0, 0, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);

            if (file.ToInt32() == INVALID_HANDLE_VALUE)
            {
                return(false);
            }
            bool ret = GetFileInformationByHandle(file, ref hfi);

            CloseHandle(file);
            if (!ret)
            {
                return(false);
            }
            return(true);
        }
Beispiel #12
0
            public uint Def_GetFileInformation(string filename, ref BY_HANDLE_FILE_INFORMATION Information, IntPtr info)
            {
                VNode Node = new VNode(filename);

                Console.WriteLine("{0} {1} {2}", Node.isFile, Node.rootDir, Node.curDir);
                if (Node.isValid)
                {
                    Information.CreationTime   = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    Information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    Information.LastWriteTime  = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime());
                    Information.FileSizeLow    = 100000;
                    if (Node.isFile)
                    {
                        Information.FileAttributes = FileAttributes.Readonly;
                    }
                    else
                    {
                        Information.FileAttributes = FileAttributes.Directory | FileAttributes.Readonly;
                    }
                }
                return(0);
            }
Beispiel #13
0
        private void GetRootFrnEntry(string drive)
        {
            string driveRoot = string.Concat("\\\\.\\", drive);

            driveRoot = string.Concat(driveRoot, Path.DirectorySeparatorChar);
            IntPtr hRoot = NativeWrapper.CreateFile(driveRoot,
                                                    0,
                                                    NativeWrapper.FILE_SHARE_READ | NativeWrapper.FILE_SHARE_WRITE,
                                                    IntPtr.Zero,
                                                    NativeWrapper.OPEN_EXISTING,
                                                    NativeWrapper.FILE_FLAG_BACKUP_SEMANTICS,
                                                    IntPtr.Zero);

            if (hRoot.ToInt32() != NativeWrapper.INVALID_HANDLE_VALUE)
            {
                BY_HANDLE_FILE_INFORMATION fi = new BY_HANDLE_FILE_INFORMATION();
                bool bRtn = NativeWrapper.GetFileInformationByHandle(hRoot, out fi);
                if (bRtn)
                {
                    UInt64 fileIndexHigh = (UInt64)fi.FileIndexHigh;
                    UInt64 indexRoot     = (fileIndexHigh << 32) | fi.FileIndexLow;

                    FileNameAndParentFrn f = new FileNameAndParentFrn(driveRoot, 0);

                    _directories.Add(indexRoot, f);
                }
                else
                {
                    throw new IOException("GetFileInformationbyHandle() returned invalid handle",
                                          new Win32Exception(Marshal.GetLastWin32Error()));
                }
                NativeWrapper.CloseHandle(hRoot);
            }
            else
            {
                throw new IOException("Unable to get root frn entry", new Win32Exception(Marshal.GetLastWin32Error()));
            }
        }
Beispiel #14
0
        /// <summary>
        /// 把远程file handle复制到本地进程
        /// 然后获取文件名
        /// </summary>
        /// <param name="p_hfile"></param>
        private unsafe void ReadFileInfo(IntPtr p_hfile)
        {
            IntPtr my_hfile = new IntPtr(-1);

            int hCurProcess = -1;            //WinApi.GetCurrentProcess();

            bool result;

            result = WinApi.DuplicateHandle(processHandle.ToInt32(), p_hfile.ToInt32(), hCurProcess, ref my_hfile, 0x80000000, false, 2);

            #region GetFileInformationByHandle 文件最基本信息
            var fileinfo = new BY_HANDLE_FILE_INFORMATION();

            result = WinApi.GetFileInformationByHandle(my_hfile.ToInt32(), ref fileinfo);

            //Console.Out.WriteLine(fileinfo.dwFileAttributes);
            #endregion

            #region GetFileInformationByHandleEx
            var fileinfo2 = new FILE_FULL_DIR_INFO();

            int fileInfo2Type = (int)FileInformationClass.FileFullDirectoryInfo;            //0xe;

            //本来想用开辟非托管内存的操作,传指针到winapi,后来发现那块内存有数据后用
            //PtrToStructure转结构体报错,也许是操作问题,还不如直接传结构体
            int    size2       = Marshal.SizeOf(fileinfo2);
            IntPtr p_fileInfo2 = Marshal.AllocHGlobal(size2);
            Marshal.StructureToPtr(fileinfo2, p_fileInfo2, false);

            //调用失败 大概是LARGE_INTEGER 这个union的结构不对
            result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo2Type, ref fileinfo2, size2);

            var fileinfo3 = new FILE_NAME_INFO();
            //fileinfo3.FileName = "";

            int    fileInfo3Type = (int)FileInformationClass.FileNameInfo;         //0x2;
            int    size3         = Marshal.SizeOf(fileinfo3) + 1000 * 2;
            IntPtr p_fileInfo3   = Marshal.AllocHGlobal(size3);
            Marshal.StructureToPtr(fileinfo3, p_fileInfo3, false);

            //\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901
            //result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo3Type, p_fileInfo3, size3);
            result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo3Type, ref fileinfo3, size3);


            StringBuilder fn3 = new StringBuilder(1000);

            int len3 = WinApi.GetFullPathName(fileinfo3.FileName, 1000, fn3, null);

            //输出正常路径
            //E:\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901
            Console.Out.WriteLine(fn3);
            #endregion

            #region GetFinalPathNameByHandle
            //char[] fileName = new char[1000];
            StringBuilder fileName = new StringBuilder(1000);

            //获取的带设备路径
            //\Device\HarddiskVolume4\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901
            int size4 = WinApi.GetFinalPathNameByHandle(my_hfile.ToInt32(), fileName, 1000, 0x2);

            StringBuilder fn4 = new StringBuilder(1000);

            //会在前面在加个盘符,然而没去掉设备路径,超谐
            //有专门根据设备路径获取盘符路径的方法
            //E:\Device\HarddiskVolume4\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901
            int len4 = WinApi.GetFullPathName(fileName.ToString(), 1000, fn4, null);

            Console.Out.WriteLine(fn4);
            #endregion


            #region ZwQueryInformationFile
            //GetFileInformationByHandleEx 内部调用的就是这个吧(

            var fileStatus5 = new IO_STATUS_BLOCK();

            int    ssize5        = Marshal.SizeOf(fileStatus5);
            IntPtr p_fileStatus5 = Marshal.AllocHGlobal(ssize5);
            Marshal.StructureToPtr(fileStatus5, p_fileStatus5, false);

            var fileinfo5 = new FILE_NAME_INFO();
            //fileinfo5.FileName = "";

            int    fileInfo5Type = (int)FileInformationClass.FileFullDirectoryInfo;         //9;
            int    size5         = Marshal.SizeOf(fileinfo5) + 1000 * 2;
            IntPtr p_fileInfo5   = Marshal.AllocHGlobal(size5);
            Marshal.StructureToPtr(fileinfo5, p_fileInfo5, false);

            int ret = WinApi.ZwQueryInformationFile(my_hfile.ToInt32(), ref fileStatus5, ref fileinfo5, size5, fileInfo5Type);

            //\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901
            Console.Out.WriteLine(fileinfo5.FileName);
            #endregion
        }
Beispiel #15
0
 private static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #16
0
 public static extern bool GetFileInformationByHandle(IntPtr handle, ref BY_HANDLE_FILE_INFORMATION hfi);
Beispiel #17
0
 internal static unsafe partial bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #18
0
 GetFileInformationByHandle(
     IntPtr hFile,
     out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #19
0
 public static extern bool GetFileInformationByHandle(
     [In] SafeFileHandle hFile,
     [Out] out BY_HANDLE_FILE_INFORMATION lpFileInformation
     );
Beispiel #20
0
 public bool FileEquals(BY_HANDLE_FILE_INFORMATION f)
 {
     return(FileIndexHigh == f.FileIndexHigh &&
            FileIndexLow == f.FileIndexLow &&
            VolumeSerialNumber == f.VolumeSerialNumber);
 }
Beispiel #21
0
 public static extern bool GetFileInformationByHandle([System.Runtime.InteropServices.InAttribute()] System.IntPtr hFile, [System.Runtime.InteropServices.OutAttribute()] out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #22
0
        public uint GetFileSystemId(FileInfo file)
        {
            BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION();

            try {
                using (FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
                    GetFileInformationByHandle(fs.SafeFileHandle.DangerousGetHandle(), out objectFileInfo);
                }
            }
            catch (Exception) {
                return 0;
            }

            uint fileIndex = (objectFileInfo.FileIndexHigh << 32) + objectFileInfo.FileIndexLow;

            return fileIndex;
        }
Beispiel #23
0
 public static extern bool GetFileInformationByHandle(IntPtr hFile,
                                                              out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #24
0
 private static extern Boolean GetFileInformationByHandle(
     IntPtr hFile,
     out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #25
0
 public uint Def_GetFileInformation(string filename, ref BY_HANDLE_FILE_INFORMATION Information, IntPtr info)
 {
     return(0);
 }
Beispiel #26
0
 internal static extern bool GetFileInformationByHandle
 (
     IntPtr hFile,
     out BY_HANDLE_FILE_INFORMATION lpFileInformation
 );
Beispiel #27
0
 public static extern bool GetFileInformationByHandle(
     Microsoft.Win32.SafeHandles.SafeFileHandle hFile,
     out BY_HANDLE_FILE_INFORMATION lpFileInformation
     );
Beispiel #28
0
 public static extern unsafe bool GetFileInformationByHandle(int hFile, ref BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #29
0
 public static bool CompareFile(BY_HANDLE_FILE_INFORMATION f1, BY_HANDLE_FILE_INFORMATION f2)
 {
     return(f1.dwVolumeSerialNumber == f2.dwVolumeSerialNumber && f1.nFileIndexHigh == f2.nFileIndexHigh && f1.nFileIndexLow == f2.nFileIndexLow);
 }
Beispiel #30
0
 static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
Beispiel #31
0
 /// <summary></summary>
 public static bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation) => GetFileInformationByHandle_(hFile, out lpFileInformation);