⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.h

📁 usbhostDriver, 设计USB的目标就是使不同厂家所生产的设备可以在一个开放的体系下广泛的使用。该规范改进了便携商务或家用电脑的现有体系结构
💻 H
字号:
/*
**********************************************************************
*                          Micrium, Inc.
*                      949 Crestview Circle
*                     Weston,  FL 33327-1848
*
*                           uC/USB-Bulk
*
*             (c) Copyright 2003 - 2004, Micrium, Inc.
*                      All rights reserved.
*
***********************************************************************

----------------------------------------------------------------------
File        : Main.h
Purpose     : Main include of the USB bulk driver
---------------------------END-OF-HEADER------------------------------
*/

#ifndef _MAIN_H
#define _MAIN_H


#include "Conf.h"
#include <initguid.h>
#include <wdm.h>
#include <wmilib.h>
#include <wmistr.h>
#include "usbdi.h"
#include "usbdlib.h"



#define USB_BULK_TAG (ULONG) 'kluB'

#define BULKUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE (64 *1024 )


#undef ExAllocatePool
#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, USB_BULK_TAG);

#if DBG
  #define DPRINT(_s) DbgPrint _s
#else
  #define DPRINT(_s)
#endif


#define IOCTL_USER                           0x0111
#define IOCTL_USB_BULK_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_USB_BULK_RESET_DEVICE          CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_USB_BULK_RESET_PIPE            CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+2, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct _GLOBALS {
    UNICODE_STRING RegPath;
} GLOBALS;

typedef enum _DEVSTATE {
    NotStarted,         // not started
    Stopped,            // device stopped
    Working,            // started and working
    PendingStop,        // stop pending
    PendingRemove,      // remove pending
    SurpriseRemoved,    // removed by surprise
    Removed             // removed
} DEVSTATE;

typedef enum _QUEUE_STATE {
    HoldRequests,       // device is not started yet
    AllowRequests,      // device is ready to process
    FailRequests        // fail both existing and queued up requests
} QUEUE_STATE;

typedef enum _WDM_VERSION {
    WinXpOrBetter,
    Win2kOrBetter,
    WinMeOrBetter,
    Win98OrBetter
} WDM_VERSION;

#define INITIALIZE_PNP_STATE(_Data_)    \
        (_Data_)->DeviceState =  NotStarted;\
        (_Data_)->PrevDevState = NotStarted;

#define SET_NEW_PNP_STATE(_Data_, _state_) \
        (_Data_)->PrevDevState =  (_Data_)->DeviceState;\
        (_Data_)->DeviceState = (_state_);

#define RESTORE_PREVIOUS_PNP_STATE(_Data_)   \
        (_Data_)->DeviceState =   (_Data_)->PrevDevState;



typedef struct _USB_PIPE_CONTEXT {
    BOOLEAN PipeOpen;
} USB_PIPE_CONTEXT, *PUSB_PIPE_CONTEXT;

//
// A structure representing the instance information associated with
// this particular device.
//

typedef struct _DEVICE_EXTENSION {
  PDEVICE_OBJECT FunctionalDeviceObject; // fdo
  PDEVICE_OBJECT TopOfStackDeviceObject; // lower device
  PDEVICE_OBJECT PhysicalDeviceObject;   // pdo

  UNICODE_STRING InterfaceName; // fdo name
  DEVICE_CAPABILITIES DeviceCapabilities; // filled by pdo (IRP_MN_QUERY_CAPABILITIES)

  PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor; // Configuration Descriptor
  PUSBD_INTERFACE_INFORMATION UsbInterface; // interface info
  PUSB_PIPE_CONTEXT PipeContext; // pipes info

  DEVSTATE DeviceState;        // current device state
  DEVSTATE PrevDevState;       // state prior to removal query
  KSPIN_LOCK DevStateLock;     // lock for changing device state
  SYSTEM_POWER_STATE SysPower; // system power state
  DEVICE_POWER_STATE DevPower; // device power state

  QUEUE_STATE QueueState;      // pending I/O queue state
  LIST_ENTRY NewRequestsQueue; // pending I/O queue
  KSPIN_LOCK QueueLock;        // I/O queue lock
  KEVENT RemoveEvent;          // remote event
  KEVENT StopEvent;            // stop event
  ULONG OutStandingIO;         // I/O count bias to 1
  KSPIN_LOCK IOCountLock;      // lock for I/O count

  LONG OpenHandleCount;        // open handle count

  // following are self-suspend & remote wake up var (TO REMOVE)
  ULONG PowerDownLevel;
  PIRP WaitWakeIrp;
  LONG FlagWWCancel;
  LONG FlagWWOutstanding;
  LONG WaitWakeEnable;
  //
  // Read Buffer 
  //
  KSPIN_LOCK BufferLock;        // lock
  char       acBuffer[0x1000];
  int        NumBytesInBuffer;
} DEVICE_EXTENSION;


typedef struct _IRP_COMPLETION_CONTEXT {
    DEVICE_EXTENSION * DeviceExtension;
    PKEVENT Event;
} IRP_COMPLETION_CONTEXT;


extern GLOBALS Globals;

//
// PNP
//
#define REMOTE_WAKEUP_MASK 0x20

NTSTATUS BulkUsb_DispatchPnP( IN DEVICE_OBJECT * DeviceObject, IN PIRP  Irp);
NTSTATUS ConfigureDevice    ( IN DEVICE_OBJECT * DeviceObject);
NTSTATUS CallUSBD( IN PDEVICE_OBJECT DeviceObject, IN PURB           Urb    );
VOID     ProcessQueuedRequests(   IN OUT DEVICE_EXTENSION * DeviceExtension    );
NTSTATUS BulkUsb_AbortPipes(IN PDEVICE_OBJECT DeviceObject );
LONG     DevIoIncrement   (IN OUT DEVICE_EXTENSION * DeviceExtension);
LONG     DevIoDecrement   (IN OUT DEVICE_EXTENSION * DeviceExtension);




NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS ntS, IN ULONG_PTR Info);
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) ;
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchClean(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS ResetPipe(IN PDEVICE_OBJECT DeviceObject,IN PUSBD_PIPE_INFORMATION PipeInfo);
NTSTATUS ResetDevice(IN PDEVICE_OBJECT DeviceObject);





//
// Power
//
NTSTATUS BulkUsb_DispatchPower(  IN PDEVICE_OBJECT DeviceObject, IN PIRP           Irp );
NTSTATUS IssueWaitWake(   IN DEVICE_EXTENSION * DeviceExtension );
VOID     CancelWaitWake(  IN DEVICE_EXTENSION * DeviceExtension );
void     WaitWakeCallback(IN PDEVICE_OBJECT   DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState,
                          IN PVOID  Context,
                          IN PIO_STATUS_BLOCK IoStatus);

//
// RWR
//
NTSTATUS           DispatchRead  (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS           DispatchWrite (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

void MISC_Unicode2ASCII(char * s, UNICODE_STRING * pUni, int MaxBytes);

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -