git-svn-id: https://spexeah.com:8443/svn/Asuro@669 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
parent
b9d6225cb8
commit
956588c920
@ -122,6 +122,25 @@ begin
|
|||||||
console.outputln('DUMMY DRIVER', 'LOADED.')
|
console.outputln('DUMMY DRIVER', 'LOADED.')
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function cleanString(str : pchar) : byteArray8;
|
||||||
|
var
|
||||||
|
i : uint32;
|
||||||
|
ii: uint32;
|
||||||
|
begin
|
||||||
|
|
||||||
|
for i:=0 to 7 do begin
|
||||||
|
if str[i] = char(0) then begin
|
||||||
|
for ii:=i to 7 do begin
|
||||||
|
cleanString[ii]:= ' ';
|
||||||
|
end;
|
||||||
|
break;
|
||||||
|
end else begin
|
||||||
|
cleanString[i]:= str[i];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
function readBootRecord(volume : PStorage_volume) : PBootRecord; // need write functions for boot record!
|
function readBootRecord(volume : PStorage_volume) : PBootRecord; // need write functions for boot record!
|
||||||
var
|
var
|
||||||
buffer : puint32;
|
buffer : puint32;
|
||||||
@ -148,22 +167,8 @@ begin
|
|||||||
dataStart:= (volume^.sectorStart + 1 + bootRecord^.rsvSectors);
|
dataStart:= (volume^.sectorStart + 1 + bootRecord^.rsvSectors);
|
||||||
|
|
||||||
volume^.device^.readcallback(volume^.device, datastart + sectorLocation, 1, buffer);
|
volume^.device^.readcallback(volume^.device, datastart + sectorLocation, 1, buffer);
|
||||||
//console.writehexln(uint32(buffer[1]));
|
|
||||||
|
|
||||||
//console.writeint(cluster);
|
|
||||||
//console.writestring(' - (');
|
|
||||||
//console.writeint(sectorLocation);
|
|
||||||
//console.writestring(' * ');
|
|
||||||
//console.writeint(fatEntriesPerSector);
|
|
||||||
//console.writestringln(') ');
|
|
||||||
console.redrawWindows();
|
|
||||||
readFat:= buffer[cluster - (sectorLocation * fatEntriesPerSector)];
|
readFat:= buffer[cluster - (sectorLocation * fatEntriesPerSector)];
|
||||||
|
|
||||||
//console.writehexlnWND(readFat(volume, 0, bootRecord) ,getTerminalHWND());
|
|
||||||
//console.writehexlnWND(readFat(volume, 1, bootRecord) ,getTerminalHWND());
|
|
||||||
//console.writehexlnWND(readFat(volume, 2, bootRecord) ,getTerminalHWND());
|
|
||||||
//console.writehexlnWND(readFat(volume, 3, bootRecord) ,getTerminalHWND());
|
|
||||||
|
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -198,16 +203,8 @@ begin
|
|||||||
currentCluster:= cluster;
|
currentCluster:= cluster;
|
||||||
currentClusterValue:= cluster;
|
currentClusterValue:= cluster;
|
||||||
|
|
||||||
console.writestringlnWND('cluster-get', getTerminalHWND());
|
|
||||||
console.writeintlnWND(cluster, getTerminalHWND()); //cluster is 20 and shouldn't be..
|
|
||||||
|
|
||||||
|
|
||||||
while true do begin
|
while true do begin
|
||||||
currentClusterValue:= readFat(volume, currentClusterValue, bootRecord);
|
currentClusterValue:= readFat(volume, currentClusterValue, bootRecord);
|
||||||
//while true do begin end;
|
|
||||||
console.writestringlnWND('getfatchain: ', getTerminalHWND());
|
|
||||||
console.writeintlnWND(currentClusterValue, getTerminalHWND());
|
|
||||||
console.writeintlnWND(currentCluster, getTerminalHWND());
|
|
||||||
|
|
||||||
if currentClusterValue = $FFFFFFF7 then begin
|
if currentClusterValue = $FFFFFFF7 then begin
|
||||||
break;
|
break;
|
||||||
@ -223,15 +220,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
currentCluster+=1;
|
currentCluster+=1;
|
||||||
console.redrawWindows();
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
redrawWindows();
|
|
||||||
console.writestringlnWND('------------------', getTerminalHWND());
|
|
||||||
console.writehexlnWND(uint32(clusters), getTerminalHWND());
|
|
||||||
console.writeintlnWND(LL_size(clusters), getTerminalHWND()); //size of 0
|
|
||||||
redrawWindows();
|
|
||||||
|
|
||||||
getFatChain:= clusters;
|
getFatChain:= clusters;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -279,33 +269,13 @@ var
|
|||||||
begin
|
begin
|
||||||
directories:= LL_New(sizeof(TDirectory));
|
directories:= LL_New(sizeof(TDirectory));
|
||||||
|
|
||||||
console.writeintlnWND(cluster, getTerminalHWND());
|
|
||||||
|
|
||||||
clusters:= PLinkedListBase(getFatChain(volume, cluster, bootRecord));
|
clusters:= PLinkedListBase(getFatChain(volume, cluster, bootRecord));
|
||||||
|
|
||||||
console.writehexln(uint32(clusters));
|
|
||||||
console.writehexln(uint32(LL_Get(clusters, 0)^));
|
|
||||||
console.redrawWindows();
|
|
||||||
|
|
||||||
console.writeintlnWND(1, getTerminalHWND());
|
|
||||||
console.writeintlnWND(LL_size(clusters), getTerminalHWND());
|
|
||||||
console.writeintlnWND(21, getTerminalHWND());
|
|
||||||
console.redrawWindows();
|
|
||||||
|
|
||||||
//while true do begin end;
|
|
||||||
|
|
||||||
//kalloc-ing 0, this is why it is not going anywhere
|
|
||||||
buffer:= puint32(kalloc( (bootRecord^.sectorSize * bootRecord^.spc) * LL_size(clusters) ));
|
buffer:= puint32(kalloc( (bootRecord^.sectorSize * bootRecord^.spc) * LL_size(clusters) ));
|
||||||
memset(uint32(buffer), 0, (bootRecord^.sectorSize * bootRecord^.spc) * LL_size(clusters) );
|
memset(uint32(buffer), 0, (bootRecord^.sectorSize * bootRecord^.spc) * LL_size(clusters) );
|
||||||
|
|
||||||
dataStart:= volume^.sectorStart + 1 + bootRecord^.rsvSectors + bootRecord^.FATSize;
|
dataStart:= volume^.sectorStart + 1 + bootRecord^.rsvSectors + bootRecord^.FATSize;
|
||||||
|
|
||||||
console.writeintlnWND(2, getTerminalHWND());
|
|
||||||
console.redrawWindows();
|
|
||||||
|
|
||||||
for i:=0 to LL_size(clusters) - 1 do begin
|
for i:=0 to LL_size(clusters) - 1 do begin
|
||||||
console.writestringln('LOOP');
|
|
||||||
redrawWindows();
|
|
||||||
sectorLocation:= bootRecord^.spc * (i + cluster);
|
sectorLocation:= bootRecord^.spc * (i + cluster);
|
||||||
bufferI:= @buffer[i * (bootRecord^.spc * bootRecord^.sectorSize)];
|
bufferI:= @buffer[i * (bootRecord^.spc * bootRecord^.sectorSize)];
|
||||||
volume^.device^.readcallback(volume^.device, datastart + sectorLocation, bootRecord^.spc, bufferI); //datastart + spc(i + cluster)
|
volume^.device^.readcallback(volume^.device, datastart + sectorLocation, bootRecord^.spc, bufferI); //datastart + spc(i + cluster)
|
||||||
@ -320,7 +290,7 @@ begin
|
|||||||
i+=1;
|
i+=1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
getDirEntries:= directories;
|
getDirEntries:= directories; //get last .
|
||||||
LL_Free(clusters);
|
LL_Free(clusters);
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
end;
|
end;
|
||||||
@ -351,41 +321,28 @@ var
|
|||||||
begin
|
begin
|
||||||
bootRecord:= readBootRecord(volume);
|
bootRecord:= readBootRecord(volume);
|
||||||
directoryStrings:= LL_fromString(directory, '/');
|
directoryStrings:= LL_fromString(directory, '/');
|
||||||
console.writestringWND('cluster: ', getTerminalHWND());
|
|
||||||
redrawWindows();
|
|
||||||
|
|
||||||
directories:= getDirEntries(volume, bootRecord^.rootCluster, bootRecord);
|
directories:= getDirEntries(volume, bootRecord^.rootCluster, bootRecord);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if LL_size(directoryStrings) > 0 then begin
|
if LL_size(directoryStrings) > 0 then begin
|
||||||
for i:=0 to LL_Size(directoryStrings) - 1 do begin
|
for i:=0 to LL_Size(directoryStrings) do begin
|
||||||
ii:=0;
|
ii:=0;
|
||||||
|
|
||||||
while true do begin
|
while true do begin
|
||||||
if ii > LL_Size(directories) - 1 then break;
|
if ii > LL_Size(directories) - 1 then break;
|
||||||
dirEntry:= PDirectory(LL_Get(directories, ii));
|
dirEntry:= PDirectory(LL_Get(directories, ii));
|
||||||
//console.writestringlnWND(pchar(@dirEntry^.fileName), getTerminalHWND());
|
|
||||||
//console.writestringlnWND(pchar(LL_Get(directoryStrings, i)), getTerminalHWND());
|
if compareByteArray8( dirEntry^.fileName, cleanString( pchar(puint32(LL_Get(directoryStrings, i))^) ) ) then begin
|
||||||
if stringEquals( @dirEntry^.fileName, pchar(puint32(LL_Get(directoryStrings, i))^ ) ) then begin
|
|
||||||
//if compareByteArray8( dirEntry^.fileName, pbyteArray8(LL_Get(directoryStrings, i))^ ) then begin
|
|
||||||
cluster:= uint32(dirEntry^.clusterLow);
|
cluster:= uint32(dirEntry^.clusterLow);
|
||||||
cluster:= uint32(cluster) and uint32(dirEntry^.clusterHigh shl 16);
|
cluster:= uint32(cluster) or uint32(dirEntry^.clusterHigh shl 16);
|
||||||
console.writestringWND('cluster: ', getTerminalHWND());
|
|
||||||
console.writeintlnWND(cluster, getTerminalHWND()); ////////////////
|
|
||||||
redrawWindows();
|
|
||||||
break;
|
break;
|
||||||
end;
|
end;
|
||||||
ii+=1;
|
ii+=1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
LL_Free(directories); //TODO need to really free the things
|
||||||
|
directories:= getDirEntries(volume, cluster, bootRecord);
|
||||||
|
|
||||||
if i = LL_Size(directoryStrings) - 1 then break;
|
if i = LL_Size(directoryStrings) - 1 then break;
|
||||||
|
|
||||||
LL_Free(directories);
|
|
||||||
directories:= getDirEntries(volume, cluster, bootRecord);
|
|
||||||
end;
|
end;
|
||||||
end else begin
|
end else begin
|
||||||
while true do begin
|
while true do begin
|
||||||
@ -421,21 +378,13 @@ var
|
|||||||
parentArray : byteArray8 = ('.','.',' ',' ',' ',' ',' ',' ');
|
parentArray : byteArray8 = ('.','.',' ',' ',' ',' ',' ',' ');
|
||||||
begin
|
begin
|
||||||
push_trace('fat32.writeDirectory');
|
push_trace('fat32.writeDirectory');
|
||||||
console.writestringlnWND('start write', getTerminalHWND());
|
|
||||||
console.writestringlnWND(directory, getTerminalHWND());
|
|
||||||
redrawWindows();
|
|
||||||
directories:= readDirectory(volume, directory, status); //TODO error check first
|
directories:= readDirectory(volume, directory, status); //TODO error check first
|
||||||
console.writestringlnWND('after read', getTerminalHWND());
|
|
||||||
redrawWindows();
|
|
||||||
bootRecord:= readBootRecord(volume);
|
bootRecord:= readBootRecord(volume);
|
||||||
datastart:= volume^.sectorStart + 1 + bootRecord^.FATSize + bootRecord^.rsvSectors;
|
datastart:= volume^.sectorStart + 1 + bootRecord^.FATSize + bootRecord^.rsvSectors;
|
||||||
|
|
||||||
parentDirectory:= PDirectory(LL_Get(directories, 0));
|
parentDirectory:= PDirectory(LL_Get(directories, 0));
|
||||||
parentCluster:= uint32(parentDirectory^.clusterlow);
|
parentCluster:= uint32(parentDirectory^.clusterlow) or uint32(parentDirectory^.clusterhigh shl 16);
|
||||||
|
|
||||||
console.writeintlnWND(parentDirectory^.clusterlow, getTerminalHWND());
|
|
||||||
console.writeintlnWND(parentDirectory^.clusterhigh, getTerminalHWND());
|
|
||||||
console.writeintlnWND(parentCluster, getTerminalHWND());
|
|
||||||
|
|
||||||
clusters:= findFreeClusters(volume, 1, bootRecord);
|
clusters:= findFreeClusters(volume, 1, bootRecord);
|
||||||
cluster:= uint32(LL_Get(clusters, 0)^);
|
cluster:= uint32(LL_Get(clusters, 0)^);
|
||||||
@ -448,13 +397,13 @@ begin
|
|||||||
bufferPointer^.fileName:= thisArray; //TODO implement time
|
bufferPointer^.fileName:= thisArray; //TODO implement time
|
||||||
bufferPointer^.attributes:= attributes;
|
bufferPointer^.attributes:= attributes;
|
||||||
bufferPointer^.clusterLow:= cluster;
|
bufferPointer^.clusterLow:= cluster;
|
||||||
bufferPointer^.clusterHigh:= (cluster shr 16) and $0000FFFF;
|
bufferPointer^.clusterHigh:= uint16((cluster shr 16) and $0000FFFF);
|
||||||
|
|
||||||
bufferPointer:= @PDirectory(buffer)[1];
|
bufferPointer:= @PDirectory(buffer)[1];
|
||||||
bufferPointer^.fileName:= parentArray; //TODO implement time
|
bufferPointer^.fileName:= parentArray; //TODO implement time
|
||||||
bufferPointer^.attributes:= attributes;
|
bufferPointer^.attributes:= attributes;
|
||||||
bufferPointer^.clusterLow:= parentCluster;
|
bufferPointer^.clusterLow:= parentCluster;
|
||||||
bufferPointer^.clusterHigh:= (parentCluster shr 16) and $0000FFFF;
|
bufferPointer^.clusterHigh:= uint16((parentCluster shr 16) and $0000FFFF);
|
||||||
|
|
||||||
//write to disk
|
//write to disk
|
||||||
volume^.device^.writecallback(volume^.device, dataStart + (cluster * bootRecord^.spc), 1, buffer);
|
volume^.device^.writecallback(volume^.device, dataStart + (cluster * bootRecord^.spc), 1, buffer);
|
||||||
@ -465,30 +414,17 @@ begin
|
|||||||
|
|
||||||
memset(uint32(buffer), 0, bootRecord^.sectorSize);
|
memset(uint32(buffer), 0, bootRecord^.sectorSize);
|
||||||
//calculate write cluster using directories and parentCluster
|
//calculate write cluster using directories and parentCluster
|
||||||
sectorLocation:= LL_size(directories) * sizeof(PDirectory) div bootRecord^.sectorSize;
|
sectorLocation:= LL_size(directories) * sizeof(TDirectory) div bootRecord^.sectorSize;
|
||||||
sectorLocation:= sectorLocation + (parentCluster * bootRecord^.spc);
|
sectorLocation:= sectorLocation + (parentCluster * bootRecord^.spc);
|
||||||
//dataOffset:= datastart + ( (LL_size(directories) * sizeof(PDirectory)) - (sizeUsed * bootRecord^.sectorSize));
|
//dataOffset:= datastart + ( (LL_size(directories) * sizeof(PDirectory)) - (sizeUsed * bootRecord^.sectorSize));
|
||||||
volume^.device^.readcallback(volume^.device, dataStart + sectorLocation, 1, buffer);
|
volume^.device^.readcallback(volume^.device, dataStart + sectorLocation, 1, buffer);
|
||||||
|
|
||||||
//construct my dir entry
|
//construct my dir entry
|
||||||
bufferPointer:= @PDirectory(buffer)[LL_size(directories)];
|
bufferPointer:= @PDirectory(buffer)[LL_size(directories)];
|
||||||
bufferPointer^.fileName:= pbytearray8(dirName)^;
|
bufferPointer^.fileName:= cleanString(dirName);
|
||||||
bufferPointer^.attributes:= attributes;
|
bufferPointer^.attributes:= attributes;
|
||||||
bufferPointer^.clusterLow:= cluster;
|
bufferPointer^.clusterLow:= cluster;
|
||||||
bufferPointer^.clusterHigh:= (cluster shr 16) and $0000FFFF;
|
bufferPointer^.clusterHigh:= uint16((cluster shr 16) and $0000FFFF);
|
||||||
|
|
||||||
|
|
||||||
console.writestringlnWND(dirName, getTerminalHWND());
|
|
||||||
printmemory(uint32(buffer),256,32,' ',true);
|
|
||||||
|
|
||||||
console.writeintlnWND(dataStart, getTerminalHWND()); //parent cluster is 0 what the fuck
|
|
||||||
console.writeintlnWND(uint32(LL_size(directories)), getTerminalHWND());
|
|
||||||
|
|
||||||
for i:=0 to 4 do begin
|
|
||||||
console.writestringlnWND( PChar( PDirectory(LL_Get(directories, i))^.fileName) , getTerminalHWND());
|
|
||||||
end;
|
|
||||||
|
|
||||||
redrawWindows();
|
|
||||||
|
|
||||||
//write to disk
|
//write to disk
|
||||||
volume^.device^.writecallback(volume^.device, dataStart + sectorLocation, 1, buffer);
|
volume^.device^.writecallback(volume^.device, dataStart + sectorLocation, 1, buffer);
|
||||||
@ -498,7 +434,6 @@ begin
|
|||||||
LL_Free(directories);
|
LL_Free(directories);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
||||||
var
|
var
|
||||||
buffer : puint32;
|
buffer : puint32;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user