Создание логического диска

Тема в разделе "WASM.WIN32", создана пользователем Euler, 18 июн 2011.

  1. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Подскажите пожалуйста, как программно создать новый логический диск(например создать диск "Z:\", который будет отображать какую-нибудь папку с FTP-сервера). К сожалению не удалось ничего путного нагуглить:dntknw:.
     
  2. llirikov

    llirikov New Member

    Публикаций:
    0
    Регистрация:
    15 май 2011
    Сообщения:
    1
    Оно?
    http://msdn.microsoft.com/en-us/library/aa365238%28v=VS.85%29.aspx

    Функция оттуда (http://msdn.microsoft.com/en-us/library/aa365561%28v=VS.85%29.aspx):
    Код (Text):
    1. Associates a volume with a drive letter or a directory on another volume.
    2.  
    3. BOOL WINAPI SetVolumeMountPoint(
    4.   __in  LPCTSTR lpszVolumeMountPoint,
    5.   __in  LPCTSTR lpszVolumeName
    6. );
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Нет, конечно.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Встроенные средства системы (те, что в Windows 2000 появились), к сожалению, не документированы. Если очень интересно, как это делает сама система, можешь пореверсить модуль netplwiz.dll, в частности, см. функцию CNetworkPlace::CreatePlace(), там всё есть, да и IDA 6.1 исходник вполне себе показывает. Но этот метод не позволяет назначить букву этой виртуальной папке, она так и остаётся всего лишь папкой в оболочке. Чтобы сделать полноценный виртуальный том, который можно примонтировать на букву или типа того, есть несколько путей, но все они так или иначе сводятся к написанию драйвера файловой системы (например, SFTP Net Drive), либо к его эмуляции (например, FTPDrive).

    Если идти по сложному, но более правильному пути, то достаточно написать простейший драйвер с обработчиками файловых запросов типа Create/Close, Read/Write, Query/Set и т.д. и т.п. В ответ на эти запросы драйвер либо сам запрашивает необходимую информацию с сетевого ресурса (через TDI, например), либо перенаправляет запрос управляющему приложению, которое берёт всё реальное сетевое взаимодействие на себя. В случае эмуляции же достаточно создать ссылку типа Z: и указать ей цель что-нибудь типа C:\FtpTemp, где FtpTemp - обычная папка в файловой системе, она может даже и не существовать. Суть в том, что все запросы к этой папке перехватываются, при чём не важно как и где, это может быть драйвер-фильтр файловой системы, или тупо DLL-хуки на переходники в Nt-сервисы ядра из ntdll.dll. Важно, что перехватив соответствующие файловые запросы, мы также сможем эмулировать файловую систему FTP-сервера.
     
  5. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Euler
    Начинай с драйвера...
    Код (Text):
    1.     ntStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &deviceNameUnicodeString, FILE_DEVICE_DISK,0, FALSE, &deviceObject);
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это абсолютная ересь в данном случае.
    Драйвер диска здесь ни чем не поможет.
    Необходимо писать именно драйвер файловой системы.
     
  7. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    x64
    ну да, коонеечно? В total commander по этой строчке кода уже виден диск.... :)
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну зачем врать-то?
    По этой строчке ещё ничего не может быть видно.
     
  9. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    #define DOS_DEVICE_NAME L"\\DosDevices\\G:" //или типа ...X:
    ...
     
  10. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
  11. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Спасибо за развёрнутый ответ. А есть ли хорошая литература на эту тему? У себя нашёл только "Внутреннее устройство Microsoft Windows", там очень хорошо описана архитектура, но практические вопросы там не рассматриваются. Сейчас скачал книгу Солдатова- закончил четвёртую главу, но пока ничего по теме нету.
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вот конкретно про написание виртуальных дисков и сетевых клиентов в ядре книжек я не видел. Наиболее близко книжки Руссиновича рассматривают эти вопросы, но там не решения прикладных, скажем так, задач, а просто описание того, как это работает "изнутри". Ищи по форумам, читай исходники аналогичных продуктов, формулируй и задавай конкретные вопросы, другого пути я не вижу.
     
  13. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    А есть ли такого рода продукты с открытым исходным текстом? Нашёл Ramdisk, хотя он уже устарел(не собирается и не запускается под win7), но лучше чем ничего:).
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Насчёт виртуальных FTP-дисков такого не видел.
    А обычные есть, конечно, - вот тот же HttpDisk посмотри.