ntdll: Use the parent device for everything when processing a storage IOCTL request on Mac OS.

This commit is contained in:
Charles Davis 2009-10-14 10:46:46 -06:00 committed by Alexandre Julliard
parent 45905b27db
commit 895be2b0f8
1 changed files with 25 additions and 21 deletions

View File

@ -2334,6 +2334,31 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
goto error; goto error;
} }
#ifdef __APPLE__
{
char name[100];
/* This is ugly as hell, but Mac OS is unable to do anything from the
* partition fd, it wants an fd for the whole device, and it sometimes
* also requires the device fd to be closed first, so we have to close
* the handle that the caller gave us.
* Also for some reason it wants the fd to be closed before we even
* open the parent if we're trying to eject the disk.
*/
if ((status = get_parent_device( fd, name, sizeof(name) ))) goto error;
if (dwIoControlCode == IOCTL_STORAGE_EJECT_MEDIA)
NtClose( hDevice );
if (needs_close) close( fd );
TRACE("opening parent %s\n", name );
if ((fd = open( name, O_RDONLY )) == -1)
{
status = FILE_GetNtStatus();
goto error;
}
needs_close = 1;
}
#endif
switch (dwIoControlCode) switch (dwIoControlCode)
{ {
case IOCTL_STORAGE_CHECK_VERIFY: case IOCTL_STORAGE_CHECK_VERIFY:
@ -2365,28 +2390,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
if (lpInBuffer != NULL || nInBufferSize != 0 || lpOutBuffer != NULL || nOutBufferSize != 0) if (lpInBuffer != NULL || nInBufferSize != 0 || lpOutBuffer != NULL || nOutBufferSize != 0)
status = STATUS_INVALID_PARAMETER; status = STATUS_INVALID_PARAMETER;
else else
{
#ifdef __APPLE__
char name[100];
/* This is ugly as hell, but Mac OS is unable to eject from the device fd,
* it wants an fd for the whole device, and it also requires the device fd
* to be closed first, so we have to close the handle that the caller gave us.
* Also for some reason it wants the fd to be closed before we even open the parent.
*/
if ((status = get_parent_device( fd, name, sizeof(name) ))) break;
NtClose( hDevice );
if (needs_close) close( fd );
TRACE("opening parent %s\n", name );
if ((fd = open( name, O_RDONLY )) == -1)
{
status = FILE_GetNtStatus();
break;
}
needs_close = 1;
#endif
status = CDROM_SetTray(fd, TRUE); status = CDROM_SetTray(fd, TRUE);
}
break; break;
case IOCTL_CDROM_MEDIA_REMOVAL: case IOCTL_CDROM_MEDIA_REMOVAL: