Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadProcessMemory, не работает с приложениями .NET 
:(
    Опции темы
NET_or_not_NET
Дата 22.5.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



Доброго дня!

У меня возникла проблема с ReadProcessMemory при работе с приложением написанном на C# & VS2005! 

Когда я использую эту функцию (например с игрой "Минер") то все ОК!!!! все читаеться, все работает! И не только с "минером", 
с другими приложениями тоже все ок! Но решил я посмотреть что твориться в пямяти в моем приложении...
 как  smile  -  функция возвращает false, GetLastError - 299 ("выполнена только часть функции"). 
Складываеться такое впечетление что работает со всеми прогами написанными где угодно 
только без участия CLR, .Net FrameWork! надеюсь я страшно заблуждаюсь! Народ ПОМОГИТЕ! наставте на путь истинный!
Пишу C# & VS2005


P.S. Написал самое простое: одну форму + одна кнопка + 2-ве переменные! и вот немогу добраться до памяти процесса!
В ЧЕМ я ОШИБСЯ????

P.S.S. пробывал OpenProcess со всеми флагами - 0!
          пробывал сам создавать CreateProcess , Process.Start   -  0!

P.S.S.S. BaseAddress главного модуля получаеться без проблем!
PM MAIL   Вверх
archeg
Дата 22.5.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Дай плз пример кода, что именно ты делаешь.

Похоже что твое впечатление правильное:
Цитата(NET_or_not_NET @  22.5.2007,  13:45 Найти цитируемый пост)
Складываеться такое впечетление что работает со всеми прогами написанными где угодно 
только без участия CLR, .Net FrameWork!

Кажись всему виной AppDomain


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
NET_or_not_NET
Дата 22.5.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



Даю...

Код

[DllImport("kernel32.dll", SetLastError = true)]
        public extern static bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress,
           [In, Out] byte[] lpBuffer, int nSize, out IntPtr lpNumberOfBytesRead);

---------------------------------------------------------------------------------------------

            p = Process.Start("winmine.exe"); // тут надо вместо минера приложение .NET

            //Process[] cur_p = Process.GetProcesses(".");
            //foreach (Process pp in cur_p)
            //{
            //    if (pp.ProcessName == "winmine")
            //    {
            //        p = pp;
            //        break;
            //    }
            //}

            ProcessModule pm = p.MainModule; // главный модуль

            //IntPtr o = OpenProcess(0x1F0FFF, 1, (uint)p.Id);  //0x1F0FFF - эквивалент PROCESS_ALL_ACCESS
                
            byte[] b = new byte[pm.ModuleMemorySize]; // выделям под память размером ModuleMemorySize

            IntPtr ptrBytesReaded; // потом вернет сколько байт прочитал

            retValue1 = ReadProcessMemory(p.Handle, pm.BaseAddress.ToInt32(), b, pm.ModuleMemorySize, out ptrBytesReaded);
            //pm.BaseAddress.ToInt32() - адресс откуда начинаю считывать
            //retValue2 = ReadProcessMemory(o, pm.BaseAddress.ToInt32(), b, pm.ModuleMemorySize, out ptrBytesReaded);

            int vsego = (int)ptrBytesReaded;

            int i = GetLastError();


PM MAIL   Вверх
tol05
Дата 22.5.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Проблема в том, что в .Net, в отличие от "winmine.exe" есть сборщик мусора. Он запускается самопроизвольно и в своей работе не стесняется удалять и перемещать объекты в куче (а куча - это та память приложения, которую мы хотим знать). 
Если в процессе чтения памяти он запустится - результаты выполнения ReadProcessMemory() окажутся непредсказуемыми. smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
NET_or_not_NET
Дата 23.5.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



Доброго дня, tol05
а если это не ссылочнае значение а значимое и оно не в куче а в стеке?
И переменная глобальная? Как догда? тоже сборьщик грохнет?, или он грохнет при закрытии приложения?
если при закрытии, то значение в памяти? может прочитать адреес памяти для потока, а не для главного модуля?
конечно - если так можно?
PM MAIL   Вверх
tol05
Дата 23.5.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(NET_or_not_NET @  23.5.2007,  11:06 Найти цитируемый пост)
если это не ссылочнае значение а значимое и оно не в куче а в стеке

сборщик работает в куче. Запускается недетерминированно (никто не знает когда, в начале, в конце).  Но это не важно, ведь если бы даже ты приноровился к какому-то режиму в одной сборке, то для другой мог бы быть другой режим, так? smile

Стек заполняется и очищается независимо от кучи. По мере прохода потоком выполнения кода.

Ссылочные переменные находятся в куче, неважно, локальные они, глобальные, экземплярные или статические.

Значимые - в стеке. Тоже неважно кому они принадлежат.

Одним словом, есть мнение, что от этой ф-ции в .Net лучше отказаться. Можно попробовать решить поставленную задачу через члены GC класса. Я имею в виду GC.GetTotalMemory например. 
Больше ничего, к сожалению, сказать не могу. smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
NET_or_not_NET
Дата 23.5.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



tol05, спаисбо!

буду пробывать через GC класс.....

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1202 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.