Запись на логический диск WriteFile() == ERROR_ACCESS_DENIED (Vista)

Тема в разделе "WASM.WIN32", создана пользователем zaza, 1 окт 2007.

  1. zaza

    zaza New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    4
    Доброго дня!

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

    пишу элементарный код:

    HANDLE h=CreateFileW(L"\\\\.\\D:",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,0);
    SetFilePointer(h,0x80000000-0x400,0,FILE_BEGIN);
    GetLastError();
    VOID *a=VirtualAlloc(0,512,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
    DWORD dwBytes;
    WriteFile(h,a,512,&dwBytes,0);
    GetLastError();

    CreateFile проходит успешно, SetFilePointer тоже.. а вот WriteFile возвращает ERROR_ACCESS_DENIED. При этом, если установить SetFilePointer ближе к началу диска запись может пройти успешно, хотя по моим наблюдениям тоже не всегда.. если открыть диск в WinHex ситуация аналогичная, что и не удивительно ибо механизм такой же. на форумах msdn нашел топики с аналогичной проблемой
    https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=891426&SiteID=1
    https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1581337&SiteID=1&pageid=0

    Решения однако нет. собственно мои изыскания приводят вот к чему.. удалось выяснить что если убить на диске файловую систему, то проблема решается и все работает отлично - запись проходит. Анализировав работу NtCreateFile сделал вывод что такую ошибку (STATUS_ACCESS_DENIED) судя по всему дает вызов IoCallDriver, т.е. низлежащий драйвер.. разобраться дальше не хватает опыта/мозгов.. под вистой ядро отлаживать очень паршиво - пользую Syser - постоянные бсоды и подвисания отладчика (какие то косяки с выводом на экран помоему..). ощущение такое, что какая то служба или драйвер блокирует запись на диск "напрямую так сказать". зачем - для меня загадка, видимо какая то особенность политики безопасности.. вобщем я в замешательстве, кто что знает подскажите плиз?
     
  2. zaza

    zaza New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    4
    на ixbt подсказали локнуть диск DeviceIoControl(..FSCTL_LOCK_VOLUME..), все бы хорошо, но только не хочется диск локать полносью ибо возможно это только если ничего с диска не открыто. LockFile не работает..
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    только на висте такое?
     
  4. zaza

    zaza New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    4
    ага - на висте. на хп все супер работает, что мне и не дает покоя.. честно говоря готов пропатчить драйвер даже (софтина исключительно для себя) знать бы только где защита эта реализована.
     
  5. zaza

    zaza New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    4
    а может какую нить службу достаточно будет отрубить.. нет ли какой тулзы чтобы глянуть какие дрова завязаны в стеке для данного устройства (диска)? может удастся прикинуть на каком уровне access denied сваливается..