WINAPI: невозможно прочитать с основного диска (PhysicalDrive0) [duplicate]

Используйте метод .on() jQuery http://api.jquery.com/on/ для присоединения обработчиков событий к элементу live.

Также с версии 1.9 .live() удаляется.

-2
задан Ðаn 24 March 2017 в 16:05
поделиться

2 ответа

Обязательно я могу читать размеры, не кратные 512.

Это невозможно. Для прямого доступа к диску вы можете читать и записывать кратность размера сектора. Кроме того, вы должны согласовать операции чтения и записи. Это указатель файла должен быть кратным размеру сектора.

Если вы хотите представить интерфейс, который позволяет произвольно искать, читать и писать, тогда вам нужно будет реализовать свою собственную буферизацию поверх выровненный доступ к необработанному диску.

1
ответ дан David Heffernan 18 August 2018 в 20:54
поделиться
  • 1
    msdn.microsoft.com/en-us/library/cc644950 (v = vs.85) .aspx приложение должно отвечать определенным требованиям при работе с файлами, открытыми с помощью FILE_FLAG_NO_BUFFERING. Применяются следующие особенности: • Размер доступа к файлам, включая необязательное смещение файла в структуре OVERLAPPED, если он указан, должен быть для нескольких байтов, который является целым числом, кратным размеру сектора тома. Например, если размер сектора составляет 512 байт, приложение может запрашивать чтение и запись 512, 1024, 1,536 или 2048 байт, но не 335, 981 или 7,171 байт. что, если вы используете FILE_ATTRIBUTE_NORMAL? – nmr 24 March 2017 в 16:30
  • 2
    Буферизация - это функция более высокого уровня, которую вы получаете при работе с томами. Когда вы напрямую обращаетесь к диску, буферизация отсутствует, и вы должны использовать выровненный доступ. – David Heffernan 24 March 2017 в 16:35
  • 3
    Я сначала попытался преобразовать HANDLE в указатель файла, используя функцию _open_osfhandle () и _fdopen (). В основном это работало, но потом я понял, что fseek () и fread () не работают всегда. Например, когда я сделал fseek, «не кратный 512 (положительный), fread не мог начать чтение внутри сектора (он начинался всегда с начала сектора). Однако он работал нормально, если он имел отрицательное смещение. Затем я решил использовать этот подход. Есть ли у вас идеи по чтению байтов, которые НЕ умножают размеры сектора с неформатированного жесткого диска? Я ценю ваши комментарии – nmr 24 March 2017 в 16:56
  • 4
    Я не уверен, как я могу сделать свой ответ более ясным. Я сожалею, что являюсь носителем плохих новостей. Но вам просто нужно принять необходимость согласованного доступа. Если вам нужно представить интерфейс, который не выровнен, добавьте свой собственный уровень буферизации. Я уже все это сказал в ответ. Я снова это сказал. Мне больше нечего добавить. – David Heffernan 24 March 2017 в 17:01

Документация для CreateFile говорит:

Ручки объема могут быть открыты как не кэшированные по усмотрению конкретной файловой системы, даже если неациклированная опция не указана в CreateFile. Вы должны предположить, что все файловые системы Microsoft открывают дескрипторы томов как незашифрованные. Ограничения на некачайный ввод-вывод для файлов также применяются к томам.

Хотя это явно не указано явно, это относится как к дискам, так и к томам.

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

2
ответ дан Harry Johnston 18 August 2018 в 20:54
поделиться
  • 1
    Спасибо, наверное, мне придется написать вспомогательную функцию для SetFilePointerEx (). В идеале я бы хотел, чтобы все было так, как ведут себя fseek () и fread (). Пара вопросов, 1) Я не совсем понимаю разницу между томом и диском. Я предполагаю, что объем является логической формой диска, является ли доступ к диску быстрее, чем доступ к тому? 2) Я также прочитал некоторые люди, так что лучше работать с fread по сравнению с ReadFile (). До тех пор, пока вы используете кеш с ReadFile (), он может быть медленнее, чем fread? – nmr 24 March 2017 в 18:43
  • 2
    fread - это функция библиотеки времени выполнения C, которая в конечном итоге вызывает ReadFile для выполнения фактической работы. Поскольку он буферизует данные в пользовательском режиме, он может работать лучше, чем ReadFile, если вы делаете много небольших чтений. Основное различие между томом, например \\.\C: и приводом \\.\PhysicalDrive0, состоит в том, что диск представляет собой весь жесткий диск, а том представляет один раздел. Вы также разговариваете на другом уровне драйвера, поэтому могут быть некоторые различия в семантике, я не помню детали с головы. – Harry Johnston 24 March 2017 в 22:32
  • 3
    Вы можете, конечно, реализовать свои собственные fread и fseek эквиваленты. Если вы используете Visual Studio, вы даже можете посмотреть исходный код библиотеки времени выполнения C, чтобы узнать, как это делает Microsoft. – Harry Johnston 24 March 2017 в 22:34
Другие вопросы по тегам:

Похожие вопросы: