我正在为一台基于Z80的旧机器开发SMB服务器。该机器运行一个非常简单的类似于MS-DOS的操作系统(没有多任务、没有用户概念、仅支持FAT文件系统,不支持Unicode,只支持8.3文件名),并且内存有限,因此我的第一个想法是仅实现SMB核心协议。我将使用TCP传输。
目前,我只有一个非常短的测试代码,它只回复SMB_COM_NEGOTIATE命令,指示所需方言为核心协议("PC NETWORK PROGRAM 1.0")。为了测试它,我尝试从运行Windows 7的计算机连接,通过在地址栏中输入"\\<server IP>"
。我已经用Wireshark验证了服务器接收到了negotiate命令并发送了一个(表面上)正确的响应。
问题:当Windows客户端接收到响应时,它会显示一个通用的“无法访问资源”错误消息(带有错误代码0x80004005),然后什么也不会发生(不会发送任何更多的SMB消息)。我期望会收到SMB_COM_TREE_CONNECT或类似的命令。
我认为可能是Windows 7不支持核心协议(它非常老,并且缺乏任何安全特性),但是,为什么它在negotiate请求中列出核心方言名称呢?也许我漏掉了一些步骤?服务器必须在negotiate响应后发送任何其他数据包吗?
客户端操作系统是Windows 7 Ultimate 64位,并附上以下Wireshark转储的请求和响应,在此请注意过程中是否有任何错误:
请求:
响应:
更新:如果我选择NT LM 0.12方言而不是核心方言,则会从客户端收到SESSION_SETUP_AND_REQUESTX命令。所以显然,核心协议在Windows 7上不受支持。无论如何,欢迎提供额外信息。