Exemple #1
0
        private IEnumerable <FileMapping> GetActualFiles(string fileName)
        {
            NativeMethods.Win32FindData findFileData = new NativeMethods.Win32FindData();
            List <FileMapping>          actualFiles  = new List <FileMapping>();
            IntPtr hFind = NativeMethods.FindFirstFileW(fileName, ref findFileData);

            if (hFind != new IntPtr(-1))
            {
                do
                {
                    //if (findFileData.cFileName.Equals(@".") || findFileData.cFileName.Equals(@".."))
                    //    continue;
                    //if ((findFileData.dwFileAttributes & 0x10) != 0)
                    //{
                    //    string path = Path.Combine(Path.GetDirectoryName(fileName) ?? throw new InvalidOperationException(), findFileData.cFileName);
                    //    actualFiles.Add(new FileMapping(path, findFileData));
                    //}
                    //else
                    //{
                    string path = Path.Combine(Path.GetDirectoryName(fileName) ?? throw new InvalidOperationException(), findFileData.cFileName);
                    actualFiles.Add(new FileMapping(path, findFileData));
                    //}
                }while (NativeMethods.FindNextFileW(hFind, ref findFileData));
            }
            NativeMethods.FindClose(hFind);

            //Console.WriteLine("///////////////////ACTUAL///////////////////");
            //foreach (FileMapping actualFile in actualFiles)
            //{
            //    _monitor.Log($"{actualFile.FindData.cFileName}");
            //}
            //Console.WriteLine("///////////////////ACTUAL///////////////////");
            return(actualFiles);
        }
Exemple #2
0
        private bool FindNextFileCallBack(IntPtr hndfindfile, ref NativeMethods.Win32FindData lpfindfiledata)
        {
            if (!_searchingFiles.ContainsKey(hndfindfile))
            {
                return(NativeMethods.FindNextFileW(hndfindfile, ref lpfindfiledata));
            }


            Queue <FileMapping> queue = _searchingFiles[hndfindfile];

            if (queue.Count == 0)
            {
                return(false);
            }

            lpfindfiledata = queue.Dequeue().FindData;
            _monitor.Log(lpfindfiledata.cFileName);

            /*还有文件的时候,返回true,没了返回False*/
            return(true);
        }
Exemple #3
0
        private IntPtr FindFirstFileCallBack(string pfilename, ref NativeMethods.Win32FindData pfindfiledata)
        {
            if (PathWhiteList.Count > 0 && !PathWhiteList.Contains(Path.GetDirectoryName(pfilename)))
            {
                return(NativeMethods.FindFirstFileW(pfilename, ref pfindfiledata));
            }

            FileMappingDic = _monitor.GetFileMappingDic(_channel);

            string matchPath = pfilename.Replace(@"\", @"\\")
                               .Replace(".", @"\.")
                               .Replace("*", ".*").Replace("?", ".");
            Regex regex = new Regex(matchPath);

            IEnumerable <FileMapping> actualFiles  = GetActualFiles(pfilename);
            Queue <FileMapping>       matchedFiles = new Queue <FileMapping>(actualFiles);

            if (FileMappingDic != null)
            {
                foreach (string key in FileMappingDic.Keys.Where(key => regex.Match(key).Value == key))
                {
                    matchedFiles.Enqueue(FileMappingDic[key]);
                }
            }

            //没找到返回INVALID_HANDLE_VALUE
            if (matchedFiles.Count == 0)
            {
                return(new IntPtr(-1));
            }

            IntPtr ptr = NativeMethods.FindFirstFileW(matchedFiles.Peek().ActualPath, ref pfindfiledata);

            pfindfiledata = matchedFiles.Peek().FindData;
            matchedFiles.Dequeue();
            _searchingFiles.Add(ptr, matchedFiles);
            _monitor.Log(pfindfiledata.cFileName);
            return(ptr);
        }
Exemple #4
0
 public FileMapping(string actualPath, NativeMethods.Win32FindData findData)
 {
     PuppetPath = ActualPath = actualPath;
     _findData  = findData;
 }