?? vcp4usb.h
字號(hào):
#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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -