Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2010, 19:22
NSS_201 NSS_201 вне форума
Прохожий
 
Регистрация: 09.10.2010
Сообщения: 3
Репутация: 10
По умолчанию Как считать побайтно Partition Table системного диска

Необходимо считать и расшифровать 1ый сектор системного диска (файловая система FAT32), при этом использую стандартный метод хорошо всем известный:
Код:
begin
... 
df := CreateFile(PChar(diskName),
                   GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if df <> 0 then
  begin
   ReadFile (df, buf, 512, reads, nil);
...
end; 
Admin: Не забываем про теги!

Блок параметров биос получается считать расшифровать, всё как нужно, а Partition Table вообще никак не даётся. Я думаю может функция CreateFile не даёт возможность обратиться к первому сектору всего физического диска, а можно только к тому же сектору раздела обратиться? Может знает кто, как к Partition Table обратиться?
(запускаю прогу от имени администратора)

Последний раз редактировалось Admin, 27.11.2010 в 19:36.
Ответить с цитированием
  #2  
Старый 27.11.2010, 19:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У тебя неправильное обращение к диску (его имя).
Должно быть что-то типа '\\.\PhysicalDrive'+s
Ответить с цитированием
  #3  
Старый 27.11.2010, 19:53
NSS_201 NSS_201 вне форума
Прохожий
 
Регистрация: 09.10.2010
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо, только тогда "S" в этой конструкции это имя диска или его номер?
Ответить с цитированием
  #4  
Старый 27.11.2010, 20:01
NSS_201 NSS_201 вне форума
Прохожий
 
Регистрация: 09.10.2010
Сообщения: 3
Репутация: 10
По умолчанию

Оп, кажется я понял. Спасибо Imikle за помощь)
Ответить с цитированием
  #5  
Старый 11.01.2011, 10:06
ShenZN ShenZN вне форума
Прохожий
 
Регистрация: 10.01.2011
Сообщения: 5
Репутация: 10
По умолчанию Считывание с карты памяти

Доброго времени суток!

Возникла похожая проблема. Нужно считать по байтно каждый сектор карты памяти Flash (SD card, micro SD). Так как там записаны данные без использования файловой системы. Посмотрев код первого сообщения и порывшись в интернете написал такую процедуру:
Код:
var
df : THandle;
nb, sector : cardinal;
buf : array [0..512] of cardinal;
// ??? buf: string;
i: integer;
begin
  sector:=512;
  nb:=0;
 df := CreateFile(PChar('\\.\F:'),
                   GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if df <> 0 then
  begin
   SetFilePointer(df, 512, nil, FILE_BEGIN);
   ReadFile (df, buf, sector,nb,nil);
   if (debug) then
    begin
      for i:=1 to 511 do
      begin
      Form5.Memo1.Lines.Add(IntToStr(buf[i]));
      end;
    end;
  end;
  CloseHandle(df);
end;

Подскажите пожалуйста, может я что то не так делаю. При выполнении какие-то данные выводит, но они похожи на мусор. Непонятно так же в какого типа должна быть переменная BUF в функции ReadFile, то есть указатель какого типа. Числовой или строчный. И вообще в каком формате происходит считывание с носителя, нужно получить каждый байт каждого сектора.

Огромное спасибо!
Ответить с цитированием
  #6  
Старый 11.01.2011, 10:30
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  h: THandle;
  buf: array [0..$ffff] of Char;
  dummy: Cardinal;
begin
  h:=CreateFile(
    PChar('\\.\G:'),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    0,
    0
  );
  if h=0 then raise Exception.Create(SysErrorMessage(GetLastError));
  SetFilePointer(h, $0000, nil, FILE_BEGIN);
  if ReadFile(h, buf, SizeOf(buf), dummy, nil) then
    Memo1.Text:=Copy(buf, 1, dummy)
  else
    ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(h);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 11.01.2011, 12:22
ShenZN ShenZN вне форума
Прохожий
 
Регистрация: 10.01.2011
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Код:
var
  h: THandle;
  buf: array [0..$ffff] of Char;
  dummy: Cardinal;
begin
  h:=CreateFile(
    PChar('\\.\F:'),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    0,
    0
  );
  if h=0 then raise Exception.Create(SysErrorMessage(GetLastError));
  SetFilePointer(h, $0000, nil, FILE_BEGIN);
  if ReadFile(h, buf, SizeOf(buf), dummy, nil) then
    Memo1.Text:=Copy(buf, 1, dummy)
  else
    ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(h);
end;

Спасибо за оперативный ответ NumLock.
Прояснилось по поводу типов данных.
Но при выполнении данного кода у меня выводится лишь один символ л. И если я изменяю имя диска на \\.\C: то указывается что неправильный дескриптор, хотя такой логический диск существует. Правильно ли я указываю адрес диска и почему всего один символ выводится, хотя по идеи должно быть $FFFF символов.
Ответить с цитированием
  #8  
Старый 11.01.2011, 13:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Посмотрите, может поможет:
http://kladovka.net.ru/index.cgi?pid=article&rid=1
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 11.01.2011, 13:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

PChar('\\.\PHYSICALDRIVE0') - первый жесткий в системе и работай с массивом байт, строка обрезается по символу #0:
Код:
var
  h: THandle;
  buf: array [0..$ffff] of Byte;
  dummy: Cardinal;
  i: Integer;
begin
  h:=CreateFile(
    PChar('\\.\PHYSICALDRIVE0'),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    0,
    0
  );
  if h=0 then raise Exception.Create(SysErrorMessage(GetLastError));
  SetFilePointer(h, $0000, nil, FILE_BEGIN);
  if ReadFile(h, buf, SizeOf(buf), dummy, nil) then
    for i:=0 to 100 {dummy} do Memo1.Text:=Memo1.Text+'%'+IntToHex(buf[i], 2)
  else
    ShowMessage(SysErrorMessage(GetLastError));
  CloseHandle(h);
end;

ЗЫ. пока отвечал снова опередили
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 11.01.2011, 15:38
ShenZN ShenZN вне форума
Прохожий
 
Регистрация: 10.01.2011
Сообщения: 5
Репутация: 10
По умолчанию

Спасибо огромное, NumLock и Страдалецъ, за помощь! Теперь получилось в том виде котором нужно.
Только теперь возник другой вопрос, как узнать что например диск С: соответствует \\.\PHYSICALDRIVE0 или подключенная flash под буквой F: соответствует \\.\PHYSICALDRIVE1. То есть выбрав в диалоге диск, понять какой это физический диск (PHYSICALDRIVE). Так как указав просто букву логического диска результат получается не тот.

Спасибо!
Ответить с цитированием
  #11  
Старый 21.01.2011, 13:37
ShenZN ShenZN вне форума
Прохожий
 
Регистрация: 10.01.2011
Сообщения: 5
Репутация: 10
По умолчанию

Доброго времени суток!

Осталась проблема в нахождении номера PhisycalDrive в соответствии с буквой логического диска. Поиск в интернете ничего не дал. Помогите, кто сталкивался с решением такой проблемы.

Спасибо!
Ответить с цитированием
  #12  
Старый 24.01.2011, 16:05
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Чисто теоретически, они лежат в реестре: HKLM\SYSTEM\MountedDevices

Тут еще инфа.

Последний раз редактировалось Rat, 24.01.2011 в 16:10.
Ответить с цитированием
  #13  
Старый 25.01.2011, 10:27
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Ходи сюда. Тут есть очень хорошие и главное бесплатные компоненты ля работы с системой. Обрати внимание на MiTeC System Information - он тебе точно поможет в твоей проблеме.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.

Последний раз редактировалось Thrasher, 25.01.2011 в 10:30.
Ответить с цитированием
  #14  
Старый 25.01.2011, 12:59
ShenZN ShenZN вне форума
Прохожий
 
Регистрация: 10.01.2011
Сообщения: 5
Репутация: 10
Радость

Огромное спасибо всем, за ответы!

Вот что было в итоге найдено и обработано из просторов Интернета:

Чтобы увидеть какие в системе вообще подключены физические диски их номер (PHISYCALDRIVE+n), можно воспользоваться такой функцией:

Код:
procedure TForm1.Button18Click(Sender: TObject);
var
  i: Integer;
  NewMenu: TMenuItem;
  PI: TPartInfo;
  PhysicalDrives: TPhysicalDrives;
begin
  GetDrivesInfo(PhysicalDrives);
  for i := 0 to High(PhysicalDrives) do
  begin
    Label42.Caption:=Label42.Caption+'Диск '+ IntToStr(i);
    Label42.Caption:=Label42.Caption+' '+IntToStr(PhysicalDrives[i].PartitionTable[i].NumberOfSects);
  end;

end;

Чтобы заработало нужно подключить библиотеку llinfo, взятую из проекта

Самое главное:
ПОМОГЛА ВОЛШЕБНАЯ БИБЛИОТЕКА Компонентов GLibWMI
У которой огромные возможности по считыванию всех данных о системе в целом. В частности о физических дисках(Номер PHISYCALDRIVE, размер, количество секторов, серийный номер, интерфейс подключения и другие параметры). В архиве идут примеры по которым можно разобраться что к чему.


PS. Вопрос остался открытым:
Каким образом конкретный PHISYCALDRIVE относится к конкретной букве устройства (например PHICALDRIVE1 -> диск F) . Если кто то владеет информацией напишите пожалуйста примерчик или дайте ссылку для решения данной проблемы.

Огромное Спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter