Hi, Mark just confirmed that he REALLY means 32768 BYTES PER SECTOR.
This fun is brought to us by NTFS4DOS which creates fake cluster sizes
of 1 MB and bigger to get the statistics displayed right for insanely
big drives...
Still I insist on the need for "you must not only check the carry
flag but also the returned AL value, otherwise you will treat MS
DOS 6 kernels as if they would support FAT32, and will start to do
calculations with random values"...!
Back to the overflow / underflow...
> > convert(FAT32_Free_Space.free_clusters /
> > ((1024l*1024) / clustersize), buffer);
Divides by zero if you have less than 1 cluster per megabyte.
Same for my approach, although I still like it better:
> convert(FAT32_Free_Space.free_clusters / (2048UL / (clustersize/512)),
> buffer);
I suggest the solution for the underflow as follows:
while (clustersize > (1024L*1024)) {
FAT32_Free_Space.free_clusters <<= 1;
argh! yikes... sorry. next attempt...
while (clustersize > (1024L*1024)) {
FAT32_Free_Space.free_clusters >>= 1;
clustersize >>= 1;
}
convert(FAT32_Free_Space.free_clusters /
(2048UL / (clustersize/512)), buffer);
That should finally be foolproof for cluster sizes between 512 bytes
(but not for smaller ones!) and infinity... Even more foolproof might be:
while (clustersize > (1024L*1024)) {
FAT32_Free_Space.free_clusters >>= 1;
clustersize >>= 1;
}
convert(FAT32_Free_Space.free_clusters /
((1024L*1024) / clustersize), buffer);
which should work for cluster sizes between 1 byte and 1 or 2 GBytes ;-).
Eric
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Freedos-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freedos-devel