{
Here are some routines for Hiding files, making read only files and
stuff.  Let me know what you think.  Any comments, criticism, or rude
remarks are welcome.

{ *********************** Files Unit *********************** }
{ **************** Written by: Rick Haines ***************** }
{ ***************** Last Revised 02/02/95 ****************** }

Unit Files;

Interface

 { Note: All FileNames MUST end in a null Char }
 { EX:   HideFile(FileName+#0);                }
 { EX:   HideFile('MyFile.Exe'+#0);            }

 Function HideFile(FileName : String) : Byte;     { Hide FileName }
 Function SystemFile(FileName : String) : Byte;   { Make FileName a System File}
 Function ReadOnlyFile(FileName : String) : Byte; { Make FileName ReadOnly     }
 Function NormalFile(FileName : String) : Byte;   { Make FileName a Normal File}
 Function FileAttributes(FileName : String) : Integer; { Returns Attributes of }

Implementation

 Function HideFile(FileName : String) : Byte; Assembler;
  Asm
   Push DS           { Push Data Segment                  }
   LDS DX, FileName  { Nul Terminated String of FileName  }
   Inc DX            { Get Rid Of Length Byte             }
   Mov AH, 43h       { Dos Function 43h, File Change Mode }
   Mov AL, 1         { Change Attributes                  }
   Mov CX, 2         { Bit 1, Hide It                     }
   Int 21h           { Call Dos                           }
   JC @Done          { See if there was an error          }
   Mov AL, 0         { If Not, Then No Error              }
  @Done:
   Pop DS            { Pop Data Segment                   }
  End;

 Function SystemFile(FileName : String) : Byte; Assembler;
  Asm
   Push DS           { Push Data Segment                  }
   LDS DX, FileName  { Nul Terminated String of FileName  }
   Inc DX            { Get Rid Of Length Byte             }
   Mov AH, 43h       { Dos Function 43h, File Change Mode }
   Mov AL, 1         { Change Attributes                  }
   Mov CX, 4         { Bit 3, System File                 }
   Int 21h           { Call Dos                           }
   JC @Done          { See if there was an error          }
   Mov AL, 0         { If Not, Then No Error              }
  @Done:
   Pop DS            { Pop Data Segment                   }
  End;

 Function ReadOnlyFile(FileName : String) : Byte; Assembler;
  Asm
   Push DS           { Push Data Segment                  }
   LDS DX, FileName  { Nul Terminated String of FileName  }
   Inc DX            { Get Rid Of Length Byte             }
   Mov AH, 43h       { Dos Function 43h, File Change Mode }
   Mov AL, 1         { Change Attributes                  }
   Mov CX, 1         { Bit 0, Read Only                   }
   Int 21h           { Call Dos                           }
   JC @Done          { See if there was an error          }
   Mov AL, 0         { If Not, Then No Error              }
  @Done:
   Pop DS            { Pop Data Segment                   }
  End;

 Function NormalFile(FileName : String) : Byte; Assembler;
  Asm
   Push DS           { Push Data Segment                  }
   LDS DX, FileName  { Nul Terminated String of FileName  }
   Inc DX            { Get Rid of Length Byte             }
   Mov AH, 43h       { Dos Function 43h, File Change Mode }
   Mov AL, 1         { Change Attributes                  }
   Mov CX, 0         { Nothing, UnEverything it           }
   Int 21h           { Call Dos                           }
   JC @Done          { See if there was an error          }
   Mov AL, 0         { If not, then no error              }
  @Done:
   Pop DS            { Pop Data Segment                   }
  End;

 Function FileAttributes(FileName : String) : Integer; Assembler;
  Asm
   Push DS           { Push Data Segment                  }
   LDS DX, FileName  { Nul Terminated String of FileName  }
   Inc DX            { Get Rid of Length Byte             }
   Mov AH, 43h       { Dos Function 43h, File Change Mode }
   Mov AL, 0         { Return Attributes                  }
   Int 21h           { Call Dos                           }
   JC @Error         { See if there was an error          }
   Mov AX, CX        { Return Attributes                  }
   Jmp @Done
  @Error:
   Mov AX, -1        { Return -1 For Error                }
  @Done:
   Pop DS            { Pop Data Segment                   }
  End;

End.

