/*
 * COPYRIGHT:       See COPYING in the top level directory
 * PROJECT:         Parallel Port Function Driver
 * PURPOSE:         Parport driver loading/unloading
 */

#include "parport.h"

static DRIVER_UNLOAD DriverUnload;
static DRIVER_DISPATCH DispatchCreate;
static DRIVER_DISPATCH DispatchClose;
static DRIVER_DISPATCH DispatchCleanup;
static DRIVER_DISPATCH DispatchPnp;
static DRIVER_DISPATCH DispatchPower;
DRIVER_INITIALIZE DriverEntry;


/* FUNCTIONS ****************************************************************/

static
VOID
NTAPI
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
    DPRINT("Parport DriverUnload\n");
}


static
NTSTATUS
NTAPI
DispatchCreate(IN PDEVICE_OBJECT DeviceObject,
               IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoCreate(DeviceObject, Irp);
    else
        return PdoCreate(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchClose(IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoClose(DeviceObject, Irp);
    else
        return PdoClose(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchCleanup(IN PDEVICE_OBJECT DeviceObject,
                IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoCleanup(DeviceObject, Irp);
    else
        return PdoCleanup(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchRead(IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoRead(DeviceObject, Irp);
    else
        return PdoRead(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchWrite(IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoWrite(DeviceObject, Irp);
    else
        return PdoWrite(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchPnp(IN PDEVICE_OBJECT DeviceObject,
            IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoPnp(DeviceObject, Irp);
    else
        return PdoPnp(DeviceObject, Irp);
}


static
NTSTATUS
NTAPI
DispatchPower(IN PDEVICE_OBJECT DeviceObject,
              IN PIRP Irp)
{
    if (((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Common.IsFDO)
        return FdoPower(DeviceObject, Irp);
    else
        return PdoPower(DeviceObject, Irp);
}


NTSTATUS
NTAPI
DriverEntry(IN PDRIVER_OBJECT DriverObject,
            IN PUNICODE_STRING RegPath)
{
    ULONG i;

    DPRINT("Parport DriverEntry\n");

    DriverObject->DriverUnload = DriverUnload;
    DriverObject->DriverExtension->AddDevice = AddDevice;

    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
        DriverObject->MajorFunction[i] = ForwardIrpAndForget;

    DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
    DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
    DriverObject->MajorFunction[IRP_MJ_READ] = DispatchRead;
    DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchWrite;
//    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
//    DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = DispatchQueryInformation;
    DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
    DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;

    return STATUS_SUCCESS;
}