On at 2023-02-22 01:05 +0000, Yll Buzoku wrote:
Hi Aitor,

Preface:

The following holds true for PC-DOS 3.3, though I have no reason to suspect anything I say holds any different for any DOS version from 3.1 onwards.

The LoL, SDA, CDS, and SFT layouts differ somewhat between MS-DOS versions 3.x, 4.x, and 5.x I believe. And a few calls (like the 2F.11 service to implement 21.6C Extended Open/Create) are version-specific.

My understanding of what is expected of the redirector interface is due to having disassembled the DOS 3.3 kernel to understand how it works and may not be 100% accurate. Also, DOS 3.0 has some unique quirks but as far as the following is concerned, I suspect it works more or less the same as later DOS versions. DOS versions before that had no redirector interface.

DOS has two 128-byte buffers in the Swappable Data Area. Initially, on a file-based request, such as AH=3Dh (OPEN), DOS will parse the passed filename into one of these buffers and place a pointer to it in another SDA variable. This parsing routine expects 8.3 names at all stages in the pathname except at the very beginning where if the pathname begins with \\ DOS understands this as referencing a path on a network machine and allows a valid MS-NET machine name as the first component of the path.

FCB functions work like this too, but the way DOS handles them is a bit more convoluted, though you can imagine FCB handling by DOS as converting the FCB request to a normal file request, then proceeding as normal and at the end synchronising the FCB fields before returning control back to the application. Of course, you can only act upon files on drives with drive letters when using FCBs.

If the parsing routine ascertains that the request is to be run on a network drive, either due to a \\ pathname specification or due to a drive letter being specified that refers to a registered, mounted network drive (see CDS Flags to see how this is determined), DOS will, at the point of the file operation, redirect the call to the relevant Int 2Fh AH=11xxh Network Redirector function (RBIL has these more or less completely listed) for the DOS call made. For example, for OPEN (AH=3Dh), DOS will call Int 2Fh AX=1116h. Note that most calls don't work with a machine name (as most calls require a CDS and those only exist for drives). For example, OPEN will fail if you pass a filename beginning with a "\\".  On the other hand, CREATE (AH=3Ch) works for both cases.

Once control is transferred to the network redirector, it is then expected to extract the pointer to the parsed filename from the SDA and use it to do... whatever. Of course, it doesn't _have_ to that as the PSP of the task which made the request is directly accessible to the redirector via the SDA (or via Int 21h AH=62h, a re-entrant DOS function). Crucially, the PSP has a copy of the value of SS:SP of the program which made the request, and it is set by DOS to point to a copy of the callers' registers as they were on entering DOS.

I believe there exists an SDA field (or two) pointing to the user stack frame created by the DOS call. But yes, this is also accessible in the PSP, though usually the only reader of *that* pointer is DOS process termination (to regain the parent process's stack).

That includes the pointer to the original "unparsed" LFN filename in DS:DX. Therefore, a redirector could access the LFN passed by an application by taking the pointer to the path in the method described above, thus allowing the redirector to implement LFN's however it so chooses. This is a hypothetical way for a network redirector to support LFN's without a frontend hook for Int 21h.

That is imaginable, but comes with problems like DOS applications not allowing to enter pathnames that contain blanks. An application that uses the LFN interface (21.71) will usually allow for some escape method such as double quotes to enter long names that may include blanks.

File sizes however would still be limited though as the SFT would still be used for file management and the file size field therein is a DWORD.

A redirector can readily store additional file handle data outside the SFT, using some cookie in the SFT to remember a reference to its additional file data. Such a data structure is probably needed for any nontrivial redirector because the available SFT fields may not suffice to hold all file handle Meta data.

I added 64-bit file size support to dosemu2's MachFS, by storing the size and seek position in uint64_t fields in the redirector's private file structure and syncing this with the 32-bit SFT fields throughout the redirector's code.

In particular, if DOS modifies the seek (which it can do without the redirector's awareness, refer to the comment in [1]) then it will usually end up at a number that isn't all-ones (0FFFF_FFFFh) and the redirector will heed this value before using a seek position anywhere. This is done using the update_seek_from_dos function [1], which is called before reading, before writing, or before 64-bit-seeking from the current seek offset.

The reverse syncing is done using the set_32bit_size_or_position function [2] which sets a 32-bit field either to the true value of the 64-bit quantity, if it fits, or else to the maximum unsigned 32-bit value 0FFFF_FFFFh (4 GiB - 1 B). This happens when opening a file (size only), after a non-zero-length write or read changes the seek position, or when a (32-bit) "seek from EOF" or a 64-bit seek has concluded, or when passing directory entries to the (SFN) FindFirst/FindNext results.

Whatever DOS 4.0's IFS did, was probably a more structured version of this line of thinking.

Thus, if one was to write a "good" redirector, one could theoretically, absolutely support arbitrary length LFN's with all measure of acceptable characters.

I don't know if any tools actually did this. I'm sure someone here knows better than I.

I hope that makes sense.
Any corrections to the above description are much appreciated.

Best,
Yll

Regards,
ecm


[1]: https://github.com/dosemu2/dosemu2/blob/2a0b157ae7c13431b71bedefc1de6f5060bd7957/src/dosext/mfs/mfs.c#L3876 [2]: https://github.com/dosemu2/dosemu2/blob/2a0b157ae7c13431b71bedefc1de6f5060bd7957/src/dosext/mfs/mfs.c#L3559


_______________________________________________
Freedos-devel mailing list
Freedos-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-devel

Reply via email to