/*++

Copyright (c) 1993  Microsoft Corporation
Copyright (c) 1996  Intel Corporation

Module Name:

    Sample.h

Abstract:
        Header file for the Sample USB Device Driver


Environment:

    Kernel & user mode

Revision History:

        8-15-96 : created by Kosar Jaff


--*/

#ifdef DRIVER

#define Sample_NAME_MAX  64


//modes
#define Sample_MODE_USE_POOL    0
#define Sample_MODE_USE_MDL     1

//options
#define Sample_OPT_NONE         0

/*
// This is an unused structure in this driver, but is provided here
// so when you extend the driver to deal with USB pipes, you may wish
// to use this structure as an example or model.
*/
typedef struct _Sample_PIPE {
    ULONG Mode;
    ULONG Option;
    ULONG Param1;
    ULONG Param2;
    PUSBD_PIPE_INFORMATION PipeInfo;
} Sample_PIPE, *PSample_PIPE;


/*
// The interface number on this device that this driver expects to use
// This would be in the bInterfaceNumber field of the Interface Descriptor, hence
// this device driver would need to know this value.
*/
#define SAMPLE_INTERFACE_NBR 0x00

// This driver supports only interface
#define MAX_INTERFACE 0x01

//
// A structure representing the instance information associated with
// this particular device.
//
typedef struct _DEVICE_EXTENSION {

    // physical device object
    PDEVICE_OBJECT PhysicalDeviceObject;        

    // Device object we call when submitting Urbs/Irps to the USB stack
    PDEVICE_OBJECT		StackDeviceObject;		

    // Indicates that we have recieved a STOP message
    BOOLEAN Stopped;

        // Indicates the device needs to be cleaned up (ie., some configuration
        // has occurred and needs to be torn down).
        BOOLEAN NeedCleanup;

    // configuration handle for the configuration the
    // device is currently in
    USBD_CONFIGURATION_HANDLE ConfigurationHandle;

    // ptr to the USB device descriptor
    // for this device
    PUSB_DEVICE_DESCRIPTOR DeviceDescriptor;

    // we support up to one interface
    PUSBD_INTERFACE_INFORMATION Interface;

    // Name buffer for our named Functional device object link
    WCHAR DeviceLinkNameBuffer[Sample_NAME_MAX];

        UCHAR pad[3];

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


#if DBG

#define Sample_KdPrint(_x_) DbgPrint("Sample.SYS: "); \
                             DbgPrint _x_ ;
#define TRAP() DbgBreakPoint()
#else
#define Sample_KdPrint(_x_)
#define TRAP()
#endif

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

NTSTATUS
Sample_Dispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    );

VOID
Sample_Unload(
    IN PDRIVER_OBJECT DriverObject
    );

NTSTATUS
Sample_StartDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
Sample_StopDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
Sample_RemoveDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
Sample_CallUSBD(
    IN PDEVICE_OBJECT DeviceObject,
    IN PURB Urb
    );

NTSTATUS
Sample_PnPAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    );

NTSTATUS
Sample_CreateDeviceObject(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT *DeviceObject,
    LONG Instance
    );

NTSTATUS
Sample_ConfigureDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
Sample_Create(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
Sample_Close(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
Sample_Read_Write (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN  BOOLEAN Read
    );

NTSTATUS
Sample_ProcessIOCTL(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
Sample_SelectInterfaces(
    IN PDEVICE_OBJECT DeviceObject,
    IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
    IN PUSBD_INTERFACE_INFORMATION Interface
    );

//PUSB_CONFIGURATION_DESCRIPTOR
//Sample_GetConfigDescriptor(
//    IN PDEVICE_OBJECT DeviceObject
//    );


VOID
Sample_Cleanup(
    PDEVICE_OBJECT DeviceObject
    );

ULONG
Sample_GetDeviceDescriptor(
    IN PDEVICE_OBJECT DeviceObject,
    PVOID             pvOutputBuffer
    );

ULONG
Sample_GetConfigDescriptor(
    IN PDEVICE_OBJECT DeviceObject,
    PVOID             pvOutputBuffer,
    ULONG             ulLength
    );

#endif      //DRIVER section


/*
///////////////////////////////////////////////////////
//
//              IOCTL Definitions
//
// User mode applications wishing to send IOCTLs to a kernel mode driver
// must use this file to set up the correct type of IOCTL code permissions.
//
// Note: this file depends on the file DEVIOCTL.H which contains the macro
// definition for "CTL_CODE" below.  Include that file before  you include
// this one in your source code.
//
///////////////////////////////////////////////////////
*/

/*
// Set the base of the IOCTL control codes.  This is somewhat of an
// arbitrary base number, so you can change this if you want unique
// IOCTL codes.  You should consult the Windows NT DDK for valid ranges
// of IOCTL index codes before you choose a base index number.
*/

#define Sample_IOCTL_INDEX  0x0800


#define IOCTL_Sample_GET_PIPE_INFO     CTL_CODE(FILE_DEVICE_UNKNOWN,  \
                                                   Sample_IOCTL_INDEX+0,\
                                                   METHOD_BUFFERED,  \
                                                   FILE_ANY_ACCESS)

#define IOCTL_Sample_GET_DEVICE_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN,  \
                                                   Sample_IOCTL_INDEX+1,\
                                                   METHOD_BUFFERED,  \
                                                   FILE_ANY_ACCESS)

#define IOCTL_Sample_GET_CONFIGURATION_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN,  \
                                                   Sample_IOCTL_INDEX+2,\
                                                   METHOD_BUFFERED,  \
                                                   FILE_ANY_ACCESS)

#define IOCTL_Sample_BULK_OR_INTERRUPT_WRITE     CTL_CODE(FILE_DEVICE_UNKNOWN,  \
                                                   Sample_IOCTL_INDEX+3,\
                                                   METHOD_BUFFERED,  \
                                                   FILE_ANY_ACCESS)

#define IOCTL_Sample_BULK_OR_INTERRUPT_READ      CTL_CODE(FILE_DEVICE_UNKNOWN,  \
                                                   Sample_IOCTL_INDEX+4,\
                                                   METHOD_BUFFERED,  \
                                                   FILE_ANY_ACCESS)

/*
// To add more IOCTLs, make sure you add a different offset to the
// Sample_IOCTL_INDEX value in the CTL_CODE macro.
*/