проверять в реальном времени внешний процесс при открытии файла - PullRequest
0 голосов
/ 28 марта 2020

Мне нужно проверить в реальном времени, если определенный процесс c пытается прочитать файл wav of fla c.

Я создал подпрограмму с 2 параметрами: именем процесса и файлом которые пытаются открыть:

        public static bool Scan(string ProcessName,string TextToFind)
    {

        // getting minimum & maximum address
        SYSTEM_INFO sys_info = new SYSTEM_INFO();
        GetSystemInfo(out sys_info);

        int MatchCount=0;

        IntPtr proc_min_address = sys_info.minimumApplicationAddress;
        IntPtr proc_max_address = sys_info.maximumApplicationAddress;

        // saving the values as long ints so I won't have to do a lot of casts later
        long proc_min_address_l = (long)proc_min_address;
        long proc_max_address_l = (long)proc_max_address;

        Process[] Arrprocess = Process.GetProcessesByName(ProcessName);

        if (Arrprocess.Length == 0) return false;

        // notepad better be runnin'
        Process process = Arrprocess[0];

        // opening the process with desired access level
        IntPtr processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id);

        // this will store any information we get from VirtualQueryEx()
        MEMORY_BASIC_INFORMATION mem_basic_info = new MEMORY_BASIC_INFORMATION();

        int bytesRead = 0;  // number of bytes read with ReadProcessMemory

        // long milliseconds_start = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

        while (proc_min_address_l < proc_max_address_l)
        {
            // 28 = sizeof(MEMORY_BASIC_INFORMATION)
            VirtualQueryEx(processHandle, proc_min_address, out mem_basic_info, 28);

            // if this memory chunk is accessible
            if (mem_basic_info.Protect == PAGE_READWRITE && mem_basic_info.State == MEM_COMMIT && (mem_basic_info.lType == MEM_MAPPED || mem_basic_info.lType == MEM_PRIVATE))
            {
                byte[] buffer = new byte[mem_basic_info.RegionSize];

                // read everything in the buffer above
                ReadProcessMemory((int)processHandle, mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, ref bytesRead);

                string result = System.Text.Encoding.ASCII.GetString(buffer);

                if (result.Contains(TextToFind))
                    return true;

            }

            // move to the next memory chunk
            proc_min_address_l += mem_basic_info.RegionSize;
            proc_min_address = new IntPtr(proc_min_address_l);
        }


        return false;
    }

этот код работает только в первый раз, потому что, когда процесс закрывает файл fla c, строка остается в памяти, пока процесс не закроется.

Мне нужно каждый раз проверять (с точностью до миллисекунд), что процесс пытается загрузить файл, который я передаю в качестве параметра.

Я не знаю, правильно ли я поступил ...

Может кто-нибудь предложить мне код (в c# или c ++), который в режиме реального времени определяет, пытается ли процесс x прочитать имя файла y?

Спасибо!

1 Ответ

0 голосов
/ 28 марта 2020

Windows предоставляет методы, позволяющие узнать, когда файлы открываются / редактируются / переименовываются / et c.

https://docs.microsoft.com/en-us/windows/win32/projfs/file-system-operation-notifications

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...