Подскажите пожалуйста, как программно создать новый логический диск(например создать диск "Z:\", который будет отображать какую-нибудь папку с FTP-сервера). К сожалению не удалось ничего путного нагуглить.
Оно? 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): Associates a volume with a drive letter or a directory on another volume. BOOL WINAPI SetVolumeMountPoint( __in LPCTSTR lpszVolumeMountPoint, __in LPCTSTR lpszVolumeName );
Встроенные средства системы (те, что в 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-сервера.
Euler Начинай с драйвера... Код (Text): ntStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &deviceNameUnicodeString, FILE_DEVICE_DISK,0, FALSE, &deviceObject);
Это абсолютная ересь в данном случае. Драйвер диска здесь ни чем не поможет. Необходимо писать именно драйвер файловой системы.
Спасибо за развёрнутый ответ. А есть ли хорошая литература на эту тему? У себя нашёл только "Внутреннее устройство Microsoft Windows", там очень хорошо описана архитектура, но практические вопросы там не рассматриваются. Сейчас скачал книгу Солдатова- закончил четвёртую главу, но пока ничего по теме нету.
Вот конкретно про написание виртуальных дисков и сетевых клиентов в ядре книжек я не видел. Наиболее близко книжки Руссиновича рассматривают эти вопросы, но там не решения прикладных, скажем так, задач, а просто описание того, как это работает "изнутри". Ищи по форумам, читай исходники аналогичных продуктов, формулируй и задавай конкретные вопросы, другого пути я не вижу.
А есть ли такого рода продукты с открытым исходным текстом? Нашёл Ramdisk, хотя он уже устарел(не собирается и не запускается под win7), но лучше чем ничего.
Насчёт виртуальных FTP-дисков такого не видел. А обычные есть, конечно, - вот тот же HttpDisk посмотри.