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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

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

Всем здравствуйте!
Работаю с физ. диском, как рассчитать указатель для функции 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;
Сектор 103394340 не читается, а 1, 20, 100-й - пожалуйста...
В принципе, с делфи все ясно, но как работает функция _mul я не знаю... Объясните, пожалуйста, недалекому человеку
Hottabych вне форума Ответить с цитированием
Старый 22.04.2010, 19:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

_mul умножение с получением результата как QWord(UINT64)
код такой короткий потому что используется особенности передачи параметров через стандартный режим передачи(register)
а так, просто умножение DWORD и результат это QWORD(eax:edx)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2010, 21:55   #3
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

А переменной HiDWORD присваивается старшие 32 бита?
Я так понимаю, функция SetFilePointer объединяет младшие и старшие биты формируя единое 64 битное число, но есть одно но... если PosHi не 0, то после выполнения функции SetFilePointer ф-я ReadFile возвращает false, в чем может быть причина?
Hottabych вне форума Ответить с цитированием
Старый 22.04.2010, 22:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А переменной HiDWORD присваивается старшие 32 бита?
да
Цитата:
в чем может быть причина?
GetLastError() что говорит?

Код:
SetLastError(0);//для чистоты эксперимента
ReadSector(...);//сами дополните.
ShowMessage(IntToStr(GetLastError()));
например таким образом
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2010, 22:20   #5
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Код:
if ReadFile(hD, Buffer[0], BytesPerSector, BytesRead, nil) then
  Result := true else
ShowMessage(IntToStr(GetLastError));
87 The parameter is incorrect. ERROR_INVALID_PARAMETER
Вот что говорит по этому поводу MSDN
Hottabych вне форума Ответить с цитированием
Старый 22.04.2010, 22:22   #6
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Может хэндл файла портится?
Hottabych вне форума Ответить с цитированием
Старый 22.04.2010, 22:56   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а проверить выводом до и после?(хендл это число)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.04.2010, 23:44   #8
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

С хэндлом все нормально, PosLo и PosHi вычисляются правильно...
Вот собственно про эти 2 параметра:
Цитата:
lDistanceToMove
[in] Младшие 32 бита значения со знаком, устанавливающее число байтов, на которое переместится указатель позиции в файле. Если параметр lpDistanceToMoveHigh - не ПУСТО (NULL), параметры lpDistanceToMoveHigh и lDistanceToMove формируют единое 64-разрядное значение со знаком, которое определяет расстояние продвижения. Если lpDistanceToMoveHigh - ПУСТО (NULL), lDistanceToMove - 32-разрядное значение со знаком. Положительное значение параметра lDistanceToMove продвигает указатель позиции в файле вперед, а отрицательное значение перемещает указатель позиции в файле назад.

lpDistanceToMoveHigh
[in] Указатель на старшие 32 бита 64-разрядного расстояния со знаком, на которое продвигается указатель позиции. Если Вам не нужны эти старшие 32 бита, этот указатель должен быть установлен в ПУСТО (NULL). Если он равен не ПУСТО (NULL), этот параметр также получает и старшее двойное слово (DWORD) нового значения указателя позиции в файле. Для получения дополнительной информации, см. раздел Замечаний ниже в этой статье.
Может со знаком проблемы, перемещает указатель не туда, а readfile потом прочитать не может?
Hottabych вне форума Ответить с цитированием
Старый 23.04.2010, 01:03   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

врятли знак возьмется из ниоткуда...(до старшего бита врятли дойдет умножение)
PosLo,PosHi не получаются ли отрицательными?
есть у меня мысль как сделать...но я считаю её идиотской
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.04.2010, 01:39   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Может проще в отладчике поглядеть, что там передается реально ?
Код:
ReadFile(hD, Buffer[0], BytesPerSector, BytesRead, nil)
Я не очень знаю дельфу, но BytesRead и Buffer[0] тут вроде не указатели...
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция SetFilePointer. Как расчитать адрес? как правильно передать смещение в функцию SetFilePointer? Hottabych Общие вопросы Delphi 3 07.05.2013 20:16
Рассчитать выражение annosinceva Фриланс 11 26.03.2010 22:35
(pascal) Рассчитать значение Y tkp_xx Помощь студентам 2 07.12.2009 01:12
рассчитать объем Exo Microsoft Office Excel 9 28.04.2008 15:03
рассчитать число столбцов c_zurab Microsoft Office Excel 2 17.03.2008 10:50