{* * @(#) clrdsk.pas - Program for wiping (clearing) disk unused clusters. * (c) 1995 Ivan Maidanski http://ivmai.chat.ru * Freeware program source. All rights reserved. ** * Language: Turbo Pascal * Tested with: Turbo Pascal v7.0 * Last modified: 1995-05-07 13:45:00 GMT+04:00 *} program ClearDiskFreeClusters; {$M 2048,0,65535} var Disk: Byte; var Buf,Fat: Pointer; var Fat12: Boolean; var UsePacket: Boolean; var SectorsPerCluster: Byte; var ClusterSize,SectorsPerFat: Word; var SectorsBeforeFat,SectorsBeforeData: LongInt; var TotalClusters: Word; var Packet: array[1..10] of Byte; procedure Hello; begin WriteLn('Clears disk free clusters.'); WriteLn('Usage: CLRDSK drive'); WriteLn; Halt(0) end; procedure InvalidUsage; begin WriteLn(' Invalid Usage!'); WriteLn; Halt(1) end; procedure PrintErr(S: String); begin WriteLn(#13'Error: ',S,'!'); WriteLn; Halt(2) end; procedure GetMemory(var P: Pointer; Size: LongInt); begin if MaxAvail1 then InvalidUsage; S:=ParamStr(1); Disk:=Ord(UpCase(S[1])); if (Disk>=Ord('A')) and (Disk<=Ord('Z')) then Dec(Disk,Ord('A')) else InvalidUsage; UsePacket:=Lo(GetDosVersion)>=4; TestBootSector; ReadFat; GetMemory(Buf,ClusterSize); ClearBuf; WriteLn end; function GetClusterStatus(Number: Word): Word; var B: Boolean; begin B:=Odd(Number); if Fat12 then Number:=3*Number div 2 else Number:=2*Number; Number:=GetByte(Fat,Number)+GetByte(Fat,Succ(Number))*256; if Fat12 then if B then Number:=Number shr 4 else Number:=Number and $0FFF; GetClusterStatus:=Number end; function GetSectorNumber(Cluster: Word): LongInt; begin GetSectorNumber:=SectorsBeforeData+(Cluster-2)*SectorsPerCluster end; procedure ShowPercentage(Cluster: Word); const Count: Word = 0; begin Inc(Count); Write('Procceded: ',(100*LongInt(Cluster) div LongInt(TotalClusters)):3, '% ',' ',' Cleared: ',Count,#13) end; procedure Run; var Cluster: Word; var FatElement: Boolean; begin for Cluster:=2 to TotalClusters do if GetClusterStatus(Cluster)=0 then begin TestDiskErr (DiskWrite(Buf^,Disk, GetSectorNumber(Cluster),SectorsPerCluster)); ShowPercentage(Cluster) end; WriteLn('Operation completed.',' ':20) end; begin Init; Run end.