Преобразование функции Delphi в C ++ GetModuleBase? - PullRequest
1 голос
/ 16 февраля 2010

Я не волшебник Delphi, но я нашел эту функцию на плате, и она мне очень нужна для C ++. Есть ли кто-нибудь, кто достаточно хорошо знает Delphi и C ++, чтобы преобразовать ее?

function GetModuleBase(hProcID: Cardinal; lpModName: PChar):Cardinal;
var
  hSnap: Cardinal;
  tm: TModuleEntry32;
begin
  result := 0;
  hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, hProcID);
  if hSnap <> 0 then
  begin
    tm.dwSize := sizeof(TModuleEntry32);
    if Module32First(hSnap, tm) = true then
    begin
      while Module32Next(hSnap, tm) = true do
      begin
        if lstrcmpi(tm.szModule, lpModName) = 0 then
        begin
          result := Cardinal(tm.modBaseAddr);
          break;
        end;
      end;
    end;
    CloseHandle(hSnap);
  end;
end;

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

Следующее не проверено, но должно быть близко:

#include <windows.h>
#include <tlhelp32.h>

byte *getModuleBase(DWORD hProcId, TCHAR *lpModName)
{
    byte *result = NULL;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, hProcId);

    if (hSnap)
    {
        MODULEENTRY32 tm;
        tm.dwSize = sizeof(MODULEENTRY32);

        if (Module32First(hSnap, &tm))
        {
            while (Module32Next(hSnap, &tm))
            {
                if (lstrcmpi(tm.szModule, lpModName) == 0)
                {
                    result = tm.modBaseAddr;
                    break;
                }
            }
        }

        CloseHandle(hSnap);
    }

    return result;
}

Обратите внимание, что этот код не проверяет имя первого модуля. Если вы тоже хотите проверить первый модуль, вы можете попробовать что-то вроде этого:

if (Module32First(hSnap, &tm))
{
    do 
    {
        if (lstrcmpi(tm.szModule, lpModName) == 0)
        {
            result = tm.modBaseAddr;
            break;
        }
    }
    while (Module32Next(hSnap, &tm));
}
0 голосов
/ 16 февраля 2010

вы также можете использовать WinAPI GetModuleHandle или GetModuleHandleEx , они делают то же самое (и, вероятно, безопаснее, чем у вас), вы просто бросаете HANDLE в BYTE * или DWORD или что еще нужно

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