/*++

Copyright (c) 1996, 1997  Microsoft Corporation

Module Name:

    hidmini.h

--*/
#ifndef __HIDMINI_H__
#define __HIDMINI_H__

#include <usb100.h>
#include <hidusage.h>

//
//  Declarations of HID descriptor formats
//

#include <PSHPACK1.H>

typedef struct _USB_HID_DESCRIPTOR
{
    UCHAR   bLength;
    UCHAR   bDescriptorType;
    USHORT  bcdHID;
    UCHAR   bCountry;
    UCHAR   bNumDescriptors;
    UCHAR   bReportType;
    USHORT  wReportLength;

} USB_HID_DESCRIPTOR, * PUSB_HID_DESCRIPTOR;

typedef struct _USB_PHYSICAL_DESCRIPTOR
{
    UCHAR   bNumber;
    USHORT  wLength;

} USB_PHYSICAL_DESCRIPTOR, * PUSB_PHYSICAL_DESCRIPTOR;

typedef UCHAR HID_REPORT_DESCRIPTOR, *PHID_REPORT_DESCRIPTOR;

#include <POPPACK.H>


//
//  Device Extension
//
//  This data structure is hooked onto HIDCLASS' device extension, so both drivers can
//  have their own private data on each device object.
//

typedef struct _DEVICE_EXTENSION
{
    ULONG                           DeviceState;

    USB_HID_DESCRIPTOR              HidDescriptor;
    PHID_REPORT_DESCRIPTOR          ReportDescriptor;
    PUSB_STRING_DESCRIPTOR          StringDescriptor;
    PUSB_PHYSICAL_DESCRIPTOR        PhysicalDescriptor;

    ULONG                           NumPendingRequests;
    KEVENT                          AllRequestsCompleteEvent;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

#define DEVICE_STATE_NONE           0
#define DEVICE_STATE_STARTING       1
#define DEVICE_STATE_RUNNING        2
#define DEVICE_STATE_STOPPING       3
#define DEVICE_STATE_STOPPED        4
#define DEVICE_STATE_REMOVING       5

//
// Device Extension Macros
//

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

#define GET_NEXT_DEVICE_OBJECT(DO) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->NextDeviceObject)

//
// Built In descriptors for this device
//

HID_REPORT_DESCRIPTOR           MyReportDescriptor[];
USB_HID_DESCRIPTOR              MyHidDescriptor;
PUSB_STRING_DESCRIPTOR          MyStringDescriptor;
PUSB_PHYSICAL_DESCRIPTOR        MyPhysicalDescriptor;

#define HIDMINI_PID              0xFEED
#define HIDMINI_VID              0xBEEF
#define HIDMINI_VERSION          0x0101

//
//  IO lists
//

extern KSPIN_LOCK   HidMini_IrpReadLock;
extern KSPIN_LOCK   HidMini_IrpWriteLock;
extern LIST_ENTRY   HidMini_ReadIrpHead;
extern LIST_ENTRY   HidMini_WriteIrpHead;

typedef struct {
    LIST_ENTRY  List;
    union {
        PIRP    Irp;
    };
} NODE, *PNODE;

extern BOOLEAN IsRunning;

//
// Turn on debug printing and breaking, if appropriate
//

#if DBG
#define DBGPrint(arg) DbgPrint arg
#define DBGBREAK DbgBreakPoint()
#else
#define DBGPrint(arg)
#define DBGBREAK
#endif

//
// Function prototypes
//

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING registryPath
    );

NTSTATUS
HidMiniAbortPendingRequests(
    IN PDEVICE_OBJECT DeviceObject
    );

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

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

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


NTSTATUS
HidMiniCreateDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN OUT PDEVICE_OBJECT *DeviceObject
    );

NTSTATUS
HidMiniAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT FunctionalDeviceObject
    );

NTSTATUS
HidMiniStartDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
HidMiniStartCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
HidMiniInitDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
HidMiniStopDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
HidMiniStopCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
HidMiniQueryIDCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
HidMiniRemoveDevice(
    IN  PDEVICE_OBJECT DeviceObject
    );

VOID
HidMiniUnload(
    IN PDRIVER_OBJECT DriverObject
    );

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

NTSTATUS 
HidMiniGetDeviceAttributes(
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp
    );
    
NTSTATUS
HidMiniGetReportDescriptor(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

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

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

NTSTATUS
HidMiniReadCompletion(
    PVOID Context
    );

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

NTSTATUS
HidMiniWriteCompletion(
    VOID
    );

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

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

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

VOID
HidMiniIncrementPendingRequestCount(
    IN PDEVICE_EXTENSION DeviceExtension
    );

VOID
HidMiniDecrementPendingRequestCount(
    IN PDEVICE_EXTENSION DeviceExtension
    );

#endif // _HIDMINI_H__