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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2011, 02:34   #41
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
[299] ReadProcMem: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично
Код:
if ReadProcessMemory(...) then
begin
  ... // запись в файл
end
else
if (GetLastError <> ERROR_PARTIAL_COPY) and
   (GetLastError <> ERROR_ACCESS_DENIED) then // насчёт этого не уверен, но лишним не будет
begin
  ... // обработка ошибки
end;
И в связи с этим partial copy - я бы GetMem заменил бы на AllocMem. Во избежание.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.08.2011, 02:43   #42
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Crystallon Посмотреть сообщение
В моем случае это не так важно :D ну и в любом случае незнаю как вам а мне гораздо легче улучшить чужой велосипед который на ходу, чем с нуля делать свой.
Боольшая ошибка.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.08.2011, 02:58   #43
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Так и знал что опять начнется закидывание какашками :D безусловно есть 2 типа программистов, первые прочитали дофига книжек и этим гордятся, ну раз гордятся я ниче против не имею, жаль только что они имеют много чего против тех кто книжек не читал(ну мол если я время потратил прочитал пусть и они сделают тоже самое иначе мир не справедлив) и учился программировать на тех самых "га*но-примерах из интернета" и первые уверены что вторые не имеют права носить гордое звание программиста, но меня удручает не этот факт, а тот что большинству "вторых" на это не плевать, а ведь должно бы т.к. по сути их программистами итак никто не назовет "официально" т.к. нету бумажки подтверждающей обратное... Вобщем все это я говорю к тому что пинать за то что человек не потратил кучу времени на изучение литературы как это сделали вы можно сколько угодно, но от этого людей которым влом получать информацию большая часть которой им может и не пригодится не станет меньше =)
P.S. Это всеголишь имхо, а значит я не с кем не спорю, а это в свою очередь значит что дальнейшее обсуждение вопроса излишне.
Crystallon вне форума Ответить с цитированием
Старый 31.08.2011, 03:50   #44
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ну вот в общем-то конечный продукт моих стараний, не без помощи:
1. MSDN
2. mss'а
3. GunSmoker'а

Код:
{-------------------------------------------------------------------------------
  Функция: MoveProcessMemoryToFile
  Автор:    Человек_Борща & mss & GunSmoker
  Дата:  2011.08.31
  Входные параметры: aPID: DWORD; aSaveFileTo,aFailMesage: string
  Результат:    Boolean
  Описание:
    Функция сбрасывает дамп(снимок) текущего состояния памяти процесса на диск в файл.
  aPID - идентификатор процесса
  aSaveFileTo - путь к файлу в который будет сброшена память
   aFailMesage - что-то вроде CallBack сюда сбрасывается сообщение если результат false.
-------------------------------------------------------------------------------}
function MoveProcessMemoryToFile(aPID: DWORD; aSaveFileTo,aFailMesage: string): Boolean;
const
  GB4 = 4294967296; //размер 4 гб в байтах
var
  hProcess: Cardinal;
  MBI: TMemoryBasicInformation;
  FS: TFileStream;
  Buff: PByte;
  BaseAddr,
    RecivedBytes: Cardinal;
begin
  Result := False;
  BaseAddr := 0;
  RecivedBytes := 0;
  //Открываем процесс
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ, False, aPID);
  try
    if hProcess <> 0 then
    begin
      //Если открыли, создаём файл
      fs := TFileStream.Create(aSaveFileTo, fmCreate or fmOpenWrite);
      try
        //Запращиваем память по указанному адресу BaseAddr
        while VirtualQueryEx(hProcess, Pointer(BaseAddr), MBI, SizeOf(MBI)) <> 0 do
        begin
          //Если страница памяти доступна и не заблокирована для нас
          if ((MBI.State = MEM_COMMIT) and (not (MBI.Protect = PAGE_GUARD) or (MBI.Protect = PAGE_NOACCESS))) then
          begin
            try
              //Выделяем часть памяти равной размеру региона памяти из кучи ОЗУ
              Buff := AllocMem(MBI.RegionSize);
              //Читаем память этого региона
              if ReadProcessMemory(hProcess, MBI.BaseAddress, Buff, MBI.RegionSize, RecivedBytes) then
              begin
                //пишем в файл прочитанную информацию равную кол-ву считанных байт
                FS.Write(Buff^, RecivedBytes);
              end
              //Если не удачно
              else if (GetLastError <> ERROR_PARTIAL_COPY) and
                (GetLastError <> ERROR_ACCESS_DENIED) then
              begin
                //Ложный результат
                aFailMesage:=Format('Error #%d with RMessage: %s ', [GetLastError, SysErrorMessage(GetLastError)]);
                Exit;
              end;
            finally
              //Освобождаем занятую нами память
              FreeMem(Buff);
            end;
          end;
          //Увеличиваем(инкрементируем) стартовый адрес на размер региона
          BaseAddr := BaseAddr + MBI.RegionSize;
          //проверяем непревышает ли он размер 4 гб.
          if BaseAddr = GB4 then
          begin

            Exit;
          end;
        end;
        //Тупо проверка, сбросили мы в буфер хоть что-нибудь :d
        if FS.Size > 0 then
        begin
          Result := True;
        end;
      finally
        FreeAndNil(fs);
      end;
    end
    else
    begin
      aFailMesage:=Format('Error #%d with RMessage: %s ', [GetLastError, SysErrorMessage(GetLastError)]);
      Exit;
    end;
  finally
    CloseHandle(hProcess);
  end;
end;
Успешно делает дамп памяти процесса и сбразывает его на диск.

Цитата:
Так и знал что опять начнется закидывание какашками :D безусловно есть 2 типа программистов, первые прочитали дофига книжек и этим гордятся, ну раз гордятся я ниче против не имею, жаль только что они имеют много чего против тех кто книжек не читал(ну мол если я время потратил прочитал пусть и они сделают тоже самое иначе мир не справедлив) и учился программировать на тех самых "га*но-примерах из интернета" и первые уверены что вторые не имеют права носить гордое звание программиста, но меня удручает не этот факт, а тот что большинству "вторых" на это не плевать, а ведь должно бы т.к. по сути их программистами итак никто не назовет "официально" т.к. нету бумажки подтверждающей обратное... Вобщем все это я говорю к тому что пинать за то что человек не потратил кучу времени на изучение литературы как это сделали вы можно сколько угодно, но от этого людей которым влом получать информацию большая часть которой им может и не пригодится не станет меньше =)
P.S. Это всеголишь имхо, а значит я не с кем не спорю, а это в свою очередь значит что дальнейшее обсуждение вопроса излишне.
Вы, уважаемый, бред пишите!
Программисты не делятся вообще!

Сколько прочёл книг я? 0. Библию Делфи от Фленова читал, и то не до конца. Остановился на 11 главе(Синтаксиса было достаточно). Дальше смекалка, умение польозваться поиском, чтение справок и просмотр по диагонали книг о delphi. все.

Последний раз редактировалось Человек_Борща; 31.08.2011 в 03:58.
Человек_Борща вне форума Ответить с цитированием
Старый 31.08.2011, 08:09   #45
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Уже не однократно писал на этом форуме и ссылался на свою страничку nemecsx.narod.ru (старенькая), там проект давнишний 2008 года, патчер памяти процессов, так вот из него выдержка. Не успел вам дать ссылку.
Код:
function GetDumpFromProcess(FileName: String): Boolean;
var
  addr, WinSwupWND, ProcID, Proc, NumOfBytes: DWORD;
  MBI: TMemoryBasicInformation;
  f: File;
  Buff: Pointer;
begin
  Result := False;
  WinSwupWND := FindWindow(NIl, WinSwupTitle);
  GetWindowThreadProcessId(WinSwupWND, ProcID);
  Proc := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
  if (Proc <> 0) then
  begin
    {$I-}
    AssignFile(f, FileName);
    ReWrite(f, 1);

    addr := 0;
    while (addr < high(addr)) do
    begin
      if VirtualQueryEx(Proc, Pointer(addr), MBI, SIZEOF(MBI)) <> SIZEOF(MBI) then break;
      if (MBI.State = MEM_COMMIT) and (MBI.Type_9 = MEM_PRIVATE) then
      begin
        GetMem(Buff, MBI.RegionSize);
        ReadProcessMemory(Proc, MBI.BaseAddress, Buff, MBI.RegionSize, NumOfBytes);
        BlockWrite(f, Buff^, NumOfBytes);
        FreeMem(Buff);
      end;
      addr := DWORD(MBI.BaseAddress) + MBI.RegionSize;
    end;

    CloseFile(f);
    {$I+}

    CloseHandle(Proc);
    Result := True;
  end;
end;
BOBAH13 вне форума Ответить с цитированием
Старый 31.08.2011, 12:07   #46
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Crystallon Посмотреть сообщение
Вобщем все это я говорю к тому что пинать за то что человек не потратил кучу времени на изучение литературы как это сделали вы можно сколько угодно, но от этого людей которым влом получать информацию большая часть которой им может и не пригодится не станет меньше =)
Да, блин, причём тут гордится?

Ты просто не представляешь сколько программистов вообще не умеют писать код. И им за это деньги платят, между прочим. А работают они ровно так же, как ты - берут код и пытаются встроить его в их проект. А когда не получается - дёргают коллег или форумы. Всё. У них ни понимания того, что они делают, ни понимания кода, ни знаний - ничего нет. Самостоятельно что-то сделать, найти информацию, проанализировать - они не способны.

И таких - больше половины.

Тебя пинают исключительно по причине улучшить эту ситуацию.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.08.2011, 15:08   #47
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

offtopic
GunSmoker,где можно узнать подробнее о @, Pointer и ^ ?
Человек_Борща вне форума Ответить с цитированием
Старый 31.08.2011, 17:58   #48
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я уже приводил ссылку.

http://www.transl-gunsmoker.ru/2009/09/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.08.2011, 21:22   #49
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Я уже приводил ссылку.
Ради любопытства почитал сей "фундаментальный труд".
В целом и общем изложено довольно неплохо и грамотно.

Не иначе ведь как ты, как мне помнится, что-то там какое-то время назад имел против "Статических переменных" ?)

Так какого же, спрашивается, в твоем "монументальном шедевре" фигурируют какие-то там "Анонимные переменные" ?

А процитируй-ка, любезный, фрагменты спецификаций Паскаля, где фигурируют оные)..
mss вне форума Ответить с цитированием
Старый 31.08.2011, 22:13   #50
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Открываешь словарик русского языка и видишь: анонимный - безымянный, неизвестный.

Окей, положим, что это - технический термин.

Давай посмотрим, что тогда получается.

Статья по ссылке:
1. Вводит термин, не конфликтующий с уже заданными
2. Объясняет, что это на примерах - как подмножество динамических переменных
3. Использует далее

Твои посты:
1. Использует уже занятый и хорошо известный термин в новом смысле
2. Не объясняет термин, его определение, границы его применимости
3. При попытке указать на некорректность использования хорошо знакомого термина начинается возбухание "сам дурак"

Ну и как, есть разница или нет?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чистка памяти чужого процесса Virus25 Общие вопросы Delphi 1 30.05.2011 07:42
Считать значение из памяти чужого процесса EvgenyZ Win Api 2 27.11.2009 09:29
Выполнение адреса памяти чужого процесса XAOC-forever Общие вопросы Delphi 2 15.12.2008 09:03
Дамп процесса Takedown Общие вопросы C/C++ 1 01.08.2008 00:19