Solved

to madshi ... lock CD?

Posted on 1998-08-11
14
199 Views
Last Modified: 2010-04-04
Hi,

I tried your 'lock' cd-code.

But it isn't working..

The code always fails on this point :

(get an error of 2, odd(reg.reg_flags) = True)

  if (not DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
                             @reg, sizeof(reg), @reg, sizeof(reg), cb, nil)) or
        odd(reg.reg_Flags) then begin
       // error
       TheError := GetLastError;
       exit;
     end;

I can raise the points if you want.

Zif.
0
Comment
Question by:ZifNab
  • 7
  • 7
14 Comments
 
LVL 20

Expert Comment

by:Madshi
ID: 1361918
Hi ZifNab,

please tell me the "reg" error, not the "GetLastError":

         case reg.reg_EAX of
           $01: s1:='Function not supportet.';
           $05: s1:='Access denied or no medium in drive.';
           $B0: s1:='Volume is not locked.';
           $B1: s1:='Volume is locked.';
           $B2: s1:='Volume is not removable.';
           $B4: s1:='Lock count overflow.';
           $B5: s1:='Eject error.';
           else s1:=IntToStr(reg.reg_EAX);
         end;

P.S: On my test computers (Win95,Win98,WinNT4) it works...

Madshi.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361919
Madshi, thanks for replying... I test it at home, so I'll give you the reg error when I'm at home. Zif.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361920
Madshi,

 Thanks, I found it myself...

 I want to give you the points if you explain me two things :

 1. Why running twice the code?
 
    begin
     result:=ldoit; //first
     if not result then result:=ldoit; //second
    end;

 2. When you lock the drive and then try to eject it :
    Windows turns blue, speaks about drive in use and asks if drive may be opened or not.      (press ESC or OK)
    Is there a way to prevent this message?

     -> so that when drive is lock, nothing happens, maybe only a message box : showmessage('drive locked!').

Regards, Zif.
0
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
LVL 20

Accepted Solution

by:
Madshi earned 50 total points
ID: 1361921
(1) I don't know anymore... It's sooo long ago. I think sometimes some functions (lock, unlock or eject) worked only the second time. Just try it. If your program works always the first time then delete the second call...
(2) Try: "SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX)"

Give me the points only if (2) works!

Madshi.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361922
Madshi,

 SetErrorMode doesn't work... Sending an Eject command still give s 'blue screen'

.Too bad... Though there must be a way.

Zif.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 1361923
That's strange. I've no blue screens...

If you send me your eject sources I'll check it for you. (But give me some time...)

Madshi.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361924
Madshi,

here is the source, very small :

procedure TCDEvents.OpenDoor;
var
  SetParms: TMCI_Set_Parms;
begin
  FFlags := 0;
  FFlags := mci_notify or mci_set_door_open;
  SetParms.dwCallback := 0;
  fErrCode := mciSendCommand(ID, mci_Set, FFlags, Longint(@SetParms));
end;

Thanks for any help, Zif.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 1361925
ZifNab,

try ejecting your volume with IOCtl instead of mci:

Add to my lock/unlock sources:

     case action of
       0: begin
            s2:='Sperren des Volumes "'+drive+':".';
            reg.reg_EAX:=$440D;                        // IOCTL for block devices
            reg.reg_EBX:=ord(drive)-ord('A')+1;        // zero-based drive ID
            reg.reg_ECX:=$0848;                        // Lock / Unlock Volume command
            reg.reg_EDX:=DWORD(@pb);                   // Paramblock
            pb.operation:=0;                           // Lock
          end;
       1: begin
            s2:='Entsperren des Volumes "'+drive+':".';
            reg.reg_EAX:=$440D;                        // IOCTL for block devices
            reg.reg_EBX:=ord(drive)-ord('A')+1;        // zero-based drive ID
            reg.reg_ECX:=$0848;                        // Lock / Unlock Volume command
            reg.reg_EDX:=DWORD(@pb);                   // Paramblock
            pb.operation:=1;                           // Unlock
          end;
       2: begin
            s2:='Herauswerfen des Volumes "'+drive+':".';
            reg.reg_EAX:=$440D;                        // IOCTL for block devices
            reg.reg_EBX:=ord(drive)-ord('A')+1;        // zero-based drive ID
            reg.reg_ECX:=$0849;                        // Eject Media command
          end;
     end;

But unfortunately you can't close the door again with IOCtl.  :-(
(You can do this with mci, can't you?)

Madshi.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361926
Madshi,

 Why using IOCtl, is it better then using mci commands?

Thanks, Zif.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 1361927
ZifNab,

Probably the same. But I hope no blue screens...  :-)

Madshi.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361928
Madshi,

 With IOCTL I still get this blue screen!

 When pressing ESC. The Procedure fails, when pressing OK the drive is ejected.
 So, with your OS, this blue screen doesn't appear???

Any ideas?

2de) Do you know a way, how to easely check if drive is locked?

Regards, zif.

 
0
 
LVL 20

Expert Comment

by:Madshi
ID: 1361929
ZifNab,

I don't understand it...
But another try: Perhaps it works if you "flush" the drive before ejecting. In win95 flushing is not possible directly (as far as I know). So we use a little trick...
Add the following lines to the DosIOCTL function. "3" locks the drive for formatting. "4" unlocks it again. As a result the drive is flushed. But unfortunately it doesn't work always...
If the blue screen is still "alive", give me your eMail and I will send you a little test program (binary).

       3: begin
            s2:='Reservieren des Volumes "'+drive+':".';
            reg.reg_EAX:=$440D;                        // IOCTL for block devices
            reg.reg_EBX:=ord(drive)-ord('A')+1;        // zero-based drive ID
            reg.reg_ECX:=$084A;
            reg.reg_EDX:=0;
          end;
       4: begin
            s2:='Freigeben des Volumes "'+drive+':".';
            reg.reg_EAX:=$440D;                        // IOCTL for block devices
            reg.reg_EBX:=ord(drive)-ord('A')+1;        // zero-based drive ID
            reg.reg_ECX:=$086A;
          end;

Regards, Madshi.

P.S: I suppose you don't have OSR-2 installed, have you? I'm asking because OSR-2 is a little bit more blue screen save.

P.P.S: I didn't implement a "test if locked" function. I don't know anymore (I wrote these routines a long time ago) if it wasn't possible or if there were other problems. I have in mind, that sometimes there was a lock count and sometimes there was not. In my programs my eject function has a parameter "force". If it is true, I unlock the drive (several times) until the unlock function returns an error.
0
 
LVL 8

Author Comment

by:ZifNab
ID: 1361930
Madshi,

I still have the same problem, but because I've little time now, for my own projects I'll grade this question. You've given me a lot of information, thanks fo this!

Regards, Zif.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 1361931
ZifNab, thanx.
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Intraweb download file link ? 1 132
Delphi Yen format 3 31
Need Help Delphi 2010 CheckBox1 Stored value in memo 13 66
how to change, disabled button color FMX ? 1 32
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
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…
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

813 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

16 Experts available now in Live!

Get 1:1 Help Now