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