Ошибка WriteFile # 5 «отказано в доступе» под win Vista / seven - PullRequest
7 голосов
/ 30 августа 2010

Я много гуглил и не нашел ответа на эту проблему ...

У меня есть консольное приложение C ++, которое читает SD-карту объемом 1 ГБ, которая исправляет неправильно закрытые файлы и записывает таблицу FAT соответственно,SD-карта вначале записывается с помощью прошивки на заказном устройстве.Он работал нормально до Xp и перестал работать в Win Vista / 7.Я попытался повысить привилегии: в рамках типа учетной записи администратора я запустил окно cmd, используя метод «Запуск от имени администратора», но безуспешно.Я также попытался с манифестом, запрашивающим самые высокие доступные привилегии, но не повезло.

Я прочитал в одном посте, что «Windows Vista вообще не позволяет вам получать доступ к дискам из процессов пользовательского режима.Кто-нибудь знает о каком-либо способе обойти это поведение?

Я работаю в обходной путь, однако я хотел бы знать, если это невозможно или нет

Редактировать:

Это мой первый пост здесь, так что я не совсем понимаю о проблеме со ссылками ... Но я вообще не связан со спамом ... просто спрашиваю на сайте, управляемом сообществом:)

Код выглядит так:

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 

Затем я читаю информацию BTB с SD и ищу и неправильно закрыл файл.

Наконец, при попытке записи на SD

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)

Я получил отказ в доступе (ошибка № 5)

Строка в CreateFile () - \. \ G: поскольку данная буква соответствует SD-карте на моем компьютере.Все это работает хорошо, и, как я уже говорил, это работает на XP.Я также пытался использовать: DeviceIoControl с FSCTL_LOCK_VOLUME, но это выдает ошибку памяти.

Надеюсь, что это помогает понять и спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Я думаю, это связано со строкой пути "buffer"; Я столкнулся с той же проблемой. Путь, который вы используете для получения доступа к устройству, должен выглядеть примерно так: "\\. \ PhysicalDrive% d" % d - десятичное число диска.

В Vista эта строка чувствительна к регистру. Проверьте орфографию. Вам также нужны права администратора, как и раньше в XP.

Для томов. Письмо нужно капитализировать например "\\ \ G:".

Также обратите внимание, что гораздо лучше получить доступ к SD-карте как к устройству, а не как тому, поскольку, если Windows монтирует ее, возможно, файловая система смонтирована с кешем записи.

Более того: я забыл упомянуть, что буфер для чтения / записи данных в / из должен быть выровнен по странице и должен быть кратен размеру сектора. VirtualAlloc () делает это

0 голосов
/ 26 января 2012

Вы должны отключить том перед записью необработанных данных.

Из MSDN:

Запись на дескриптор тома будет успешной, если на томе нет смонтированной файловой системы или если выполняется одно из следующих условий:

  • Секторы для записи являются загрузочными секторами.
  • Секторы, которые должны быть записаны для размещения вне пространства файловой системы.
  • Вы явно заблокировали или отключили том с помощью FSCTL_LOCK_VOLUME или FSCTL_DISMOUNT_VOLUME.
  • Том не имеет фактической файловой системы. (Другими словами, на нем смонтирована файловая система RAW.)

Запись на дескриптор диска будет успешной, если выполняется одно из следующих условий:

  • Секторы, которые должны быть записаны, не попадают в пределы объема.
  • Секторы, которые должны быть записаны, попадают в подключенный том, но вы явно заблокировали или отключили том с помощью FSCTL_LOCK_VOLUME или FSCTL_DISMOUNT_VOLUME.
  • Секторы, подлежащие записи, попадают в том, в котором нет подключенной файловой системы, кроме RAW.

Пример кода :

BOOL bResult = DeviceIoControl(hDevice,                // device to be queried
                               FSCTL_DISMOUNT_VOLUME,  // operation to perform
                               NULL, 0,                // no input buffer
                               pdg, sizeof(*pdg),      // output buffer
                               &junk,                  // # of bytes returned
                               (LPOVERLAPPED)NULL);    // synchronous I/O
...