Я начал разработку SMB-сервера для старой машины на базе Z80. Это машина работает с очень простой операционной системой, подобной MS-DOS (без многозадачности, без концепции пользователей, только файловая система FAT, без Unicode, только имена файлов 8.3) и имеет ограниченную память, поэтому моя первая идея - реализовать только основной протокол SMB. Я буду использовать транспорт TCP.
На данный момент у меня есть только очень короткий тестовый код, который просто отвечает на команду SMB_COM_NEGOTIATE, указывая, что основной протокол («PC NETWORK PROGRAM 1.0») является желаемым диалектом. проверьте это, я пытаюсь подключиться с компьютера Windows 7, открыв окно проводника и набрав «\\
в адресной строке. Я проверил с помощью Wireshark, что сервер получает согласование команда и отправляет (очевидно) правильный ответ.
Проблема: , как только Windows c Клиент получает ответ, он показывает типичное сообщение об ошибке «Невозможно получить доступ к ресурсу» (с кодом ошибки 0x80004005), а затем ничего не происходит (дальнейшие сообщения SMB не отправляются). Я ожидал получить SMB_COM_TREE_CONNECT или аналогичную команду.
Я подумал, что, возможно, Windows 7 не поддерживает основной протокол (он очень старый и в нем отсутствуют какие-либо функции безопасности), но тогда почему в запросе согласования указано имя основного диалекта? Может, я пропускаю какой-то шаг? Должен ли сервер отправлять какие-либо дополнительные пакеты после ответа согласования?
Клиентская ОС - это Windows 7 Ultimate 64 бит, и вот дампы Wireshark запроса и ответа на тот случай, если кто-то может обнаружить что-то не так в процессе:
Запрос:
Ответ:
ОБНОВЛЕНИЕ: Если я выберу диалект NT LM 0.12 вместо основного диалекта, я получаю от клиента команду SESSION_SETUP_AND_REQUESTX. Таким образом, очевидно, что действительно основной протокол не поддерживается Windows 7. В любом случае, любая дополнительная информация будет принята с благодарностью.