Solved

Write file in each Drive

Posted on 2011-09-29
14
392 Views
Last Modified: 2012-08-13
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
0
Comment
Question by:prasiddutta
  • 8
  • 6
14 Comments
 
LVL 25

Expert Comment

by:epasquier
ID: 36890240
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
 

Author Comment

by:prasiddutta
ID: 36890301
Yes all autorun.inf same and it'll protect my all drive from autorun virus.
0
 

Author Comment

by:prasiddutta
ID: 36890396
I make some mistake in your code. Can you share Unit? or upload code elsewhere? Thanks
0
 
LVL 25

Expert Comment

by:epasquier
ID: 36890408
what do you mean you made some mistake ? Can't you copy the code I gave you ?
0
 

Author Comment

by:prasiddutta
ID: 36890415
give much error in your code. I use Delphi XE2
0
 
LVL 25

Accepted Solution

by:
epasquier earned 500 total points
ID: 36890430
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
 

Author Comment

by:prasiddutta
ID: 36890491
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
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 25

Expert Comment

by:epasquier
ID: 36890623
yes it's possible. Don't quite remind how to intercept removable drive insertion, but that exists.
Post a new question
0
 

Author Comment

by:prasiddutta
ID: 36890683
0
 

Author Comment

by:prasiddutta
ID: 36891668
Sometime I saw this error:

"Cannot create file "C:\AutoRun.inf". Access is denied." and program hanged.
0
 
LVL 25

Expert Comment

by:epasquier
ID: 36892568
I suppose some process is locking that file just to stop you from erasing it... Virus ?
0
 

Author Comment

by:prasiddutta
ID: 36892683
no virus. I think it don’t got permission to delete.

Exception occur when I call

CreateAutorun;
0
 
LVL 25

Expert Comment

by:epasquier
ID: 36892768
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
 

Author Comment

by:prasiddutta
ID: 36892893
Thanks, this loop work well
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now