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

📄 vcp4usb.h

📁 USBconvert232 USB转232驱动源程序
💻 H
字号:
#ifndef VCP4USB_INCD
#define VCP4USB_INCD

#ifdef __cplusplus
extern "C" {
#endif
    
#include "ntddk.h"
#include "ntddser.h" // for serial port
    
#include <initguid.h>
    //TODO: guid for XXXX device
    DEFINE_GUID(GUID_CLASS_XXXX_BULK, 
        ......);
#define XXXX_SYMLINK_CMPSTR L"\\??\\USB#Vid_xxxx&Pid_xxxx"
#define XXXX_SYMLINK_STRLEN (25 * sizeof(WCHAR))
    
#if DBG
    
    extern int gDebugLevel; 
    
#define DBGPRINT DbgPrint
    
#define DTrap() DbgBreakPoint()
    
#define DPrint(_level_, _x_) \
    do { \
    if (gDebugLevel & _level_) { \
    DBGPRINT(" Vcp4usb: " ); \
    DBGPRINT _x_ ; \
    } \
    }while(0)
    
#define DPrintHex(_level_, _x_, _val_, _len_) \
    do { \
    if ((gDebugLevel & _level_) && (_len_ > 0)) { \
    DBGPRINT(" Vcp4usb: " ); \
    DBGPRINT _x_ ; \
    DBGPRINT(" len=%d ", _len_); \
    DBGPRINT(" buf="); \
    for (ULONG i=0; i<_len_; i++) \
    DBGPRINT("0x%x ", _val_[i]); \
    } \
    DBGPRINT("\n"); \
    }while(0)
    
#else
    
#define DTrap()
#define DPrint(_level_, _x_)
#define DPrintHex(_level_, _x_, _val_, _len_)
    
#endif // DBG
    
    // Define debug level
#define DBG_ALL         0x3FFFFFFF
#define DBG_ENTRY       0x00000001
#define DBG_PNP         0x00000002
#define DBG_POWER       0x00000004
#define DBG_SYSCONTRAL  0x00000008
#define DBG_DRVCONTRAL  0x00000010
#define DBG_CREATE      0x00000020
#define DBG_CLOSE       0x00000040
#define DBG_READ        0x00000080
#define DBG_WRITE       0x00000100
#define DBG_THREAD      0x00000200
#define DBG_DATA        0x00000400
#define DBG_DATALOG     0x00000800
#define DBG_SPEC        0x40000000
#define DBG_OTHER       0x80000000
    
#define VCP4USB_DEVICE_NAME L"\\Device\\Vcp4Usb"
#define VCP4USB_NAME L"Vcp4usb"
#define SERIAL_DEVICE_MAP L"SERIALCOMM"
#define VCP4USB_VERSION "Version 1.2.0.0"
    
#define TIMER_EX_RUNNING            0x00000001
#define TIMER_EX_CANCELED           0x00000002
    
#define RX_BUFFER_SIZE 2048 // for capture screen
#define TX_BUFFER_SIZE 2048
    
    /////////////////////////////////////////////////////////////////////////////
    //	timer
    typedef struct _TIMER_EX {
        KTIMER              kernelTimer;
        KDPC                dpc;
        ULONG               flags;
    } TIMER_EX, *PTIMER_EX;
    
    /////////////////////////////////////////////////////////////////////////////
    //	Our device extension
    typedef struct _VCP4USB_DEVICE_EXTENSION
    {
        LIST_ENTRY      listEntry;
        ULONG           instanceNo;
        UNICODE_STRING  ntDeviceName;
        UNICODE_STRING  dosDeviceName;
        UNICODE_STRING  interfaceName;
        
        PVOID           pThreadObj;
        KEVENT          eventThreadExit;
        KEVENT          eventThreadExiting;
        
        BOOLEAN         bIsConnected;
        BOOLEAN         bReadPending;
        BOOLEAN         bWritePending;
        
        UCHAR *         pTxBuf;
        UCHAR           pTxArray[TX_BUFFER_SIZE + 1];
        ULONG           curLenTx; // current write length
        UCHAR *         pRxBuf;
        UCHAR           pRxArray[RX_BUFFER_SIZE + 1];
        ULONG           curLenRx;
		ULONG           needLenRx;
        
        KEVENT          eventThreadStart;
        KEVENT          eventWriteStart;
        KEVENT          eventReadEnd;
        KEVENT          eventReadStart;
        
        KSPIN_LOCK      spinLock;
        PIRP            irpReadPending;
        PIRP            irpWritePending;
        
        ULONG           eventMask;
        ULONG           historyEvents;
        SERIAL_TIMEOUTS curTimeouts;
        SERIAL_HANDFLOW curHandflow;
        SERIAL_BAUD_RATE curBaudRate;
        SERIAL_LINE_CONTROL curLineControl;
        SERIAL_CHARS    curChars;
        PIRP            pWaitCtrlIrp;
        
        TIMER_EX        readIntervalTimer;
        TIMER_EX        readTotalTimer;
        TIMER_EX        writeTotalTimer;
        
        PDEVICE_OBJECT  fdo;
        PDEVICE_OBJECT  NextStackDevice;
    } VCP4USB_DEVICE_EXTENSION, *PVCP4USB_DEVICE_EXTENSION;
    
    typedef struct _VCP4USB_RW_CONTEXT {
        PDEVICE_OBJECT DeviceObject;
        PIRP  Irp;
        PIRP  BaseIrp;
    } VCP4USB_RW_CONTEXT, *PVCP4USB_RW_CONTEXT;
    
    // globale Data
    extern LIST_ENTRY gDevList;
    extern KMUTEX gDevListMutex;
    
    /////////////////////////////////////////////////////////////////////////////
    // Forward declarations of global functions
    
    VOID Vcp4usbUnload(IN PDRIVER_OBJECT DriverObject);
    
    NTSTATUS Vcp4usbPower(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
    
    NTSTATUS Vcp4usbCreate(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbClose(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbWrite(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbRead(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbDeviceControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    NTSTATUS Vcp4usbSystemControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    
    /////////////////////////////////////////////////////////////////////////////
    VOID Vcp4usbThread(IN PVOID Context);
    
    NTSTATUS Vcp4usbCompleteIrp(PIRP Irp, NTSTATUS status, ULONG info);
    
    NTSTATUS GetRegistryKeyValue(IN HANDLE regHandle, IN PWCHAR keyName, IN PVOID data, IN ULONG dataLength);
    
    NTSTATUS GetUsbDeviceName(OUT PUNICODE_STRING devName, IN CONST GUID *pGuid, IN CONST PWSTR pPrefix, IN ULONG prefixLength, IN ULONG instance);
    
    NTSTATUS createFile(OUT PHANDLE pHandle, IN PUNICODE_STRING pDevName, IN PWSTR suffix, IN USHORT suffixLength, IN ACCESS_MASK mode);
    
    NTSTATUS GetDev(OUT PFILE_OBJECT * pFileObject, OUT PDEVICE_OBJECT * pDevObject, IN PUNICODE_STRING pDevName, IN PWSTR suffix, IN USHORT suffixLength, IN ACCESS_MASK mode);
    
    VOID ApcRoutineRead(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved);
    
    VOID ApcRoutineWrite(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved);
    
    NTSTATUS getObjectPointer(OUT PDEVICE_OBJECT * hObj, OUT PFILE_OBJECT * hFile, IN PUNICODE_STRING pDevName, IN PWSTR suffix, IN USHORT suffixLength, IN ACCESS_MASK mode);
    
    VOID CancelWaitIrp(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
    
    BOOLEAN CalculateWriteTimeout(IN PVCP4USB_DEVICE_EXTENSION pDevExt, IN ULONG dataSize,
        OUT PLARGE_INTEGER pTotalTimeout);
    
    BOOLEAN CalculateReadTimeouts(IN PVCP4USB_DEVICE_EXTENSION pDevExt, IN ULONG dataSize,
        IN BOOLEAN firstChar, OUT PLARGE_INTEGER pIntervalTimeout,
        OUT PLARGE_INTEGER pTotalTimeout);
    
    VOID DpcReadIntervalTimeout(IN PKDPC pDpc, IN PVOID pDeferredContext, IN PVOID systemArgument1,
        IN PVOID systemArgument2);
    
    VOID DpcReadTotalTimeout(IN PKDPC pDpc, IN PVOID pDeferredContext, IN PVOID systemArgument1,
        IN PVOID systemArgument2);
    
    VOID DpcWriteTotalTimeout(IN PKDPC pDpc, IN PVOID pDeferredContext, IN PVOID systemArgument1,
        IN PVOID systemArgument2);
    
    VOID ReportEvent(IN PVCP4USB_DEVICE_EXTENSION dx, IN ULONG events);
    
    /////////////////////////////////////////////////////////////////////////////
    
    //
    // timer management
    //
    
#define InitTimer(/*PTIMER_EX*/ pTimer, /*PKDEFERRED_ROUTINE*/ routine, /*PVOID*/ context) \
    { \
    KeInitializeTimer(&(pTimer)->kernelTimer); \
    KeInitializeDpc(&(pTimer)->dpc, routine, context); \
    }
    
#define StartTimer(/*PTIMER_EX*/ pTimer, /*LARGE_INTEGER*/ dueTime) \
    { \
    (pTimer)->flags |= TIMER_EX_RUNNING; \
    KeSetTimer(&(pTimer)->kernelTimer, dueTime, &(pTimer)->dpc); \
    }
    
#define CancelTimer(/*PTIMER_EX*/ pTimer) \
    if (((pTimer)->flags & TIMER_EX_RUNNING) != 0) \
    { \
    if (!KeCancelTimer(&(pTimer)->kernelTimer)) \
    (pTimer)->flags |= TIMER_EX_CANCELED; \
    (pTimer)->flags &= ~TIMER_EX_RUNNING; \
    }
    
    __inline BOOLEAN TimerCanceled(PTIMER_EX pTimer)
    {
        if (((pTimer)->flags & TIMER_EX_CANCELED) != 0)
        {
            (pTimer)->flags &= ~TIMER_EX_CANCELED;
            return TRUE;
        }
        else
        {
            (pTimer)->flags &= ~TIMER_EX_RUNNING;
            return FALSE;
        }
    }
    
    
    
#ifdef __cplusplus
}
#endif

#endif // VCP4USB_INCD

⌨️ 快捷键说明

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