[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

Write file in each Drive

Posted on 2011-09-29
14
Medium Priority
?
403 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
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 2000 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
 
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: 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

Ask an Anonymous Question!

Don't feel intimidated by what you don't know. Ask your question anonymously. It's easy! Learn more and upgrade.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Video by: ITPro.TV
In this episode Don builds upon the troubleshooting techniques by demonstrating how to properly monitor a vSphere deployment to detect problems before they occur. He begins the show using tools found within the vSphere suite as ends the show demonst…
Please read the paragraph below before following the instructions in the video — there are important caveats in the paragraph that I did not mention in the video. If your PaperPort 12 or PaperPort 14 is failing to start, or crashing, or hanging, …
Suggested Courses

656 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