Removable media - IOCTL_STORAGE_EJECTION_CONTROL

Hi,

(OS : WinXP Professional)

I am trying to “Prevent CD RW/R media removal” using
IOCTL_STORAGE_EJECTION_CONTROL.

DeviceIoControl( ) itself returns error (Code: 87, Param Incorrect).

Am sure the params are correct.

(Input buff: Address of BOOL var, even with BOOLEAN I tried. Both
returns 87)

But, IOCTL_STORAGE_MEDIA_REMOVAL returns success with same params passed
for IOCTL_STORAGE_EJECTION_CONTROL.

Why IOCTL_STORAGE_EJECTION_CONTROL is NOT working ???

Thanks,
Sathya

Dear Sathya,

If you are able, please post some code for us to look at.

Chuck

----- Original Message -----
From: “Sathyanarayanan Srinivasan”

To: “NT Developers Interest List”
Sent: Friday, November 29, 2002 9:19 PM
Subject: [ntdev] Removable media - IOCTL_STORAGE_EJECTION_CONTROL

> Hi,
>
> (OS : WinXP Professional)
>
> I am trying to “Prevent CD RW/R media removal” using
> IOCTL_STORAGE_EJECTION_CONTROL.
>
> DeviceIoControl( ) itself returns error (Code: 87, Param Incorrect).
>
> Am sure the params are correct.
>
> (Input buff: Address of BOOL var, even with BOOLEAN I tried. Both
> returns 87)
>
> But, IOCTL_STORAGE_MEDIA_REMOVAL returns success with same params
passed
> for IOCTL_STORAGE_EJECTION_CONTROL.
>
> Why IOCTL_STORAGE_EJECTION_CONTROL is NOT working ???
>
> Thanks,
> Sathya

Please have the code below…

---------------------- Start : Code -----------------------------------

#define DEVICE_TO_TEST “\\.\G:” // My CD Drive letter

void LockDevice()
{
HANDLE handl;
GET_LENGTH_INFORMATION lenInfo;
DWORD somevar = 0;
DWORD RetVal = 0;
char str[256];

handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (handl == INVALID_HANDLE_VALUE)
{
RetVal = GetLastError();
sprintf(str,“Createfile failed %d”,RetVal);
AfxMessageBox(str);
return;
}

if (!DeviceIoControl(handl, IOCTL_STORAGE_LOAD_MEDIA, NULL,
0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
{
RetVal = GetLastError();
sprintf(str,“IOCTL_STORAGE_LOAD_MEDIA failed
%d”,RetVal);
AfxMessageBox(str);
CloseHandle(handl);
return;
}

if (!DeviceIoControl(handl, IOCTL_STORAGE_CHECK_VERIFY, NULL,
0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
{
RetVal = GetLastError();
sprintf(str,“IOCTL_STORAGE_CHECK_VERIFY failed
%d”,RetVal);
AfxMessageBox(str);
CloseHandle(handl);
return;
}

BOOL prev = TRUE; // BOOL is int, BOOLEAN (char) also didn’t
work…
if (!DeviceIoControl(handl, IOCTL_STORAGE_EJECTION_CONTROL,
(LPVOID) &prev,
sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
NULL))
{
RetVal = GetLastError(); // Returns 87 (Parameter
incorrect)
sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
%d”,RetVal);
AfxMessageBox(str);
CloseHandle(handl);
return;
}

CloseHandle(handl);
AfxMessageBox(“Locked”);
}

void UnlockDevice()
{
HANDLE handl;
GET_LENGTH_INFORMATION lenInfo;
DWORD somevar = 0;
DWORD RetVal = 0;
char str[256];

handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (handl == INVALID_HANDLE_VALUE)
{
RetVal = GetLastError();
sprintf(str,“Createfile failed %d”,RetVal);
AfxMessageBox(str);
return;
}

BOOL prev = FALSE;
if (!DeviceIoControl(handl,
IOCTL_STORAGE_EJECTION_CONTROL, (LPVOID) &prev,
sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
NULL))
{
RetVal = GetLastError();
sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
%d”,RetVal);
AfxMessageBox(str);
CloseHandle(handl);
return;
}

CloseHandle(handl);
AfxMessageBox(“Unlocked”);
}

---------------------- End : Code --------------------------------------

-----Original Message-----
From: Chuck Batson [mailto:xxxxx@cbatson.com]
Sent: Saturday, November 30, 2002 12:43 AM
Subject: Re: Removable media - IOCTL_STORAGE_EJECTION_CONTROL

Dear Sathya,

If you are able, please post some code for us to look at.

Chuck

----- Original Message -----
From: “Sathyanarayanan Srinivasan”

To: “NT Developers Interest List”
Sent: Friday, November 29, 2002 9:19 PM
Subject: [ntdev] Removable media - IOCTL_STORAGE_EJECTION_CONTROL

> Hi,
>
> (OS : WinXP Professional)
>
> I am trying to “Prevent CD RW/R media removal” using
> IOCTL_STORAGE_EJECTION_CONTROL.
>
> DeviceIoControl( ) itself returns error (Code: 87, Param Incorrect).
>
> Am sure the params are correct.
>
> (Input buff: Address of BOOL var, even with BOOLEAN I tried. Both
> returns 87)
>
> But, IOCTL_STORAGE_MEDIA_REMOVAL returns success with same params
passed
> for IOCTL_STORAGE_EJECTION_CONTROL.
>
> Why IOCTL_STORAGE_EJECTION_CONTROL is NOT working ???
>
> Thanks,
> Sathya

Dear Sathya,

Try IOCTL_STORAGE_MEDIA_REMOVAL instead. I’m not sure what’s different
between that and IOCTL_STORAGE_EJECTION_CONTROL, except that the former
seems to work as documented while the latter does not. Perhaps there’s
an error in the documentation. Maybe someone from MS could comment on
this?

Chuck

P.S. BTW, you should be using BOOLEAN. The call is expecting the input
buffer size to be 1. Even better, use the PREVENT_MEDIA_REMOVAL
structure as specified in the docs, and don’t worry about it.

----- Original Message -----
From: “Sathyanarayanan Srinivasan”

To: “NT Developers Interest List”
Sent: Monday, December 02, 2002 11:46 AM
Subject: [ntdev] RE: Removable media - IOCTL_STORAGE_EJECTION_CONTROL

> Please have the code below…
>
>
> ---------------------- Start :
Code -----------------------------------
>
> #define DEVICE_TO_TEST “\\.\G:” // My CD Drive letter
>
> void LockDevice()
> {
> HANDLE handl;
> GET_LENGTH_INFORMATION lenInfo;
> DWORD somevar = 0;
> DWORD RetVal = 0;
> char str[256];
>
> handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
> , NULL, OPEN_EXISTING,
> FILE_ATTRIBUTE_NORMAL, NULL);
> if (handl == INVALID_HANDLE_VALUE)
> {
> RetVal = GetLastError();
> sprintf(str,“Createfile failed %d”,RetVal);
> AfxMessageBox(str);
> return;
> }
>
> if (!DeviceIoControl(handl, IOCTL_STORAGE_LOAD_MEDIA, NULL,
> 0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_LOAD_MEDIA failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> if (!DeviceIoControl(handl, IOCTL_STORAGE_CHECK_VERIFY, NULL,
> 0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_CHECK_VERIFY failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
>
> BOOL prev = TRUE; // BOOL is int, BOOLEAN (char) also didn’t
> work…
> if (!DeviceIoControl(handl, IOCTL_STORAGE_EJECTION_CONTROL,
> (LPVOID) &prev,
> sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
> NULL))
> {
> RetVal = GetLastError(); // Returns 87 (Parameter
> incorrect)
> sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> CloseHandle(handl);
> AfxMessageBox(“Locked”);
> }
>
> void UnlockDevice()
> {
> HANDLE handl;
> GET_LENGTH_INFORMATION lenInfo;
> DWORD somevar = 0;
> DWORD RetVal = 0;
> char str[256];
>
> handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
> , NULL, OPEN_EXISTING,
> FILE_ATTRIBUTE_NORMAL, NULL);
> if (handl == INVALID_HANDLE_VALUE)
> {
> RetVal = GetLastError();
> sprintf(str,“Createfile failed %d”,RetVal);
> AfxMessageBox(str);
> return;
> }
>
>
> BOOL prev = FALSE;
> if (!DeviceIoControl(handl,
> IOCTL_STORAGE_EJECTION_CONTROL, (LPVOID) &prev,
> sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
> NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> CloseHandle(handl);
> AfxMessageBox(“Unlocked”);
> }
>
> ---------------------- End :
Code --------------------------------------

Hi Chuck,

[1] The diff between IOCTL_STORAGE_MEDIA_REMOVAL and
IOCTL_STORAGE_EJECTION_CONTROL is,

{1.a} When Driver receives IOCTL_STORAGE_MEDIA_REMOVAL (Lock) from a
caller (say, Appln #1), then it would lock the
media. Later, it would unlock when it receives
IOCTL_STORAGE_MEDIA_REMOVAL (Unlock) from ANY CALLER (say, appln #2).

{1.b} Where as in case of IOCTL_STORAGE_EJECTION_CONTROL, driver
remembers which caller has locked it (Appln #1). It would UnLock ONLY
when the IOCTL_STORAGE_EJECTION_CONTROL (Unlock) command comes from the
SAME caller (Appln #1) who has locked it.

[2] I badly, need to use IOCTL_STORAGE_EJECTION_CONTROL for my
requirement.

[3] I tried with all data types, BOOL, BOOLEAN &
PREVENT_MEDIA_REMOVAL…NOTHING WORKS for
IOCTL_STORAGE_EJECTION_CONTROL.

ANYBODY COULD GIVE SOME INFO WHY THIS IS NOT WORKING ???

Thanks,
Sathya

-----Original Message-----
From: Chuck Batson [mailto:xxxxx@cbatson.com]
Sent: Monday, December 02, 2002 4:04 PM
Subject: RE: Removable media - IOCTL_STORAGE_EJECTION_CONTROL

Dear Sathya,

Try IOCTL_STORAGE_MEDIA_REMOVAL instead. I’m not sure what’s different
between that and IOCTL_STORAGE_EJECTION_CONTROL, except that the former
seems to work as documented while the latter does not. Perhaps there’s
an error in the documentation. Maybe someone from MS could comment on
this?

Chuck

P.S. BTW, you should be using BOOLEAN. The call is expecting the input
buffer size to be 1. Even better, use the PREVENT_MEDIA_REMOVAL
structure as specified in the docs, and don’t worry about it.

----- Original Message -----
From: “Sathyanarayanan Srinivasan”

To: “NT Developers Interest List”
Sent: Monday, December 02, 2002 11:46 AM
Subject: [ntdev] RE: Removable media - IOCTL_STORAGE_EJECTION_CONTROL

> Please have the code below…
>
>
> ---------------------- Start :
Code -----------------------------------
>
> #define DEVICE_TO_TEST “\\.\G:” // My CD Drive letter
>
> void LockDevice()
> {
> HANDLE handl;
> GET_LENGTH_INFORMATION lenInfo;
> DWORD somevar = 0;
> DWORD RetVal = 0;
> char str[256];
>
> handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
> , NULL, OPEN_EXISTING,
> FILE_ATTRIBUTE_NORMAL, NULL);
> if (handl == INVALID_HANDLE_VALUE)
> {
> RetVal = GetLastError();
> sprintf(str,“Createfile failed %d”,RetVal);
> AfxMessageBox(str);
> return;
> }
>
> if (!DeviceIoControl(handl, IOCTL_STORAGE_LOAD_MEDIA, NULL,
> 0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_LOAD_MEDIA failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> if (!DeviceIoControl(handl, IOCTL_STORAGE_CHECK_VERIFY, NULL,
> 0, NULL, 0, &somevar, (LPOVERLAPPED) NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_CHECK_VERIFY failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
>
> BOOL prev = TRUE; // BOOL is int, BOOLEAN (char) also didn’t
> work…
> if (!DeviceIoControl(handl, IOCTL_STORAGE_EJECTION_CONTROL,
> (LPVOID) &prev,
> sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
> NULL))
> {
> RetVal = GetLastError(); // Returns 87 (Parameter
> incorrect)
> sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> CloseHandle(handl);
> AfxMessageBox(“Locked”);
> }
>
> void UnlockDevice()
> {
> HANDLE handl;
> GET_LENGTH_INFORMATION lenInfo;
> DWORD somevar = 0;
> DWORD RetVal = 0;
> char str[256];
>
> handl = CreateFile(DEVICE_TO_TEST, GENERIC_READ, FILE_SHARE_READ
> , NULL, OPEN_EXISTING,
> FILE_ATTRIBUTE_NORMAL, NULL);
> if (handl == INVALID_HANDLE_VALUE)
> {
> RetVal = GetLastError();
> sprintf(str,“Createfile failed %d”,RetVal);
> AfxMessageBox(str);
> return;
> }
>
>
> BOOL prev = FALSE;
> if (!DeviceIoControl(handl,
> IOCTL_STORAGE_EJECTION_CONTROL, (LPVOID) &prev,
> sizeof(BOOL), NULL, 0, &somevar, (LPOVERLAPPED)
> NULL))
> {
> RetVal = GetLastError();
> sprintf(str,“IOCTL_STORAGE_EJECTION_CONTROL failed
> %d”,RetVal);
> AfxMessageBox(str);
> CloseHandle(handl);
> return;
> }
>
> CloseHandle(handl);
> AfxMessageBox(“Unlocked”);
> }
>
> ---------------------- End :
Code --------------------------------------