git-svn-id: https://spexeah.com:8443/svn/Asuro@660 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
		| @@ -62,8 +62,6 @@ type | |||||||
|     end; |     end; | ||||||
|     PBootRecord = ^TBootRecord; |     PBootRecord = ^TBootRecord; | ||||||
|  |  | ||||||
|     byteArray8 = array[0..7] of char; |  | ||||||
|  |  | ||||||
|     TDirectory = packed record |     TDirectory = packed record | ||||||
|         fileName      : array[0..7] of char; |         fileName      : array[0..7] of char; | ||||||
|         fileExtension : array[0..2] of char; |         fileExtension : array[0..2] of char; | ||||||
| @@ -141,13 +139,15 @@ var | |||||||
|     buffer              : puint32; |     buffer              : puint32; | ||||||
|     fatEntriesPerSector : uint32; |     fatEntriesPerSector : uint32; | ||||||
|     sectorLocation      : uint32; |     sectorLocation      : uint32; | ||||||
|  |     dataStart : uint32; | ||||||
| begin | begin | ||||||
|     buffer:= puint32(kalloc(bootRecord^.sectorsize)); |     buffer:= puint32(kalloc(bootRecord^.sectorsize)); | ||||||
|     memset(uint32(buffer), 0, bootRecord^.sectorsize); |     memset(uint32(buffer), 0, bootRecord^.sectorsize); | ||||||
|     fatEntriesPerSector:= bootRecord^.sectorsize div 4; |     fatEntriesPerSector:= bootRecord^.sectorsize div 4; | ||||||
|     sectorLocation:= cluster div fatEntriesPerSector + (volume^.sectorStart + 1 + bootRecord^.rsvSectors); |     sectorLocation:= cluster div fatEntriesPerSector; | ||||||
|  |     dataStart:= (volume^.sectorStart + 1 + bootRecord^.rsvSectors); | ||||||
|  |  | ||||||
|     volume^.device^.readcallback(volume^.device, sectorLocation, 1, buffer); |     volume^.device^.readcallback(volume^.device, datastart + sectorLocation, 1, buffer);  | ||||||
|             //console.writehexln(uint32(buffer[1])); |             //console.writehexln(uint32(buffer[1])); | ||||||
|  |  | ||||||
|             //console.writeint(cluster); |             //console.writeint(cluster); | ||||||
| @@ -157,7 +157,12 @@ begin | |||||||
|             //console.writeint(fatEntriesPerSector); |             //console.writeint(fatEntriesPerSector); | ||||||
|             //console.writestringln(') '); |             //console.writestringln(') '); | ||||||
|         console.redrawWindows(); |         console.redrawWindows(); | ||||||
|     readFat:= buffer[cluster - ((cluster - 1) * 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; | ||||||
| @@ -167,15 +172,17 @@ var | |||||||
|     buffer              : puint32; |     buffer              : puint32; | ||||||
|     fatEntriesPerSector : uint32; |     fatEntriesPerSector : uint32; | ||||||
|     sectorLocation      : uint32; |     sectorLocation      : uint32; | ||||||
|  |     dataStart           : uint32; | ||||||
| begin | begin | ||||||
|     buffer:= puint32(kalloc(bootRecord^.sectorsize)); |     buffer:= puint32(kalloc(bootRecord^.sectorsize)); | ||||||
|     memset(uint32(buffer), 0, bootRecord^.sectorsize); |     memset(uint32(buffer), 0, bootRecord^.sectorsize); | ||||||
|     fatEntriesPerSector:= bootRecord^.sectorsize div 4; |     fatEntriesPerSector:= bootRecord^.sectorsize div 4; | ||||||
|     sectorLocation:= cluster div fatEntriesPerSector + (volume^.sectorStart + 1 + bootRecord^.rsvSectors); |     sectorLocation:= cluster div fatEntriesPerSector; | ||||||
|  |     dataStart:= (volume^.sectorStart + 1 + bootRecord^.rsvSectors); | ||||||
|  |  | ||||||
|     volume^.device^.readcallback(volume^.device, sectorLocation, 1, buffer); |     volume^.device^.readcallback(volume^.device, dataStart + sectorLocation, 1, buffer); | ||||||
|     buffer[cluster - (sectorLocation * fatEntriesPerSector)]:= value; |     buffer[cluster - (sectorLocation * fatEntriesPerSector)]:= value; | ||||||
|     volume^.device^.writecallback(volume^.device, sectorLocation, 1, buffer); |     volume^.device^.writecallback(volume^.device, dataStart + sectorLocation, 1, buffer); | ||||||
|  |  | ||||||
|     kfree(buffer); |     kfree(buffer); | ||||||
| end; | end; | ||||||
| @@ -314,12 +321,7 @@ begin | |||||||
|  |  | ||||||
|     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 | ||||||
|  |  | ||||||
|             console.writeintln(123123); |  | ||||||
|             redrawWindows(); |  | ||||||
|  |  | ||||||
|         for i:=0 to LL_Size(directoryStrings) - 1 do begin |         for i:=0 to LL_Size(directoryStrings) - 1 do begin | ||||||
|             ii:=0; |             ii:=0; | ||||||
|             while true do begin |             while true do begin | ||||||
| @@ -340,9 +342,6 @@ begin | |||||||
|             directories:= getDirEntries(volume, cluster, bootRecord); |             directories:= getDirEntries(volume, cluster, bootRecord); | ||||||
|         end; |         end; | ||||||
|     end else begin |     end else begin | ||||||
|             console.writeintln(LL_Size(directories)); //nneds to be fixed currently only 1 |  | ||||||
|             redrawWindows(); |  | ||||||
|  |  | ||||||
|         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)); | ||||||
| @@ -356,6 +355,98 @@ begin | |||||||
|     kfree(puint32(bootRecord)); |     kfree(puint32(bootRecord)); | ||||||
| end; | end; | ||||||
|  |  | ||||||
|  | procedure writeDirectory(volume : PStorage_volume; directory : pchar; dirName : pchar; attributes : uint32; status : puint32); // need to handle parent table cluster overflow, need to take attributes | ||||||
|  | var | ||||||
|  |     directories     : PLinkedListBase; | ||||||
|  |     parentDirectory : PDirectory; | ||||||
|  |     parentCluster   : uint32; | ||||||
|  |     clusters        : PLinkedListBase; | ||||||
|  |     cluster         : uint32; | ||||||
|  |     bootRecord      : PBootRecord; | ||||||
|  |     buffer          : puint32; | ||||||
|  |     bufferPointer   : PDirectory; | ||||||
|  |     dataStart       : uint32; | ||||||
|  |     EntriesPerSector : uint32; | ||||||
|  |     sectorLocation  : uint32; | ||||||
|  |     dataOffset      : uint32; | ||||||
|  |     i : uint32; | ||||||
|  |  | ||||||
|  |     thisArray     : byteArray8 = ('.',' ',' ',' ',' ',' ',' ',' '); | ||||||
|  |     parentArray   : byteArray8 = ('.','.',' ',' ',' ',' ',' ',' '); | ||||||
|  | begin | ||||||
|  |     push_trace('fat32.writeDirectory'); | ||||||
|  |     directories:= readDirectory(volume, directory, status); //TODO error check first | ||||||
|  |     bootRecord:= readBootRecord(volume); | ||||||
|  |     datastart:= volume^.sectorStart + 1 + bootRecord^.FATSize + bootRecord^.rsvSectors; | ||||||
|  |  | ||||||
|  |     parentDirectory:= PDirectory(LL_Get(directories, 0)); | ||||||
|  |     parentCluster:= uint32(parentDirectory^.clusterlow); | ||||||
|  |  | ||||||
|  |     console.writeintlnWND(parentDirectory^.clusterlow, getTerminalHWND()); | ||||||
|  |     console.writeintlnWND(parentDirectory^.clusterhigh, getTerminalHWND()); | ||||||
|  |     console.writeintlnWND(parentCluster, getTerminalHWND()); | ||||||
|  |  | ||||||
|  |     clusters:= findFreeClusters(volume, 1, bootRecord); | ||||||
|  |     cluster:= uint32(LL_Get(clusters, 0)^); | ||||||
|  |  | ||||||
|  |     if attributes = $10 then begin // if directory | ||||||
|  |         buffer:= puint32(kalloc(bootRecord^.sectorSize)); | ||||||
|  |         memset(uint32(buffer), 0, bootRecord^.sectorSize); | ||||||
|  |  | ||||||
|  |         bufferPointer:= @PDirectory(buffer)[0]; | ||||||
|  |         bufferPointer^.fileName:= thisArray; //TODO implement time | ||||||
|  |         bufferPointer^.attributes:= attributes; | ||||||
|  |         bufferPointer^.clusterLow:= cluster; | ||||||
|  |         bufferPointer^.clusterHigh:= (cluster shr 16) and $0000FFFF; | ||||||
|  |          | ||||||
|  |         bufferPointer:= @PDirectory(buffer)[1]; | ||||||
|  |         bufferPointer^.fileName:= parentArray; //TODO implement time | ||||||
|  |         bufferPointer^.attributes:= attributes; | ||||||
|  |         bufferPointer^.clusterLow:= parentCluster; | ||||||
|  |         bufferPointer^.clusterHigh:= (parentCluster shr 16) and $0000FFFF; | ||||||
|  |  | ||||||
|  |         //write to disk | ||||||
|  |         volume^.device^.writecallback(volume^.device, dataStart + (cluster * bootRecord^.spc), 1, buffer); | ||||||
|  |  | ||||||
|  |         //write fat | ||||||
|  |         writeFat(volume, cluster, $FFFFFFF8, bootRecord); //TODO check if working | ||||||
|  |     end; | ||||||
|  |  | ||||||
|  |     memset(uint32(buffer), 0, bootRecord^.sectorSize); | ||||||
|  |     //calculate write cluster using directories and parentCluster | ||||||
|  |     sectorLocation:= LL_size(directories) * sizeof(PDirectory) div bootRecord^.sectorSize; | ||||||
|  |     sectorLocation:= sectorLocation + (parentCluster * bootRecord^.spc); | ||||||
|  |     //dataOffset:= datastart + ( (LL_size(directories) * sizeof(PDirectory)) - (sizeUsed * bootRecord^.sectorSize)); | ||||||
|  |     volume^.device^.readcallback(volume^.device, dataStart + sectorLocation, 1, buffer); | ||||||
|  |  | ||||||
|  |     //construct my dir entry | ||||||
|  |     bufferPointer:= @PDirectory(buffer)[LL_size(directories)]; | ||||||
|  |     bufferPointer^.fileName:= pbytearray8(dirName)^; | ||||||
|  |     bufferPointer^.attributes:= attributes; | ||||||
|  |     bufferPointer^.clusterLow:= cluster; | ||||||
|  |     bufferPointer^.clusterHigh:= (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 | ||||||
|  |     volume^.device^.writecallback(volume^.device, dataStart + sectorLocation, 1, buffer); | ||||||
|  |  | ||||||
|  |     kfree(buffer); | ||||||
|  |     kfree(puint32(bootRecord)); | ||||||
|  |     LL_Free(directories); | ||||||
|  | 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 | ||||||
| @@ -371,6 +462,10 @@ var | |||||||
|     fatArray      : byteArray8 = ('F','A','T','3','2',' ',' ',' '); |     fatArray      : byteArray8 = ('F','A','T','3','2',' ',' ',' '); | ||||||
|     thisArray     : byteArray8 = ('.',' ',' ',' ',' ',' ',' ',' '); |     thisArray     : byteArray8 = ('.',' ',' ',' ',' ',' ',' ',' '); | ||||||
|     parentArray   : byteArray8 = ('.','.',' ',' ',' ',' ',' ',' '); |     parentArray   : byteArray8 = ('.','.',' ',' ',' ',' ',' ',' '); | ||||||
|  |  | ||||||
|  |     asuroFileArray     : byteArray8 = ('A','S','U','R','O',' ',' ',' '); | ||||||
|  |     mountFileArray     : byteArray8 = ('M','O','U','N','T',' ',' ',' '); | ||||||
|  |     programFileArray   : byteArray8 = ('P','R','O','G','R','A','M','S'); | ||||||
|     rootCluster   : uint32 = 1; |     rootCluster   : uint32 = 1; | ||||||
| begin | begin | ||||||
|     push_trace('fat32.create_volume()'); |     push_trace('fat32.create_volume()'); | ||||||
| @@ -444,10 +539,18 @@ begin | |||||||
|     PDirectory(buffer)[1].clusterLow := 1; |     PDirectory(buffer)[1].clusterLow := 1; | ||||||
|  |  | ||||||
|     //Temp for testing other functions |     //Temp for testing other functions | ||||||
|     PDirectory(buffer)[2].fileName   := fatArray;  |     PDirectory(buffer)[2].fileName   := asuroFileArray;  | ||||||
|     PDirectory(buffer)[2].attributes := $10; |     PDirectory(buffer)[2].attributes := $10; | ||||||
|     PDirectory(buffer)[2].clusterLow := 1; |     PDirectory(buffer)[2].clusterLow := 1; | ||||||
|     // |  | ||||||
|  |     PDirectory(buffer)[3].fileName   := mountFileArray;  | ||||||
|  |     PDirectory(buffer)[3].attributes := $10; | ||||||
|  |     PDirectory(buffer)[3].clusterLow := 1; | ||||||
|  |  | ||||||
|  |     PDirectory(buffer)[4].fileName   := programFileArray;  | ||||||
|  |     PDirectory(buffer)[4].attributes := $10; | ||||||
|  |     PDirectory(buffer)[4].clusterLow := 1; | ||||||
|  |      | ||||||
|  |  | ||||||
|     disk^.writecallback(disk, dataStart + (config^ * rootCluster), 1, buffer); |     disk^.writecallback(disk, dataStart + (config^ * rootCluster), 1, buffer); | ||||||
|  |  | ||||||
| @@ -492,8 +595,10 @@ begin | |||||||
|     push_trace('fat32.init()'); |     push_trace('fat32.init()'); | ||||||
|     filesystem.sName:= 'FAT32';  |     filesystem.sName:= 'FAT32';  | ||||||
|     filesystem.readDirCallback:= @readDirectory; |     filesystem.readDirCallback:= @readDirectory; | ||||||
|  |     filesystem.createDirCallback:= @writeDirectory; | ||||||
|     filesystem.createcallback:= @create_volume; |     filesystem.createcallback:= @create_volume; | ||||||
|     filesystem.detectcallback:= @detect_volumes; |     filesystem.detectcallback:= @detect_volumes; | ||||||
|  |  | ||||||
|     storagemanagement.register_filesystem(@filesystem); |     storagemanagement.register_filesystem(@filesystem); | ||||||
| end; | end; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,15 +28,16 @@ type | |||||||
|     PStorage_volume = ^TStorage_Volume; |     PStorage_volume = ^TStorage_Volume; | ||||||
|     PStorage_device = ^TStorage_Device; |     PStorage_device = ^TStorage_Device; | ||||||
|     APStorage_Volume = array[0..10] of PStorage_volume; |     APStorage_Volume = array[0..10] of PStorage_volume; | ||||||
|  |     byteArray8 = array[0..7] of char; | ||||||
|  |     PByteArray8 = ^byteArray8; | ||||||
|  |  | ||||||
|     PPIOHook = procedure(volume : PStorage_volume; directory : pchar; byteCount : uint32; buffer : puint32); |     PPIOHook = procedure(volume : PStorage_volume; directory : pchar; byteCount : uint32; buffer : puint32); | ||||||
|     PPHIOHook = procedure(volume : PStorage_device; addr : uint32; sectors : uint32; buffer : puint32); |     PPHIOHook = procedure(volume : PStorage_device; addr : uint32; sectors : uint32; buffer : puint32); | ||||||
|     PPCreateHook = procedure(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32); |     PPCreateHook = procedure(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32); | ||||||
|     PPDetectHook = procedure(disk : PStorage_Device); |     PPDetectHook = procedure(disk : PStorage_Device); | ||||||
|     PPCreateDirHook = function(volume : PStorage_volume; directory : pchar; dirname : pchar; attributes : uint32) : uint8; |     PPCreateDirHook = procedure(volume : PStorage_volume; directory : pchar; dirname : pchar; attributes : uint32; status : puint32); | ||||||
|     PPReadDirHook = function(volume : PStorage_volume; directory : pchar; status : puint32) : PLinkedListBase; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error |     PPReadDirHook = function(volume : PStorage_volume; directory : pchar; status : puint32) : PLinkedListBase; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error | ||||||
|  |  | ||||||
|  |  | ||||||
|     PPHIOHook_ = procedure; |     PPHIOHook_ = procedure; | ||||||
|  |  | ||||||
|     TFilesystem = record |     TFilesystem = record | ||||||
| @@ -157,17 +158,29 @@ end; | |||||||
| procedure mkdir_command(params : PParamList); | procedure mkdir_command(params : PParamList); | ||||||
| var | var | ||||||
|     dir : pchar; |     dir : pchar; | ||||||
|  |     temp : pchar; | ||||||
|  |     dirName : pbyteArray8; | ||||||
|     device : PStorage_Device; |     device : PStorage_Device; | ||||||
|     volume : PStorage_Volume; |     volume : PStorage_Volume; | ||||||
|     error : uint32; |     error : uint32; | ||||||
|  |     i : uint32; | ||||||
| begin | begin | ||||||
|  |     push_trace('mkdir'); | ||||||
|     if paramCount(params) > 0 then begin |     if paramCount(params) > 0 then begin | ||||||
|         dir := getParam(0, params); |         dir := getParam(0, params); | ||||||
|  |         temp:= getParam(1, params); | ||||||
|  |  | ||||||
|  |         //for i:=0 to 7 do begin | ||||||
|  |         //    dirname[i]:= pbyteArray8(temp)[i]; | ||||||
|  |         //end; | ||||||
|  |  | ||||||
|  |         //console.writestringlnWND(pchar(dirname), getTerminalHWND()); | ||||||
|  |  | ||||||
|         device:= PStorage_Device(LL_Get(storageDevices, 0)); |         device:= PStorage_Device(LL_Get(storageDevices, 0)); | ||||||
|         volume:= PStorage_Volume(LL_Get(device^.volumes, 0)); |         volume:= PStorage_Volume(LL_Get(device^.volumes, 0)); | ||||||
|  |  | ||||||
|         //error:= volume^.filesystem^.createDirCallback(volume, dir, $10); |         volume^.filesystem^.createDirCallback(volume, dir, temp, $10, @error); | ||||||
|         if error <> 1 then console.writestringln('ERROR'); |         //if error <> 1 then console.writestringln('ERROR'); | ||||||
|     end; |     end; | ||||||
| end; | end; | ||||||
|  |  | ||||||
| @@ -205,15 +218,17 @@ begin | |||||||
|  |  | ||||||
|         device:= PStorage_Device(LL_Get(storageDevices, 0)); |         device:= PStorage_Device(LL_Get(storageDevices, 0)); | ||||||
|         volume:= PStorage_Volume(LL_Get(device^.volumes, 0)); |         volume:= PStorage_Volume(LL_Get(device^.volumes, 0)); | ||||||
|         dirs:= volume^.filesystem^.readDirCallback(volume, '', @error); |         dirs:= volume^.filesystem^.readDirCallback(volume, dir, @error); | ||||||
|  |  | ||||||
|         //if error <> 1 then console.writestringln('ERROR'); |         //if error <> 1 then console.writestringln('ERROR'); | ||||||
|         for i:=2 to LL_Size(dirs) - 1 do begin |         for i:=2 to LL_Size(dirs) - 1 do begin | ||||||
|             console.writestring('    '); |             console.writestringWND('    /', getTerminalHWND); | ||||||
|             dirp:= PDirectory(LL_Get(dirs, i)); |             dirp:= PDirectory(LL_Get(dirs, i)); | ||||||
|             console.writestringlnWND(pchar(dirp^.fileName), getTerminalHWND); |             console.writestringlnWND(pchar(dirp^.fileName), getTerminalHWND); | ||||||
|         end; |         end; | ||||||
|         pop_trace(); |         pop_trace(); | ||||||
|  |     end else begin | ||||||
|  |         console.writestringlnWND('Specifiy a folder', getTerminalHWND); | ||||||
|     end; |     end; | ||||||
| end; | end; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 aaron
					aaron