|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как считать побайтно 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; Блок параметров биос получается считать расшифровать, всё как нужно, а Partition Table вообще никак не даётся. Я думаю может функция CreateFile не даёт возможность обратиться к первому сектору всего физического диска, а можно только к тому же сектору раздела обратиться? Может знает кто, как к Partition Table обратиться? (запускаю прогу от имени администратора) Последний раз редактировалось Admin, 27.11.2010 в 19:36. |
#2
|
|||
|
|||
У тебя неправильное обращение к диску (его имя).
Должно быть что-то типа '\\.\PhysicalDrive'+s |
#3
|
|||
|
|||
Спасибо, только тогда "S" в этой конструкции это имя диска или его номер?
|
#4
|
|||
|
|||
Оп, кажется я понял. Спасибо Imikle за помощь)
|
#5
|
|||
|
|||
Считывание с карты памяти
Доброго времени суток!
Возникла похожая проблема. Нужно считать по байтно каждый сектор карты памяти 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
|
||||
|
||||
Код:
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
|
|||
|
|||
Цитата:
Спасибо за оперативный ответ NumLock. Прояснилось по поводу типов данных. Но при выполнении данного кода у меня выводится лишь один символ л. И если я изменяю имя диска на \\.\C: то указывается что неправильный дескриптор, хотя такой логический диск существует. Правильно ли я указываю адрес диска и почему всего один символ выводится, хотя по идеи должно быть $FFFF символов. |
#8
|
||||
|
||||
Посмотрите, может поможет:
http://kladovka.net.ru/index.cgi?pid=article&rid=1 Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
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
|
|||
|
|||
Спасибо огромное, NumLock и Страдалецъ, за помощь! Теперь получилось в том виде котором нужно.
Только теперь возник другой вопрос, как узнать что например диск С: соответствует \\.\PHYSICALDRIVE0 или подключенная flash под буквой F: соответствует \\.\PHYSICALDRIVE1. То есть выбрав в диалоге диск, понять какой это физический диск (PHYSICALDRIVE). Так как указав просто букву логического диска результат получается не тот. Спасибо! |
#11
|
|||
|
|||
Доброго времени суток!
Осталась проблема в нахождении номера PhisycalDrive в соответствии с буквой логического диска. Поиск в интернете ничего не дал. Помогите, кто сталкивался с решением такой проблемы. Спасибо! |
#13
|
||||
|
||||
Ходи сюда. Тут есть очень хорошие и главное бесплатные компоненты ля работы с системой. Обрати внимание на MiTeC System Information - он тебе точно поможет в твоей проблеме.
Хорошо написанная программа не требует документации ICQ 9-184-668. Последний раз редактировалось Thrasher, 25.01.2011 в 10:30. |
#14
|
|||
|
|||
Огромное спасибо всем, за ответы!
Вот что было в итоге найдено и обработано из просторов Интернета: Чтобы увидеть какие в системе вообще подключены физические диски их номер (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) . Если кто то владеет информацией напишите пожалуйста примерчик или дайте ссылку для решения данной проблемы. Огромное Спасибо! |