我已经开始为基于 Z80 的旧机器开发 SMB 服务器。这台机器运行一个非常简单的类似 MS-DOS 的操作系统(没有多任务,没有用户概念,只有 FAT 文件系统,没有 unicode,只有 8.3 文件名)并且内存有限,因此我的第一个想法是只实现 SMB 核心协议. 我将使用 TCP 传输。
至于现在,我只有一个非常简短的测试代码,它只是回复 SMB_COM_NEGOTIATE 命令,表明核心协议(“PC NETWORK PROGRAM 1.0”)是所需的方言。为了测试它,我尝试通过打开资源管理器窗口并"\\<server IP>"
在地址栏中输入来从 Windows 7 机器进行连接。我已经用 Wireshark 验证了服务器收到了协商命令并发送了(显然)正确的响应。
问题:一旦 Windows 客户端收到响应,它就会显示一条通用的“无法访问资源”错误消息(错误代码为 0x80004005),然后什么也没有发生(不再发送 SMB 消息)。我期待收到 SMB_COM_TREE_CONNECT 或类似的命令。
我在想,也许 Windows 7 不支持核心协议(它很老,而且它缺乏任何安全功能),但是,为什么它在协商请求中列出核心方言名称?也许我错过了一些步骤?服务器必须在协商响应后发送任何额外的数据包吗?
客户端操作系统是 Windows 7 Ultimate 64 位,这里是请求和响应的 Wireshark 转储,以防任何人在此过程中发现任何错误:
请求:
响应:
更新:如果我选择 NT LM 0.12 方言而不是核心方言,我会收到来自客户端的 SESSION_SETUP_AND_REQUESTX 命令。显然,Windows 7 似乎确实不支持核心协议。无论如何,任何额外的信息将不胜感激。