mirror of
https://github.com/felixrieseberg/windows95.git
synced 2026-05-09 00:24:09 +00:00
SMB: long filenames, basename-derived share name, synthetic TOOLS share (#352)
Negotiate NT LM 0.12 (17-word response, Capabilities=0) so Win95 switches from CMD_SEARCH (8.3-only) to TRANS2/FIND_FIRST2. Implement info level 0x104 (FILE_BOTH_DIRECTORY_INFO) with the win9x quirks Samba carries: honor SearchCount/MaxDataCount (VREDIR drops the session if exceeded), 4-byte-align entries and the trans2 reply param/data blocks, dir EndOfFile=0, FileName null-terminated with the null counted in FileNameLength, and ShortNameLength=0 (a UCS-2 ShortName in an OEM session GPFs shell32 on the single-directory probe Explorer does when entering a subfolder). Add TRANS2_QUERY_FS_INFO (0x105/1/2), SMB_COM_SEEK and core SMB_COM_READ, which the redirector falls back to with no CAP_LARGE_READX. Sanitize >0xFF / Windows-reserved chars in display names so emoji folder names don't truncate to '<' and wedge Explorer. The user share is now named after path.basename of the mounted folder (LANMAN-safe, ≤12 chars, with TOOLS/IPC$ collision avoided). A second purely-synthetic TOOLS share holds _MAPZ.BAT and README.TXT so they don't clutter the user's directory; treeConnect routes by share name to a TID and every path-resolving handler branches on it so TOOLS never touches the host fs. 48 protocol tests; verified end-to-end in the emulator (browse \\HOST, open both shares, list Downloads with 85+ mixed-name entries, navigate subfolders, open files in Notepad).
This commit is contained in:
@@ -12,10 +12,10 @@ import * as os from "os";
|
||||
import * as path from "path";
|
||||
import { NetBIOSFramer, nbPositiveResponse, nbWrap } from "./netbios";
|
||||
import { setupNbns } from "./nbns";
|
||||
import { SmbSession } from "./server";
|
||||
import { SmbSession, shareNameFor, TOOLS_SHARE } from "./server";
|
||||
|
||||
// SPIKE diagnostics: tee everything to a file so we can debug without DevTools
|
||||
const LOG_FILE = path.join(os.tmpdir(), "windows95-smb.log");
|
||||
const LOG_FILE = process.env.WIN95_SMB_LOG || path.join(os.tmpdir(), "windows95-smb.log");
|
||||
try { fs.writeFileSync(LOG_FILE, `--- ${new Date().toISOString()} ---\n`); } catch {}
|
||||
const origLog = console.log;
|
||||
console.log = (...args: unknown[]) => {
|
||||
@@ -57,7 +57,8 @@ interface V86 {
|
||||
const log = (...a: unknown[]) => console.log("[smb]", ...a);
|
||||
|
||||
export function setupSmbShare(emulator: V86, hostPath: string) {
|
||||
log(`serving ${hostPath} on \\\\HOST\\host (port 139)`);
|
||||
log(`serving ${hostPath} on \\\\HOST\\${shareNameFor(hostPath)} ` +
|
||||
`(+ \\\\HOST\\${TOOLS_SHARE}) port 139`);
|
||||
|
||||
// SPIKE diagnostic: count every ethernet frame so we know if the NIC is
|
||||
// emitting anything at all (DHCP, ARP, anything). Logged on a timer so
|
||||
|
||||
Reference in New Issue
Block a user