Write file in each Drive

Hi,

i want add "autorun.inf" in each drive with few attributes like faReadOnly or faHidden or faSysFile or faArchive. Anyoone can help me with source code? If previously "autorun.inf"  exist in drive then also delete it and create new one.



Thanks
prasidduttaAsked:
Who is Participating?
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
ok, I understand that I made a few syntax errors. Sorry, I typed that code in a plain text editor.
I've fixed it and tested it, it's ok now
Type
 TDriveType=(dtUnknown,dtNotMounted,dtRemovable,dtFixed,dtRemote,dtCDRom,dtRAMDisk);
 TDriveTypeSet=set of TDriveType;
 
function DriveType(Drive: ANSIChar): TDriveType;
Var
 DriveStr:String;
begin
 Result:=dtNotMounted;
 Drive:=UpCase(Drive);
 if Not (Drive in ['A'..'Z']) Then Exit;
 DriveStr:=Drive+':\';
 Result:=TDriveType(GetDriveType(PChar(DriveStr)));
end;

function DiskInDrive(Drive: ANSIChar): Boolean;
var EMode: Word;
begin
 Result := False;
 Drive:=UpCase(Drive);
 if Not (Drive in ['A'..'Z']) Then Exit;
 EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
 try
  Result:=DiskSize(Ord(Drive)-$40)>=0;
 finally
  SetErrorMode(EMode);
 end;
end;

function GetDriveList(DriveTypes:TDriveTypeSet;MountedOnly:Boolean=False):ANSIString;
var
 D:ANSIChar;
begin
 Result:='';
 for D:='A' to 'Z' do
  if DriveType(D) In DriveTypes Then
   if (Not MountedOnly) Or DiskInDrive(D) Then
    Result:=Result+D;
end;

procedure CreateAutorun;
Var
 i:integer;
 Autorun:TStringList;
 DriveList,AutoRunFileName:ANSIString;
begin
 DriveList:=GetDriveList([dtRemovable,dtFixed],True); // Get only fixed or inserted removable, local disk
 AutoRunFileName:='C:\AutoRun.inf'; // first letter will change 
 Autorun:=TStringList.Create;
 // fill Autorun here if file is common to all drives
 for i:=1 to Length(DriveList) do
  begin
   // fill Autorun here if file is specific to each drive
   AutoRunFileName[1]:=DriveList[i];
   AutoRun.SaveToFile(AutoRunFileName);
   // set file attributes
   FileSetAttr(AutoRunFileName, faReadOnly Or faHidden  );
  end;
 Autorun.Free;
end;

Open in new window

0
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
easiest way to create text files is to use TStringList to build it then .SaveToFile to create or overwrite it.
What will be the content of this autorun ? Same for all drives ?
you'll have also to be able to list the drives you want.

Here it is all wrapped in
Type
 TDriveType=(dtUnknown,dtNotMounted,dtRemovable,dtFixed,dtRemote,dtCDRom,dtRAMDisk);
 TDriveTypeSet=set of TDriveType;
 
function DriveType(Drive: Char): TDriveType;
Var
 DriveStr:String;
begin
 Result:=dtNotMounted;
 Drive:=UpCase(Drive);
 if Not Drive in ['A'..'Z'] Then Exit;
 DriveStr:=Drive+':\';
 Result:=TDriveType(GetDriveType(PChar(DriveStr));
end;

function DiskInDrive(Drive: ANSIChar): Boolean;
var EMode: Word;
begin
 Result := False;
 Drive:=UpCase(Drive);
 if Not Drive in ['A'..'Z'] Then Exit;
 EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
 try
  Result:=DiskSize(Ord(Drive)-$40)>=0;
 finally
  SetErrorMode(EMode);
 end;
end;

function GetDriveList(DriveTypes:TDriveTypeSet;MountedOnly:Boolean=False):ANSIString;
var
 D:ANSIChar;
begin
 Result:='';
 for D:='A' to 'Z' do 
  if DriveType(D) In DriveTypes Then
   if (Not MountedOnly) Or DiskInDrive(D) Then
    Result:=Result+D;
end;

procedure CreateAutorun(Drives:String);
Var
 i:integer;
 Autorun:TStringList;
 DriveList,AutoRunFileName:ANSIString;
begin
 DriveList:=GetDriveList([dtRemovable,dtFixed],True); // Get only fixed or inserted removable, local disk
 AutoRunFileName:='C:\AutoRun.inf'; // first letter will change 
 Autorun:=TStringList.Create;
 // fill Autorun here if file is common to all drives
 for i:=1 to Length(DriveList) do
  begin
   // fill Autorun here if file is specific to each drive
   AutoRunFileName[1]:=DriveList[i];
   AutoRun.SaveToFile(AutoRunFileName);
   // set file attributes
   FileSetAttr(AutoRunFileName, faReadOnly Or faHidden or faSysFile or faArchive );
  end;
 Autorun.Free;
end;

Open in new window

0
 
prasidduttaAuthor Commented:
Yes all autorun.inf same and it'll protect my all drive from autorun virus.
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
prasidduttaAuthor Commented:
I make some mistake in your code. Can you share Unit? or upload code elsewhere? Thanks
0
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
what do you mean you made some mistake ? Can't you copy the code I gave you ?
0
 
prasidduttaAuthor Commented:
give much error in your code. I use Delphi XE2
0
 
prasidduttaAuthor Commented:
Now I just call

CreateAutorun;

Open in new window


Nice work man. You are great, your first code was a error related PChar and so on.

And I ask one thing. Suppose I insert a USB stck and autorun.inf is found with virus. I want to block instantly and remove inf file. Possible.
0
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
yes it's possible. Don't quite remind how to intercept removable drive insertion, but that exists.
Post a new question
0
 
prasidduttaAuthor Commented:
Sometime I saw this error:

"Cannot create file "C:\AutoRun.inf". Access is denied." and program hanged.
0
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
I suppose some process is locking that file just to stop you from erasing it... Virus ?
0
 
prasidduttaAuthor Commented:
no virus. I think it don’t got permission to delete.

Exception occur when I call

CreateAutorun;
0
 
Emmanuel PASQUIERFreelance Project ManagerCommented:
I guess you'll have to find a way to change the permissions or remove lock, that's another problem.
In the meantime, here I improve the CreateAutorun function (tapping error, so that clean up is done correctly)

 for i:=1 to Length(DriveList) do
  try
   // fill Autorun here if file is specific to each drive
   AutoRunFileName[1]:=DriveList[i];
   AutoRun.SaveToFile(AutoRunFileName);
   // set file attributes
   FileSetAttr(AutoRunFileName, faReadOnly Or faHidden  );
  except
  // manage here if you can't save the file
  end;

Open in new window

0
 
prasidduttaAuthor Commented:
Thanks, this loop work well
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.