/*++

Copyright (c) 1992  Microsoft Corporation


Module Name:


    cdsys.c


Abstract:


    This module implements the routines that call the
    NT CDROM driver directly.  This is low level manipulation,
    and would most likely be non-portable to other environments.


Author:


    Rick Turner (ricktu) 18-Feb-1992


Revision History:



--*/

#include "cdsys.h"
#include <ntdddisk.h>
#include <memory.h>
#include <windows.h>

DWORD
GetCdromTOC(
    IN HANDLE DeviceHandle,
    IN OUT PCDROM_TOC TocPtr
    )

/*++

Routine Description:

    This routine will get the table of contents from
    a CDRom device.

Arguments:

    DeviceHandle - Handle to CDRom device to retrieve information from.
    TocPtr - A pointer to a CDROM_TOC structure to be filled in by
             this routine.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;
    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_READ_TOC,
                         NULL,
                         0,
                         (LPVOID)TocPtr,
                         sizeof(CDROM_TOC),
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }

} // GetCdromTOC


DWORD
StopCdrom(
    IN HANDLE DeviceHandle
    )

/*++

Routine Description:

    This routine will stop a CDRom device that is playing.

Arguments:

    DeviceHandle - Handle to CDRom device to stop.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;

    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_STOP_AUDIO,
                         NULL,
                         0,
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }


} // StopCdrom


DWORD
PauseCdrom(
    IN HANDLE DeviceHandle
    )

/*++

Routine Description:

    This routine will pause a CDRom device.

Arguments:

    DeviceHandle - Handle to CDRom device to pause.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;

    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_PAUSE_AUDIO,
                         NULL,
                         0,
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }


} // PauseCdrom


DWORD
ResumeCdrom(
    IN HANDLE DeviceHandle
    )

/*++

Routine Description:

    This routine will resume a paused CDRom device.

Arguments:

    DeviceHandle - Handle to CDRom device to resume.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;

    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_RESUME_AUDIO,
                         NULL,
                         0,
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }
} // ResumeCdrom



DWORD
PlayCdrom(
    IN HANDLE DeviceHandle,
    IN PCDROM_PLAY_AUDIO_MSF PlayAudioPtr
    )

/*++

Routine Description:

    This routine plays a CDRom device starting and ending at the MSF
    positions specified in the structure passed in.

Arguments:

    DeviceHandle - Handle to CDRom device to retrieve information from.
    PlayAudioPtr - A pointer to a CDROM_PLAY_AUDIO_MSF structure.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;

    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_PLAY_AUDIO_MSF,
                         (LPVOID)PlayAudioPtr,
                         sizeof(CDROM_PLAY_AUDIO_MSF),
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }
} // PlayCdrom



DWORD
GetCdromSubQData(
    IN HANDLE DeviceHandle,
    IN OUT PSUB_Q_CHANNEL_DATA SubQDataPtr,
    IN PCDROM_SUB_Q_DATA_FORMAT SubQFormatPtr
    )

/*++

Routine Description:

    This routine reads the Sub Q Channel Data

Arguments:

    DeviceHandle - Handle to CDRom device to retrieve information from.
    SubQPtr - A pointer to a SUB_Q_CHANNEL_DATA structure to be filled in by
              this routine.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;

    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_READ_Q_CHANNEL,
                         (LPVOID)SubQFormatPtr,
                         sizeof(CDROM_SUB_Q_DATA_FORMAT),
                         (LPVOID)SubQDataPtr,
                         sizeof(SUB_Q_CHANNEL_DATA),
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }
}


DWORD
SeekCdrom(
    IN HANDLE DeviceHandle,
    IN PCDROM_SEEK_AUDIO_MSF SeekAudioPtr
    )

/*++

Routine Description:

    This routine seek to an MSF address on the audio CD and enters
    a hold (paused) state.

Arguments:

    DeviceHandle - Handle to CDRom device to seek
    SeekAudioPtr - A pointer to a CDROM_SEEK_AUDIO_MSF structure.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;


    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_SEEK_AUDIO_MSF,
                         (LPVOID)SeekAudioPtr,
                         sizeof(CDROM_SEEK_AUDIO_MSF),
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }
} // SeekCdrom


DWORD
EjectCdrom(
    IN HANDLE DeviceHandle
    )

/*++

Routine Description:

    This routine will eject a disc from a CDRom device.

Arguments:

    DeviceHandle - Handle to CDRom device to eject.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;


    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_CDROM_EJECT_MEDIA,
                         NULL,
                         0,
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }

} // EjectCdrom


DWORD
TestUnitReadyCdrom(
    IN HANDLE DeviceHandle
    )

/*++

Routine Description:

    This routine will retrieve the status of the
    CDRom device.

Arguments:

    DeviceHandle - Handle to CDRom to query.

Return Value:

    NTSTATUS

--*/

{
//    IO_STATUS_BLOCK  statusBlock;


    DWORD bytesRead;


    if (DeviceIoControl( DeviceHandle,
                         IOCTL_DISK_CHECK_VERIFY,
                         NULL,
                         0,
                         NULL,
                         0,
                         &bytesRead,
                         NULL )) {

        return( ERROR_SUCCESS );

    } else {

        return( GetLastError() );

    }
} // TestUnitReady