Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2014, 18:25   #1
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию Странности с ReadProcessMemory

Здравствуйте. У меня есть функция на C#
Код:
            var systemInfo = new SystemInfo();
            while (systemInfo.minimumApplicationAddress.ToInt32() == 0)
            {
                Win32.GetSystemInfo(out systemInfo);
            }
            IntPtr minimumAdress = systemInfo.minimumApplicationAddress;
            long minimumAdresslong = minimumAdress.ToInt32();
            IntPtr processHandle = Win32.OpenProcess(1040, false, 6168);
            ProcessQueryInformation processQuery;
            while (Win32.VirtualQueryEx(processHandle, minimumAdress, out processQuery, 28) != 0)
            {
                if ((processQuery.Protect == 4) && (processQuery.State == 4096))
                {
                        var buffer = new byte[processQuery.RegionSize];
                        IntPtr lpNumberOfbytes;
                        Win32.ReadProcessMemory(processHandle, processQuery.BaseAdress, buffer,
                            processQuery.RegionSize, out lpNumberOfbytes);
                        string preparedIDs = Encoding.ASCII.GetString(buffer);
                        //Console.WriteLine(preparedIDs);
                        var matchs =
                            new Regex("some regex", RegexOptions.IgnoreCase).Matches(preparedIDs);
                        if (matchs.Count > 0)
                        {
                            foreach (Match match in matchs)
                            {
                                Console.WriteLine(match.Value);
                            }
                        }
                }
                minimumAdresslong += processQuery.RegionSize;
                if (minimumAdresslong >= Int32.MaxValue)
                {
                    break;
                }
                minimumAdress = new IntPtr(minimumAdresslong);
            }
Я переписал её на C++
Код:
    SYSTEM_INFO systeminfo;
    GetSystemInfo(&systeminfo);
    LPVOID minimumAdress = systeminfo.lpMinimumApplicationAddress;
    long minimumAdresslong = reinterpret_cast<long>(minimumAdress);
    MEMORY_BASIC_INFORMATION meminfo;
    HANDLE hProc = OpenProcess(1040, FALSE, 6168);
    while (VirtualQueryEx(hProc, minimumAdress, &meminfo, sizeof(meminfo)) != 0){
        if ((meminfo.Protect == 4) && (meminfo.State) == 4096)
        {
            char* cDataBuffer = (char*)malloc(meminfo.RegionSize);
            DWORD lpNumberOfbytes;
            //std::string buffer;
            //buffer.resize(meminfo.RegionSize);
                                                       //&buffer[0] - если с std::string buffer;
            ReadProcessMemory(hProc, meminfo.BaseAddress, cDataBuffer, meminfo.RegionSize, &lpNumberOfbytes);
            string preparedIDs(cDataBuffer, lpNumberOfbytes);
            //string preparedIDs = buffer;
            const std::tr1::regex rx("some regex", std::regex_constants::icase);
            std::tr1::match_results<std::string::const_iterator> res;
            if (std::tr1::regex_search(preparedIDs, res, rx))
            {
                for (unsigned int i = 0; i<res.size(); ++i)
                {
                cout << res[i] << std::endl;
                }
            }
            //cout << preparedIDs << endl;
            free(cDataBuffer);
        }
        minimumAdresslong += meminfo.RegionSize;
        if (minimumAdresslong >= INT32_MAX){
            break;
        }
        minimumAdress = reinterpret_cast<LPVOID>(minimumAdresslong);
    }
Оно конечно работает, но есть проблемы. Код на С# работает нааамного быстрее, я значения получаю ещё до появление консоли, а в С++ за 4 секунды только. Но это ещё ладно, но на C++ выводит только 4 значения, когда на C# выдает 12 значении..
Пробовал использовать std::string buffer(говорят так лучше), но разницы нету вообще никакой. В чем может быть проблема? на С++ пишу первый раз и избалован решеткой, так что сильно палкой не бить если упустил какие-то тонкости работы с++)

Последний раз редактировалось Stilet; 22.10.2014 в 19:01.
layerslayer вне форума Ответить с цитированием
Старый 22.10.2014, 19:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В чем может быть проблема?
Ну например разница в механизме regex там и там. Мало ли как они устроены. Регулярные выражения вообще далеко не быстрые в принципе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.10.2014, 19:09   #3
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну например разница в механизме regex там и там. Мало ли как они устроены. Регулярные выражения вообще далеко не быстрые в принципе.
Окей, какую библиотеку вы можете мне посоветовать кроме boost\regex?
layerslayer вне форума Ответить с цитированием
Старый 22.10.2014, 20:41   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Вы еще не знаете в regex проблема или нет.
Закомментируйте regex и посмотрите на скорость, улучшится или нет.
Кроме того, при использовании std::string вы выделяете память дважды - один раз для считывания, второй раз сам std::string выделит.
waleri вне форума Ответить с цитированием
Старый 22.10.2014, 20:43   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Окей, какую библиотеку вы можете мне посоветовать кроме boost\regex?
Ну не, это не ко мне )
Я Делфятник вообще-то
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.10.2014, 21:18   #6
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вы еще не знаете в regex проблема или нет.
Закомментируйте regex и посмотрите на скорость, улучшится или нет.
Кроме того, при использовании std::string вы выделяете память дважды - один раз для считывания, второй раз сам std::string выделит.
Если за комментирую, то уже при появлений консоли сразу выводит system("pause")

А по поводу string, а что мне ещё остается, если буду использовать char*
то будет такое:

и там ничего не находит в таком виде, а если string то все ок

Последний раз редактировалось layerslayer; 22.10.2014 в 21:21.
layerslayer вне форума Ответить с цитированием
Старый 22.10.2014, 23:35   #7
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию

пробовал xpressive
PHP код:
#include "boost\xpressive\xpressive.hpp"
using namespace boost::xpressive;
sregex rex sregex :: compile "тут регекс" );
smatch what;
if (
regex_match(preparedIDswhatrex)){
     ...

и в const char*(cmatch, cregex_compile, cregex) тоже пробывал, ничего(
layerslayer вне форума Ответить с цитированием
Старый 23.10.2014, 09:12   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

И еще - зачем создавать rx внутри цикла?
Создать перед началом while а потом только вести поиск.
waleri вне форума Ответить с цитированием
Старый 24.10.2014, 00:06   #9
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Jurijus27 Посмотреть сообщение
Что бы программа работала быстра ее нада избавить от вывода на экран, FreeConsole, как можно меньше документов для сохронение, все в 1 одной программе так чтобы открылась была невидимой и немегала, без Sleep, с закрытием файла при сохронение его.
А так же исползаете buffer.
Уменя при использование то что сверху уходит на читку 1 секунда на 1 gb
А на сохронение 2.25 минуты на 1 gb
*facepalm* мне и не надо ничего выводить на экран, я показал скриншоты чисто для примера, это во-первых, во-вторых, никаких sleep у меня нету, в-третьих, какие сохранение файла, ты о чем? мне тупо нужно выдрать из участков памяти нужные мне значение, ни больше ни меньше, а про буффер - видимо cDataBuffer тебе ни о чем не говорит.
Цитата:
Сообщение от waleri Посмотреть сообщение
И еще - зачем создавать rx внутри цикла?
Создать перед началом while а потом только вести поиск.
Это все я уже делал, куда что только не переносил, просто тут я выложил такой вариант, т.к. особо эти мелочи что с выделением памяти под std::string, regex в while не влияли. Сейчас моя задача уже заключается не столь в скорости и микро оптимизации как найти хотя бы все значения из памяти, а не 1/3(нужно в точности как в С# выходит)
layerslayer вне форума Ответить с цитированием
Старый 24.10.2014, 01:03   #10
layerslayer
 
Регистрация: 22.10.2014
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Jurijus27 Посмотреть сообщение
Про цыклы (for, while, do) отличие c# и c++ можете посмотреть здесь http://msdn.microsoft.com/ru-ru/libr...(v=vs.90).aspx
(еще есть цыкл a: goto a; )
С какой целью ты даешь мне эту ссылку, ты читал вообще её? Там рассказывается что в C# есть такая классная штука как foreach, в C++ её раньше не было(не считая реализации в MSVC++, однако решение было не кроссплатформенное), но в С++11 её добавили. И вообще это не по теме, судя по вашим другим комментариям и замечанию модератора - вы наркоман, но не важно, спасибо что активно апаете мою тему.
layerslayer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос от новичка по ReadProcessMemory Drabadan Общие вопросы Delphi 1 21.03.2014 00:56
Вопрос по ReadProcessMemory Alexey_68 Общие вопросы C/C++ 5 28.03.2013 03:33
ReadProcessMemory и WriteProcessMemory Berlioz Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 12.11.2012 17:42
ReadProcessMemory работает?? NEoMASTERR Win Api 1 03.12.2011 00:51
ReadProcessMemory+TMemoryStream Bad-XxX Общие вопросы Delphi 2 10.10.2010 20:11