Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 23.04.2022
Сообщений: 45

Чтение сектора

13.03.2023, 10:38. Показов 1539. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день! Требуется написать программу, которая будет читать сектора диска и выводить данные на экран для пользователя. Не могу понять где и в чем моя ошибка, так как hFile не создается и постоянно выводится сообщение об ошибке доступа.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function __Mul(a,b: DWORD; var HiDWORD: DWORD): DWORD; // Result = LoDWORD
asm
   mul edx
   mov [ecx],edx
end;
 
function ReadSectors(drive:char;StartingSector, SectorCount: DWORD;
                       Buffer: Pointer; BytesPerSector: DWORD): DWORD;
var
   hFile: THandle;
   br,TmpLo,TmpHi: DWORD;
begin
     Result := 0;
     hFile:=CreateFile(PChar('\\.\'+Drive+':'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_WRITE or FILE_SHARE_READ,
                        nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
     if hFile = INVALID_HANDLE_VALUE then
      Exit;
     TmpLo:=__Mul(StartingSector,BytesPerSector,TmpHi);
     if SetFilePointer(hFile,TmpLo,@TmpHi,FILE_BEGIN) = TmpLo then
      begin
           SectorCount:=SectorCount*BytesPerSector;
           if ReadFile(hFile,Buffer^,SectorCount,br,nil) then
            Result:=br;
      end;
     CloseHandle(hFile);
end;
{-----------------------------ПРОЧИТАТЬ СЕКТОР---------------------------------}
procedure TForm1.ReadSectorBtnClick(Sender: TObject);
var
   buf:array of byte;
   i,j:integer;
   drive:char;
begin
     drive:=Drivecombobox1.drive;
     SetLength(buf,512);
     if ReadSectors(drive,strtoint(edit1.text),1,pointer(buf),512)=0 then
      showmessage('Ошибка доступа')
     else
      begin
           StringGrid1.RowCount:=round(length(buf)/15)-1;
           for i:=0 to round(length(buf)/16) do
            StringGrid1.Cells[0,i+1]:=inttohex(i*16,3);
           for i:=1 to round(length(buf)/16) do
            for j:=1 to 16 do
             StringGrid1.Cells[j,i]:=IntToHex(buf[16*(i-1)+j-1],2);
      end;
      Finalize(buf);
end;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2023, 10:38
Ответы с готовыми решениями:

Сектора
https://www.cyberforum.ru/delphi-beginners/thread298707.html Вот такая задача мне нужна, но я не могу ее запустить. Я этот код...

Задача на нахождение суммы элементов определенного сектора
Задача состоит в том, чтобы найти сумму элементов определенного сектора квадратной матрицы. Попытался найти сумму элементов для 5 сектора,...

Как в Delphi 7 сделать круг разделенный на сектора различного цвета
Как в Delphi 7 сделать круг разделенный на сектора различного цвета. И чтобы по нажатию кнопки происходила подсветка сектора. За 3-5 сек...

1
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,328
13.03.2023, 12:14
Лучший ответ Сообщение было отмечено Pryahiiina как решение

Решение

Зачем OVERLAPPED? И на запись не нужно открывать, и открывается существующий файл:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function ReadSectors(drive:char;StartingSector, SectorCount: DWORD;
                       Buffer: Pointer; BytesPerSector: DWORD): DWORD;
var
   hFile: THandle;
   br,TmpLo,TmpHi: DWORD;
begin
     Result := 0;
     hFile:=CreateFile(PChar('\\.\'+Drive+':'), GENERIC_READ, FILE_SHARE_WRITE or FILE_SHARE_READ,
                        nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
     if hFile = INVALID_HANDLE_VALUE then
      Exit;
     TmpLo:=__Mul(StartingSector,BytesPerSector,TmpHi);
     if SetFilePointer(hFile, TmpLo, @TmpHi, FILE_BEGIN) = TmpLo then
      begin
           SectorCount:=SectorCount*BytesPerSector;
           if ReadFile(hFile, Buffer^, SectorCount, br, nil) then
            Result:=br;
      end;
     CloseHandle(hFile);
end;
И буфер так надо передать:
Delphi
1
     if ReadSectors(drive, StrToInt(edit1.text), 1, @buf[0], 512) = 0 then
Добавлено через 6 минут
Ну и запускать надо под админом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2023, 12:14
Помогаю со студенческими работами здесь

Пиксельная закраска окружности разделенной на 3 сектора под 120 градусов
собственно такая проблема,разделить круг\окружность на 3 сегмента под 120 градусов без разницы как,вот мой код формула окружности...

Как закрасить сектора круга между внутренним и внешним радиусами?
Имеем координаты центра круга X0, Y0, начальный и конечный угол сектора Alfa1, Alfa2, внутренний и внешний радиус r1 и R2. with...

Вычислить количество точек на графике функции, попадающих внутрь сектора
окружности с радиусом r и с центром в точке (х_0, у_0) . Одна сторона сектора параллельна ОХ, угол сектора 45 градусов.

Как вычислить площадь сектора и сегмента по заданному центральному углу, подскажите пожалуйста
Нужно реализовать класс окружностей по координатам центра и радиусу. И вычислить площадь сектора и сегмента по заданному центральному...

Чтение Сектора
Прочитал сектора в которых находится корневой каталог, как получить название файлов и папок находящиеся в этом каталоге?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru