Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Програмка для тестирования памяти


Автор: ST_Falcon 20.3.2005, 13:28
Нужно очень быстро сделать элементарную програмку для тестирования памяти. Есть куча алгоритмов... И все. Не знаю что делать дальше smile.
Посмотрел функции ВинАпи для работы с памятью... Очень скудный наборчик...
Кто что посоветует?

Автор: p0s0l 20.3.2005, 16:56
Если иметь права админа, то можно юзать секцию PhysicalMemory, с помощью которой можно получить доступ к физической памяти...
Вот небольшой примерчик:
Код

uses JwaWinType, JwaWinBase, JwaWinNT, JwaAclApi, JwaAccCtrl;

const
  PhysMemDevName = '\Device\PhysicalMemory';

  PhysMemName : UNICODE_STRING = (
    Length        : Length(PhysMemDevName) * SizeOf(WideChar);
    MaximumLength : Length(PhysMemDevName) * SizeOf(WideChar);
    Buffer        : PhysMemDevName;
  );

  PhysMemAttr : TObjectAttributes = (
    Length                   : SizeOf(PhysMemAttr);
    RootDirectory            : 0;
    ObjectName               : @PhysMemName;
    Attributes               : OBJ_CASE_INSENSITIVE;
    SecurityDescriptor       : nil;
    SecurityQualityOfService : nil;
  );

  FullAccess : EXPLICIT_ACCESS = (
    grfAccessPermissions : SECTION_ALL_ACCESS;
    grfAccessMode        : GRANT_ACCESS;
    grfInheritance       : NO_INHERITANCE;
    Trustee : (
      pMultipleTrustee         : nil;
      MultipleTrusteeOperation : NO_MULTIPLE_TRUSTEE;
      TrusteeForm              : TRUSTEE_IS_NAME;
      TrusteeType              : TRUSTEE_IS_USER;
      ptstrName                : 'CURRENT_USER';
    );
  );

function NtOpenSection(SectionHandle: PHANDLE; DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES): NTSTATUS; stdcall; external 'ntdll.dll' name 'NtOpenSection';

procedure TForm1.FormCreate(Sender: TObject);
var
  hSection : THandle;
  MappedAddress : Pointer;
  Adr : PByte;
  PhysicalAddress, MemorySize : Int64;
  Size : DWORD;
  SectionAcl : PACL;
  Errors : integer;
  i : integer;
  b1, b2, b3 : byte;

begin
// разрешаем полный доступ к секции
  NtOpenSection (@hSection, WRITE_DAC, @PhysMemAttr);
  SetEntriesInAcl (1, @FullAccess, nil, SectionAcl);
  SetSecurityInfo (hSection, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, SectionAcl, nil);
  CloseHandle (hSection);
  LocalFree (Cardinal(SectionAcl));

// открываем секцию на чтение и запись
  NtOpenSection (@hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, @PhysMemAttr);

  PhysicalAddress := 0;       // Физ. адрес начала сканирования
  MemorySize := 1*1024*1024;  // Размер проверяемой памяти (1 мегабайт)
  Size := 4096;               // Размер отображаемой области (1 страница)
  Errors := 0;                // Кол-во ошибок

  repeat
// Проецируем физ. область памяти в виртуальное пространство процесса
    MappedAddress := MapViewOfFile(hSection, SECTION_MAP_READ or SECTION_MAP_WRITE, PhysicalAddress shr 32, Cardinal(PhysicalAddress), Size);

    Sleep (0);
    Adr := MappedAddress;
    for i := 0 to Size-1 do
    begin
      b1 := Adr^;         // читаем байт
      Adr^ := b1 xor $FF; // записываем инвертированное значение
      b2 := Adr^;         // читаем байт
      Adr^ := b1;         // записываем исходный байт
      b3 := Adr^;         // читаем байт

      if (b1 <> b3) or (b2 <> (b1 xor $FF)) then Inc(Errors);
      Inc (Adr);
    end;

    UnmapViewOfFile (MappedAddress);
    Inc (PhysicalAddress, Size);
  until PhysicalAddress >= MemorySize;

  CloseHandle (hSection);

  ShowMessage ('Обнаружено ошибок: ' + IntToStr(Errors));
end;


Мне не охото было выдирать определения типов и констант... Поэтому скачай Jedi WinAPI...

Автор: p0s0l 20.3.2005, 16:57
Перенесенно из раздела Delphi

Автор: ST_Falcon 21.3.2005, 00:59
p0s0l
это на всю память? или только на свободную? если только на свободную, то что делать с памятю которую занимает ося??

Автор: p0s0l 21.3.2005, 02:11
Это физическая память - то бишь тут и занятая и не занятая...
А чего с ней делать ? Тестировать smile
Иначе что за тест такой будет, который не всю память шарит ?...

Автор: FDum 26.11.2012, 17:17
Ребят можете рассказать как это все скомпилировать.
мне задали курсовой на делфях,
а я даже не знаю с какой строки начинается написание программ в Delphi(

Автор: northener 27.11.2012, 01:07
Цитата(FDum @  26.11.2012,  17:17 Найти цитируемый пост)
Ребят можете рассказать как это все скомпилировать.
мне задали курсовой на делфях,
а я даже не знаю с какой строки начинается написание программ в Delphi( 

Для решения курсовых и прочих учебных задач есть http://forum.vingrad.ru/Vingrad-help-center.html.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)