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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 16:18   #1
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию Функция SetFilePointer. Как расчитать адрес? как правильно передать смещение в функцию SetFilePointer?

Короче, такая проблема:
Пишу программу по восстановлению разделов и данных с NTFS. Проблему изучил, алгоритм набросал, теперь само оно ) ...
Нужно прочитать, допустим, 103394340 сектор, но как правильно передать смещение в функцию SetFilePointer?

Код:
function Mul(a,b: DWORD; var HiDWORD: DWORD): DWORD;
asm
   mul edx
   mov [ecx],edx
end;

function ReadSector(hD: THandle; Sector: DWORD; var Buffer: TSector): boolean;
var
BytesRead,PosLo, PosHi: DWORD;
begin
Result := false;
PosLo := 0;
PosHi := PosLo;
PosLo := mul(Sector,BytesPerSector,PosHi);
SetFilePointer(hD,PosLo,@PosHi,FILE_BEGIN);
if ReadFile(hD, Buffer[0], BytesPerSector, BytesRead, nil) then
  Result := true;
end;
Этот пример я взял из DRKB, но он не работает (вернее работает только в пределах 32-битного смещения), читает не тот сектор.
Хотя бы знать, как работает функция mul...

Последний раз редактировалось Hottabych; 22.04.2010 в 16:20.
Hottabych вне форума Ответить с цитированием
Старый 22.04.2010, 17:34   #2
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Чо, неужели никто не работал с дисками?
Hottabych вне форума Ответить с цитированием
Старый 07.05.2013, 13:38   #3
dance0ff
Пользователь
 
Аватар для dance0ff
 
Регистрация: 04.09.2008
Сообщений: 12
По умолчанию

Гдето видел, что смещение задают функцией int64Rec().Lo и int64Rec().Hi
dance0ff вне форума Ответить с цитированием
Старый 07.05.2013, 20:16   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А зачем такой извращенный код?
И Ваша Mul будет работать правильно только при конкретном компиляторе и с конкретными настройками оптимизатора. Дисковые операции - не тот случай, где нужно экономить инструкции процессора.

В общем, в точности по законам Мерфи: если что-то может не работать, оно не работает (а программа написана так, что не работать как раз может).
Пишите без извращений и все заработает.

Писал программу проверяющую поверхность диска и измеряющую скорость обмена с ним на WinAPI. Писал давно, так что подробностей не помню. Могу лишь засвидетельствовать, что функции WinAPI для доступа к диску работают так, как положено.
Прочитайте документацию по используемым командам и применяйте их, как там написано.
Этого вполне достаточно.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рассчитать указатель SetFilePointer Hottabych Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 20 23.04.2010 16:50
Как передать адрес активной строки в другую таблицу parsn Microsoft Office Excel 2 04.01.2010 23:32
Как передать адрес метода из dll в приложение и присвоить его событию OnClick? puga555 Общие вопросы Delphi 1 22.12.2009 17:04
Вызвать адрес памяти как функцию XAOC-forever Общие вопросы Delphi 18 07.03.2009 20:32
как правильно прописать адрес в функции? (формула) coldis Microsoft Office Excel 3 18.02.2009 09:47