Короче говоря, моя программа позволяет хэшировать вещи. Единственное, чего в настоящее время ему не хватает, — это возможности хешировать физические диски в версии для Windows (версия для Linux позволяет пользователю выбирать /dev/sda и т. д.).
Я создал кнопку, которая при нажатии отображает список подключенных устройств, чтобы дать мне "\.\PHYSICALDISKX" (благодаря предложениям пользователей SO в ответ на мои предыдущие сообщения). Затем я могу передать это значение функции Windows API CreateFile, когда пользователь дважды щелкнет по нему, чтобы создать для него дескриптор как событие двойного щелчка ListBox. Итак, я сделал все это. Код ниже относится.
Тем не менее, я хочу проверить, работает ли установленный мной дескриптор CreateFile — оператор if предполагает, что это так, но мне нужно проверить, действительно ли я могу читать данные для передачи другим моим функциям. Чтобы проверить это, я пытаюсь прочитать первые 512 байт любого заданного диска и «быстро» отобразить его в блоке заметок. Тем не менее, я не могу в жизни понять, почему мой вывод неверен, а это так. Я получаю некоторые шестнадцатеричные значения, но это не те шестнадцатеричные значения, которые присутствуют в первых 512 байтах. И это всегда один и тот же список шестнадцатеричных значений, независимо от того, на какой диск я смотрю! Поэтому я понятия не имею, откуда берутся эти значения или почему они всегда одинаковы. Вся идея заключается в том, чтобы я проверил, что мой дескриптор в порядке, и что я действительно могу читать данные с диска, чтобы затем передать их своим функциям хеширования.
Кто-нибудь может увидеть, где я ошибаюсь, пожалуйста?
procedure TForm1.ListBox1DblClick(Sender: TObject);
var
listBox : TListBox;
index : Integer;
hDiskToHash, i : integer;
DiskHashValue, DiskToHashFileName, TmpStr : string;
RawMBR : array [0..511] of byte;
bytesread : DWORD;
begin
i := 0;
// Cast the passed object to its correct type
listBox := TListBox(Sender);
// Get the index of the selected list item
index := listBox.ItemIndex;
// Display the selected list item value
ShowMessage(listBox.Items[index]);
// sValue1 is a global variable containing string '\\.\PHYSICALDISKX', populated by procedure TForm1.GetWin32_DiskDriveInfo;
hDiskToHash := Windows.CreateFile(PChar(sValue1), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
if hDiskToHash <> INVALID_HANDLE_VALUE then
begin
SetFilePointer(hDiskToHash,512 * 0,nil,FILE_BEGIN); // replace 0 with sector that you wish to read
ReadFile(hDiskToHash, RawMBR[0], SizeOf(RawMBR), bytesread, nil);
for i := Low(RawMBR) to High(RawMBR) do
begin
Memo2.Lines.Add(IntToHex(RawMBR[i],2)); // Add each hex byte on a new line
end;
CloseHandle(hDiskToHash);
end
else
begin
ShowMessage('Failed to open '+sValue1);
end;
end;
IOCTL_DISK_GET_PARTITION_INFO
- person RRUZ   schedule 02.02.2012GENERIC_READ
, @Rruz. - person Rob Kennedy   schedule 02.02.2012ReadFile
возвращает ноль. Следующий шаг — позвонитьGetLastError
, чтобы узнать, что пошло не так. В документации так сказано. Вы получите код ошибки. Найдите этот номер в таблицах в MSDN. Кроме того, не забудьте использовать символ @ перед нашими именами, чтобы мы были уведомлены, когда вы ответите нам. - person Rob Kennedy   schedule 02.02.2012