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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2023, 14:15   #11
Комиссар Катани
Пользователь
 
Регистрация: 29.12.2012
Сообщений: 21
По умолчанию

Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Код:
else Result:=addr(PhysStruct.pvPhysMemLin);
не?
Не подходит.

Ниже привожу мой новый вариант преобразования сишных функций MapPhysToLin и GetPhysLong, но судя по ApiMonitor буфер заполняется аналогично странно.
Код:
function MapPhysToLin(var PhysStruct: TtagPhysStruct) : PByte;
var
  dwBytesReturned : DWORD;
begin
  if not DeviceIoControl(hDriver,
                         $80102040,
                         @PhysStruct,
                         SizeOf(TtagPhysStruct),
                         @PhysStruct,
                         SizeOf(TtagPhysStruct),
		         dwBytesReturned,nil)
    then Result:=0
      else Result:=PByte(PhysStruct.pvPhysMemLin);
end;
/////////////////////////////////////////////////////////////////////////////////////////////
function GetPhysLong(pbPhysAddr: PByte; var pdwPhysVal: PDWORD) : Boolean;
var
  pdwLinAddr : PDWORD;
  PhysStruct : TtagPhysStruct;
begin
  ZeroMemory(@PhysStruct,SizeOf(PhysStruct));
  PhysStruct.pvPhysAddress:=DWORD(pbPhysAddr);
  PhysStruct.dwPhysMemSizeInBytes:=4;
  pdwLinAddr:=PDWORD(MapPhysToLin(PhysStruct));
  if pdwLinAddr = nil then Result:=False else
  begin
    pdwPhysVal:=pdwLinAddr;
    UnmapPhysicalMemory(PhysStruct);
    Result:=True;
  end;
end;
/////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// Вызов функции GetPhysLong //////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
  dwresult: DWORD;
begin
  GetPhysLong($C0000,dwresult);
  showmessage(inttohex(dwresult,8)); //возвращает какой-то странный (виртуальный) адрес, как правило, вида 0х00XX0000
end;
А вот сами две сишные функции из WinIo32.dll:
Код:
PBYTE _stdcall MapPhysToLin(tagPhysStruct &PhysStruct)
{
	DWORD dwBytesReturned;

	if (!DeviceIoControl(hDriver, IOCTL_WINIO_MAPPHYSTOLIN, &PhysStruct,
		sizeof(tagPhysStruct), &PhysStruct, sizeof(tagPhysStruct),
		&dwBytesReturned, NULL))
	{
		return NULL;
	}
	return (PBYTE)PhysStruct.pvPhysMemLin;
}

bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal)
{
	PDWORD pdwLinAddr;
	tagPhysStruct PhysStruct;

	if (g_Is64BitOS)
	{
		PhysStruct.pvPhysAddress = (DWORD64)pbPhysAddr;
	}
	else
	{
		// Avoid sign extension issues
		PhysStruct.pvPhysAddress = (DWORD64)(DWORD32)pbPhysAddr;
	}

	PhysStruct.dwPhysMemSizeInBytes = 4;

	pdwLinAddr = (PDWORD)MapPhysToLin(PhysStruct);

	if (pdwLinAddr == NULL)
		return false;

	*pdwPhysVal = *pdwLinAddr; //интересно, я правильно перевёл присваивание в своём коде?

	UnmapPhysicalMemory(PhysStruct);

	return true;
}

Последний раз редактировалось Комиссар Катани; 29.08.2023 в 15:41.
Комиссар Катани вне форума Ответить с цитированием
Старый 30.08.2023, 11:59   #12
Комиссар Катани
Пользователь
 
Регистрация: 29.12.2012
Сообщений: 21
По умолчанию

Сам нашёл, сам исправил!

Код:
function GetPhysLong(pbPhysAddr: PByte; var pdwPhysVal: PDWORD) : Boolean;
var
  pdwLinAddr : PDWORD;
  PhysStruct : TtagPhysStruct;
begin
  ZeroMemory(@PhysStruct,SizeOf(PhysStruct));
  PhysStruct.pvPhysAddress:=DWORD(pbPhysAddr);
  PhysStruct.dwPhysMemSizeInBytes:=4;
  pdwLinAddr:=PDWORD(MapPhysToLin(PhysStruct));
  if pdwLinAddr = nil then Result:=False else
  begin
    pdwPhysVal^:=pdwLinAddr^;
    UnmapPhysicalMemory(PhysStruct);
    Result:=True;
  end;
end;
А вот и сам вызов функции:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  InBuffer : Pointer;
  ValueInRAM : DWORD;
begin
  GetMem(InBuffer,4);
  GetPhysLong(Ptr($C0000),PDWORD(InBuffer));
  ValueInRAM:=DWORD(InBuffer^);
  showmessage(inttohex(ValueInRAM,8));
  FreeMem(InBuffer,4);
end;
В итоге физический адрес $C0000 прекрасно отображается в линейное пространство адресов процесса. Всем спасибо за участие!
Комиссар Катани вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение по индексу(свойство чтения и записи) plktre Помощь студентам 0 22.02.2020 20:25
Попытка чтения или записи в защищенную память. zzz6 Общие вопросы C/C++ 2 23.03.2012 20:26
Как открыть для чтения и записи файл без расширения DeDoK Общие вопросы Delphi 4 11.11.2009 22:41
С++. Кеширование чтения\записи файла Vinny Помощь студентам 1 03.06.2009 00:43
Защита HDD от чтения/записи при любых условиях. Air Свободное общение 43 17.05.2009 18:33