// Gemplus (C) 1999 // // Version 1.0 // Author: Sergey Ivanov // Date of creation - 04.03.1999 // Change log: // #ifndef USB_DEV #define USB_DEV #include "wdmdev.h" #include "debug.h" #ifdef __cplusplus extern "C" { #endif #pragma warning (disable:4200) #include #include #pragma warning (default:4200) #ifdef __cplusplus } #endif // Type of request driver can construct #define COMMAND_REQUEST 1 #define RESPONSE_REQUEST 2 #define INTERRUPT_REQUEST 3 // Default buffers' sizes (4k) // This values will be used as a requests to the bus driver. // It looks like bus driver will not accept values greater then these. // It will complain with "invalid parameter" status. // ??? Is this limitation of bus driver or our driver design? #define DEFAULT_COMMAND_BUFFER_SIZE 0x100 #define DEFAULT_RESPONSE_BUFFER_SIZE 0x100 #define DEFAULT_INTERRUPT_BUFFER_SIZE 0x100 // If we set Xfer size greater then 256, bus driver crashes with GPF // The problem still is under investigation... #define GUR_MAX_TRANSFER_SIZE 256 #pragma LOCKEDCODE // Power request callback NTSTATUS onPowerRequestCompletion(IN PDEVICE_OBJECT DeviceObject,IN UCHAR MinorFunction, IN POWER_STATE PowerState,IN PVOID Context,IN PIO_STATUS_BLOCK IoStatus); NTSTATUS onPowerIrpComplete(IN PDEVICE_OBJECT NullDeviceObject,IN PIRP Irp,IN PVOID Context); #pragma PAGEDCODE class CWDMDevice; class CUSBDevice : public CWDMDevice { public: NTSTATUS m_Status; SAFE_DESTRUCTORS(); private: ULONG Idle_conservation; ULONG Idle_performance; // Max xfer size with our device ULONG m_MaximumTransferSize; // USB device endpoints USBD_PIPE_HANDLE m_ControlPipe; USBD_PIPE_HANDLE m_InterruptPipe; USBD_PIPE_HANDLE m_ResponsePipe; USBD_PIPE_HANDLE m_CommandPipe; // ptr to the USB device descriptor // for this device PUSB_DEVICE_DESCRIPTOR m_DeviceDescriptor; // USB configuration handle and ptr for the configuration the // device is currently in USBD_CONFIGURATION_HANDLE m_ConfigurationHandle; PUSB_CONFIGURATION_DESCRIPTOR m_Configuration; // we support one interface // this is a copy of the info structure // returned from select_configuration or // select_interface PUSBD_INTERFACE_INFORMATION m_Interface; //Bus drivers set the appropriate values in this structure in response //to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might //alter the capabilities set by the bus driver. DEVICE_CAPABILITIES Capabilities; // used to save the currently-being-handled system-requested power irp request //PIRP PowerIrp; // Xfer buffers will be dynamically allocated at device start ULONG ResponseBufferLength; PVOID m_ResponseBuffer;// Bulk IN pipe LONG Response_ErrorNum; ULONG CommandBufferLength; PVOID m_CommandBuffer;// Bulk OUT pipe LONG Command_ErrorNum; ULONG InterruptBufferLength; PVOID m_InterruptBuffer;// Interrupt IN pipe LONG Interrupt_ErrorNum; public: CUSBDevice(); ~CUSBDevice(); virtual VOID dispose() { removeRef(); if(!getRefCount()) self_delete(); else { TRACE("FAILED TO DISPOSE OBJECT! refcount %x\n",getRefCount()); } }; protected: virtual NTSTATUS PnPHandler(LONG HandlerID,IN PIRP Irp); virtual NTSTATUS PnP_HandleRemoveDevice(IN PIRP Irp); virtual NTSTATUS PnP_HandleStartDevice(IN PIRP Irp); virtual NTSTATUS PnP_HandleStopDevice(IN PIRP Irp); virtual NTSTATUS PnP_StartDevice(); virtual VOID PnP_StopDevice(); virtual NTSTATUS PnP_HandleQueryRemove(IN PIRP Irp); virtual NTSTATUS PnP_HandleCancelRemove(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryStop(IN PIRP Irp); virtual NTSTATUS PnP_HandleCancelStop(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryRelations(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryInterface(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryCapabilities(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryResources(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryResRequirements(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryText(IN PIRP Irp); virtual NTSTATUS PnP_HandleFilterResRequirements(IN PIRP Irp); virtual NTSTATUS PnP_HandleReadConfig(IN PIRP Irp); virtual NTSTATUS PnP_HandleWriteConfig(IN PIRP Irp); virtual NTSTATUS PnP_HandleEject(IN PIRP Irp); virtual NTSTATUS PnP_HandleSetLock(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryID(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryPnPState(IN PIRP Irp); virtual NTSTATUS PnP_HandleQueryBusInfo(IN PIRP Irp); virtual NTSTATUS PnP_HandleUsageNotification(IN PIRP Irp); virtual NTSTATUS PnP_HandleSurprizeRemoval(IN PIRP Irp); private: // USB device support functions PURB buildBusTransferRequest(CIoPacket* Irp,UCHAR Command); VOID finishBusTransferRequest(CIoPacket* Irp,UCHAR Command); NTSTATUS QueryBusCapabilities(PDEVICE_CAPABILITIES Capabilities); PUSB_DEVICE_DESCRIPTOR getDeviceDescriptor(); PUSB_CONFIGURATION_DESCRIPTOR getConfigurationDescriptor(); PUSBD_INTERFACE_INFORMATION activateInterface(PUSB_CONFIGURATION_DESCRIPTOR Configuration); NTSTATUS disactivateInterface(); // NTSTATUS resetDevice(); NTSTATUS resetPipe(IN USBD_PIPE_HANDLE Pipe); NTSTATUS resetAllPipes(); NTSTATUS abortPipes(); // Low level communication functions... virtual NTSTATUS sendRequestToDevice(CIoPacket* Irp,PIO_COMPLETION_ROUTINE Routine); virtual NTSTATUS sendRequestToDeviceAndWait(CIoPacket* Irp); // Handle requests for specific pipes.. virtual NTSTATUS readSynchronously(CIoPacket* Irp,IN USBD_PIPE_HANDLE Pipe); virtual NTSTATUS writeSynchronously(CIoPacket* Irp,IN USBD_PIPE_HANDLE Pipe); // Support for the reader interface virtual NTSTATUS send(CIoPacket* Irp); virtual NTSTATUS sendAndWait(CIoPacket* Irp); // virtual NTSTATUS writeAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength); // virtual NTSTATUS readAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength); public: virtual NTSTATUS writeAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength); virtual NTSTATUS readAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength); virtual NTSTATUS pnpRequest(IN PIRP Irp); #define _POWER_ #ifdef _POWER_ // POWER MANAGEMENT FUNCTIONS virtual NTSTATUS powerRequest(IN PIRP Irp); virtual VOID activatePowerHandler(LONG HandlerID); virtual VOID disActivatePowerHandler(LONG HandlerID); virtual NTSTATUS callPowerHandler(LONG HandlerID,IN PIRP Irp); virtual BOOLEAN setDevicePowerState(IN DEVICE_POWER_STATE DeviceState); virtual VOID onSystemPowerDown(); virtual VOID onSystemPowerUp(); // Handlers virtual NTSTATUS power_HandleSetPower(IN PIRP Irp); virtual NTSTATUS power_HandleWaitWake(IN PIRP Irp); virtual NTSTATUS power_HandleSequencePower(IN PIRP Irp); virtual NTSTATUS power_HandleQueryPower(IN PIRP Irp); // callback #endif // USB device specific implementations of system callbacks // They ovewrite base class defaults. virtual NTSTATUS open(PIRP Irp) { TRACE("***** USB OPEN DEVICE *****\n"); if (!NT_SUCCESS(acquireRemoveLock())) return completeDeviceRequest(Irp, STATUS_DELETE_PENDING, 0); releaseRemoveLock(); return completeDeviceRequest(Irp, STATUS_SUCCESS, 0); };//Create virtual NTSTATUS close(PIRP Irp) { TRACE("***** USB CLOSE DEVICE *****\n"); return completeDeviceRequest(Irp, STATUS_SUCCESS, 0); }; virtual NTSTATUS deviceControl(IN PIRP Irp); virtual NTSTATUS read(IN PIRP Irp); virtual NTSTATUS write(IN PIRP Irp); virtual NTSTATUS createDeviceObjectByName(PDEVICE_OBJECT* ppFdo); }; #endif // If defined