Цитата(Albinos_x @ 24.4.2006, 19:33 ) | | Функции Inc() и Dec() изменяют значение корректного приращения. |
Ага, вот в чём фишка! Ну теперь всё понятно, сорри за ламеризм %) Вот решение по навигации в памяти на примере элементарного поиска сигнатуры в файле.
| Код | procedure TForm1.Button1Click(Sender: TObject); const wSign: WORD = $3231; var hFile: THandle; szFileName: PChar; fSize, i, n: DWORD;
hFileMap: THandle; pMemory : Pointer; pPos : Pointer; begin if not OpenDialog1.Execute then Exit;
Memo1.Clear; szFileName := PChar(OpenDialog1.FileName); Edit1.Text := szFileName;
hFile := CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); fSize := GetFileSize(hFile, nil); hFileMap := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil); pMemory := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
n := 0; pPos := pMemory; for i := 0 to fSize - 1 do begin if WORD(pPos^) = wSign then begin n := i; Break; end; Inc(DWORD(pPos)); end;
UnmapViewOfFile(pMemory); CloseHandle(hFileMap); CloseHandle(hFile);
Memo1.Lines.Add('Filesize: ' + IntToStr(fSize)); Memo1.Lines.Add('Founded in: ' + IntToHex(n, 8)); end;
|
|