Аналог функции DefineDosDevice в драйвере

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 26 фев 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    какой есть аналог функции DefineDosDevice в драйвере?
    Мне нужно примерно следующее:
    char VolumeName[] = "L:";
    char DeviceName[255] = "MyDeviceName";
    DefineDosDevice( DDD_RAW_TARGET_PATH, VolumeName, DeviceName);

    При выполнении данного фрагмента создается в системе диск L, который связывается с MyDeviceName.
    Как тоже самое сделать в драйвере?
    Заранее спасибо.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    IoCreateSymbolicLink()
     
  3. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    )) а потооом в ринг3 QueryDosDevice\DefineDosDevice для того чтобы в експлорере буква появилась)) в тоталкоммандере сразу появится, а в експлорере только после логоф/логон.

    ЗЫ: если пишете вирт. диск, то тот подход, который Вы скорее всего выбрали - работать будет, но является тупиковым...
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Какой подход и почему тупиковый?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    x64
    Не совсем, еще надо уведомить эксплорер о том, что появился диск.
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я знаю. Но насколько я понял, человеку требуется создать символьную ссылку и ничего более. Могу ошибаться, конечно.
     
  7. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Да, требуется создать виртуальный диск. После выполнения DefineDosDevice создается сразу диск в експлорере. И вот мне интересно как тоже самое реализовать в режиме ядра. Я создавал IoCreateSymbolicLink(), с параметром "\DosDevices\L:", но эффекта должного не возымело(требуется чтобы он мгновенно был виден системой. Спасибо.
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Насколько мне известно - никак. Обычно, такое делают через broadcast-рассылку сообщения WM_DEVICECHANGE в режиме пользователя. Более подробно здесь.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Написано "создать диск". Ссылка создастся, а вот диск в эксплорере не появится.
    Вероятно, и правда придется послать сообщение. NtUserSendMessageEx или как там она называется, я забыл. из win32k
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Можно всё это возложить на плечи csrss.exe.
    Только недокументировано и осезависимо будет.
     
  11. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Прочитал ссылочку, которую дал x64 и честно говоря кое чего не понял.
    Аноним предложил использовать функцию рассылки сообщения, которая должна вызываться из user-mode? Если так, то какой смысл?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    При большом желании рассылку можно и из драйвера организовать
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    >При большом желании рассылку можно и из драйвера организовать
    Ну там есть пара подводных камней.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Смысл тот, что только из ядра сделать то, что ты хочешь, документированным и правильным способом нельзя. Здесь требуется поддержка из режима пользователя. Это если по-хорошему. Ну а если очень хочется по-плохому, то можно вспомнить теневые сервисы и использовать их, в частности, уже упомянутый здесь сервис NtUserSendMessageEx(). Но здесь у тебя будут другие трудности, несравнимо большие, - оно тебе надо? Зачем?
     
  15. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Всем спасибо. Энтузиазм почти пропал))
     
  16. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Помнится, Great и x64 меня в свое время тоже на WM_DEVICECHANGE посылали)))

    Вы пытаетесь сделать драйвер виртуального тома.
    Т.е. из этого следует, что надо обрабатывать портянку IOCTL_DISK_..., IOCTL_STORAGE_... и т.д., чтение/запись через IRP_MJ_READ/IRP_MJ_WRITE, так ?

    В этом случае вам надо в проге(если вы конечно пользуетесь прогой), в которой вы создаете диски, делать(как я уже говорил) QueryDosDevice\DefineDosDevice , тем самым вы известите эксплорер о сущ-нии такой ссылки.

    варианты:
    1) Оставить концепцию драйвера виртуального тома, но почитать про MountPointManager и его IOCTL_MOUNTMGR_... и IOCTL_MOUNTDEV_...
    Проверено - будет работать.

    2) Прочитав про PNP-Manager ы 0 и 3 кольца, про его IRP_MJ_PNP, а также про IoInvalidateDeviceRelations(), IoInvalidateDeviceState(), и до кучи про SCSI-протокол, можно засесть в стеке под disk.sys. Насколько глубже - не суть важно, но чем глубже - тем лучше(и тем больше SCSI). Результат - полная имитация диска(USB-шного, IDE-шного и т.д.) или флешки.
    Удачи! Концепцию я вам рассказал))))