какой есть аналог функции DefineDosDevice в драйвере? Мне нужно примерно следующее: char VolumeName[] = "L:"; char DeviceName[255] = "MyDeviceName"; DefineDosDevice( DDD_RAW_TARGET_PATH, VolumeName, DeviceName); При выполнении данного фрагмента создается в системе диск L, который связывается с MyDeviceName. Как тоже самое сделать в драйвере? Заранее спасибо.
)) а потооом в ринг3 QueryDosDevice\DefineDosDevice для того чтобы в експлорере буква появилась)) в тоталкоммандере сразу появится, а в експлорере только после логоф/логон. ЗЫ: если пишете вирт. диск, то тот подход, который Вы скорее всего выбрали - работать будет, но является тупиковым...
Я знаю. Но насколько я понял, человеку требуется создать символьную ссылку и ничего более. Могу ошибаться, конечно.
Да, требуется создать виртуальный диск. После выполнения DefineDosDevice создается сразу диск в експлорере. И вот мне интересно как тоже самое реализовать в режиме ядра. Я создавал IoCreateSymbolicLink(), с параметром "\DosDevices\L:", но эффекта должного не возымело(требуется чтобы он мгновенно был виден системой. Спасибо.
Насколько мне известно - никак. Обычно, такое делают через broadcast-рассылку сообщения WM_DEVICECHANGE в режиме пользователя. Более подробно здесь.
Написано "создать диск". Ссылка создастся, а вот диск в эксплорере не появится. Вероятно, и правда придется послать сообщение. NtUserSendMessageEx или как там она называется, я забыл. из win32k
Прочитал ссылочку, которую дал x64 и честно говоря кое чего не понял. Аноним предложил использовать функцию рассылки сообщения, которая должна вызываться из user-mode? Если так, то какой смысл?
Смысл тот, что только из ядра сделать то, что ты хочешь, документированным и правильным способом нельзя. Здесь требуется поддержка из режима пользователя. Это если по-хорошему. Ну а если очень хочется по-плохому, то можно вспомнить теневые сервисы и использовать их, в частности, уже упомянутый здесь сервис NtUserSendMessageEx(). Но здесь у тебя будут другие трудности, несравнимо большие, - оно тебе надо? Зачем?
Помнится, 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-шного и т.д.) или флешки. Удачи! Концепцию я вам рассказал))))