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

📄 vcom.h

📁 一个虚拟串口的驱动程序源代码
💻 H
字号:
//============================================================================
//
//  N8VB_vcom - Virtual COM Port
//  Copyright (c) 2005 Philip A Covington, N8VB
//
//	Email: p.covington@gmail.com
//
//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//============================================================================

#include <wdm.h>
#include <initguid.h>
#include <ntddser.h>
#include <csq.h>


#define MAX_PAIR_COUNT		10

// interface GUIDs
static GUID vCOMGUID	= {0xB03C1DEB, 0xD080, 0x4E83, 0xBF, 0xDF, 0x90, 0x15, 0x95, 0x67, 0xBF, 0xE9};
							

static PCWSTR vCOMDevNames[20] = 	{
									L"\\Device\\vComDrv0", 
									L"\\Device\\vComDrv1", 
									L"\\Device\\vComDrv2",
									L"\\Device\\vComDrv3", 
									L"\\Device\\vComDrv4", 
									L"\\Device\\vComDrv5",
									L"\\Device\\vComDrv6", 
									L"\\Device\\vComDrv7", 
									L"\\Device\\vComDrv8",
									L"\\Device\\vComDrv9",
									L"\\Device\\vComDrv10", 
									L"\\Device\\vComDrv11", 
									L"\\Device\\vComDrv12",
									L"\\Device\\vComDrv13", 
									L"\\Device\\vComDrv14", 
									L"\\Device\\vComDrv15",
									L"\\Device\\vComDrv16", 
									L"\\Device\\vComDrv17", 
									L"\\Device\\vComDrv18",
									L"\\Device\\vComDrv19"
									};

static PCWSTR vCOMPortNumbers[20] = {
									L"PortNumber1", 
									L"PortNumber2", 
									L"PortNumber3", 
									L"PortNumber4",
									L"PortNumber5", 
									L"PortNumber6", 
									L"PortNumber7", 
									L"PortNumber8",
									L"PortNumber9", 
									L"PortNumber10",
									L"PortNumber11", 
									L"PortNumber12", 
									L"PortNumber13", 
									L"PortNumber14",
									L"PortNumber15", 
									L"PortNumber16", 
									L"PortNumber17", 
									L"PortNumber18",
									L"PortNumber19", 
									L"PortNumber20"
									};

static ULONG devpaircount = 1;

static PDEVICE_OBJECT pDevices[20] =	{
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL,
									NULL
									};

#define SERIAL_DEVICE_MAP           	L"SERIALCOMM"

#define BUFFERLENGTH									65536

#define TIMEOUTS_WAIT_FOREVER 						0
#define TIMEOUTS_IMMEDIATE_RETURN_WITH_BYTES  		1
#define TIMEOUTS_RETURNBYTES_OR_WAIT 				2
#define TIMEOUTS_INTERVAL_TIMEOUT 					3
#define TIMEOUTS_TOTAL_TIMEOUT 						4
#define TIMEOUTS_COMBINED_TIMEOUT 					5

#define SERIAL_MCR_DTR            							0x01
#define SERIAL_MCR_RTS            							0x02
#define SERIAL_MSR_CTS      								0x10
#define SERIAL_MSR_DSR      								0x20

// device extension structure
typedef struct _vCOM_DEVICE_EXTENSION 
{
	BOOLEAN                 		isSet;    
	BOOLEAN                 		isOpened;
	BOOLEAN                 		isAttached;
	BOOLEAN                 		isRemoved;
	BOOLEAN					symbolicLinkIsDone;
	BOOLEAN					deviceMapEntryIsCreated;
	BOOLEAN					terminateTransferThread;
	BOOLEAN                 		terminateReadThread;
	BOOLEAN					terminateWriteThread;
	BOOLEAN					serDTR;
	BOOLEAN					serRTS;
	BOOLEAN					serDSR;
	BOOLEAN					serCTS;
	BOOLEAN					fastRead;
	    
	PIRP                    			pReadIrpCurrent;
	PIRP                   			pWriteIrpCurrent;
	PIRP                    			pWaitIrp;
	
	PDEVICE_OBJECT     		pMe;
	PDEVICE_OBJECT			pTwin;
	PDEVICE_OBJECT     		pNextDriver;
		    
	UNICODE_STRING    		symbolicLinkName;
	UNICODE_STRING    		interfaceName;

	LIST_ENTRY              		readPendingQueue;
	LIST_ENTRY              		writePendingQueue;

	IO_CSQ 					cancelSafeReadQueue;
	IO_CSQ					cancelSafeWriteQueue;
		
	ULONG                   		eventMask;
	ULONG					eventHistory;
	ULONG					deviceNumber;
	ULONG 					outBufferReadPosition;
	ULONG					outBufferWritePosition;
	ULONG					outBufferCount;	
	ULONG					inBufferReadPosition;
	ULONG					inBufferWritePosition;
	ULONG					inBufferCount;	
	ULONG					readTimeoutType;
	ULONG					writeTimeoutType;
	ULONG					readBufferCount;
	ULONG					inBufferSize;
	ULONG					outBufferSize;	
	
	PVOID                   		pReadThread;
	PVOID					pWriteThread;
	PVOID                   		pTransferThread;
	
	KSPIN_LOCK            		readSpinLock;
	KSPIN_LOCK            		writeSpinLock;
	KSPIN_LOCK            		controlSpinLock;
	KSPIN_LOCK				readQueueSpinLock;
	KSPIN_LOCK				writeQueueSpinLock;
	
	KSEMAPHORE				readIRPQueueSemaphore;
	KSEMAPHORE				writeIRPQueueSemaphore;
		
	FAST_MUTEX            		openMutex;

	KTIMER					readTotalTimer;
	KTIMER					readIntervalTimer;
	KTIMER					writeTotalTimer;

	KEVENT					transferNeededEvent;
	KEVENT					transferOccurredEvent;	
	KEVENT					readOccurredEvent;
	KEVENT					currentReadIrpWasCancelledEvent;
	KEVENT					currentWriteIrpWasCancelledEvent;
	
	LARGE_INTEGER			readTotalTimeoutValue;
	LARGE_INTEGER			readIntervalTimeoutValue;
	LARGE_INTEGER			writeTotalTimeoutValue;
	LARGE_INTEGER			writeDelayLoopTimerValue;
	LARGE_INTEGER			transferWaitTimeoutValue;
	LARGE_INTEGER			readWaitTimeoutValue;
		
	SERIAL_TIMEOUTS        	serTimeouts;
	SERIAL_LINE_CONTROL		serLineControl;
	SERIAL_BAUD_RATE		serBaudRate;
	SERIAL_HANDFLOW		serHandFlow;
	SERIAL_CHARS			serChars;
	SERIALPERF_STATS        	serPerformanceStats;
	SERIAL_QUEUE_SIZE 		serQueueSize;
	SERIAL_STATUS			serStatus;
	ULONG					serModemControlRegister;
	ULONG					serModemStatusRegister;
	UCHAR					serEventCharacter;
	
	PUCHAR 					inBuffer;
	PUCHAR                    		outBuffer;	
        
} vCOM_DEVICE_EXTENSION, *PvCOM_DEVICE_EXTENSION;
                                         
// Function Prototypes

// vCOM_init.c

NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject, PUNICODE_STRING pRegistryPath);
VOID vCOMUnload(IN PDRIVER_OBJECT pDriverObject);

// vCOM_device.c

NTSTATUS vCOMAddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pPDO);
NTSTATUS vCOMCreateFDO(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pPDO, PDEVICE_OBJECT* pvCOMFDO, ULONG devNumber);
NTSTATUS vCOMGetRegistryKeyValue(HANDLE hRegistry, PCWSTR keyName, PVOID data, ULONG dataLength);
NTSTATUS vCOMCreateDevice(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMCloseDevice(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMReadDevice(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMFastRead(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMWriteDevice(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMFastWrite(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMFastTransfer(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
VOID vCOMDeleteFailedDevice(PDEVICE_OBJECT pFDO, ULONG devNumber);
VOID vCOMDeleteDevice(PDEVICE_OBJECT);
NTSTATUS vCOMCleanupDevice(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
VOID vCOMCancelWaitIrp(PDEVICE_OBJECT DeviceObject,  PIRP pIrp);
VOID vCOMCancelCurrentReadIrp(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
VOID vCOMCancelCurrentWriteIrp(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
ULONG vCOMCalculateReadTimeoutValues(PDEVICE_OBJECT pDeviceObject, PIRP pIrp);
ULONG vCOMCalculateWriteTimeoutValues(PDEVICE_OBJECT pDeviceObject, PIRP pIrp);
VOID vCOMCheckComEvents(PvCOM_DEVICE_EXTENSION pDeviceExtension, ULONG events);

// vCOM_csq.c

VOID vCOMInsertReadIrp (PIO_CSQ   pCsq,  PIRP pIrp);
VOID vCOMRemoveReadIrp(PIO_CSQ pCsq,  PIRP pIrp);
PIRP vCOMPeekNextReadIrp(PIO_CSQ pCsq, PIRP pIrp,  PVOID pPeekContext);
VOID vCOMAcquireReadLock(PIO_CSQ pCsq, PKIRQL pIrql);
VOID vCOMReleaseReadLock(PIO_CSQ pCsq, KIRQL pIrql);
VOID vCOMCompleteCanceledReadIrp(PIO_CSQ pCsq, PIRP pIrp);
VOID vCOMInsertWriteIrp (PIO_CSQ   pCsq,  PIRP pIrp);
VOID vCOMRemoveWriteIrp(PIO_CSQ pCsq,  PIRP pIrp);
PIRP vCOMPeekNextWriteIrp(PIO_CSQ pCsq, PIRP pIrp,  PVOID pPeekContext);
VOID vCOMAcquireWriteLock(PIO_CSQ pCsq, PKIRQL pIrql);
VOID vCOMReleaseWriteLock(PIO_CSQ pCsq, KIRQL pIrql);
VOID vCOMCompleteCanceledWriteIrp(PIO_CSQ pCsq, PIRP pIrp);
NTSTATUS vCOMCompleteRequest(PIRP pIrp, NTSTATUS status, ULONG_PTR info);
	
// vCOM_dispatch.c

NTSTATUS vCOMDispatchCreate(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchClose(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchCleanup(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchSetInformation(PDEVICE_OBJECT DeviceObject, PIRP pIrp);
NTSTATUS vCOMDispatchSystemControl(PDEVICE_OBJECT DeviceObject, PIRP pIrp);

// vCOM_pnp.c

NTSTATUS vCOMDispatchPnP(PDEVICE_OBJECT, PIRP);
NTSTATUS vCOMCompletionRoutine(PDEVICE_OBJECT, PIRP, PKEVENT);

// vCOM_readthread.c

VOID vCOMReadThread(PVOID pContext);
NTSTATUS vCOMReadThreadStart(PDEVICE_OBJECT pDeviceObject);
VOID vCOMReadThreadStop(PDEVICE_OBJECT pDeviceObject);
VOID vCOMReadThreadCompleteRequest(PDEVICE_OBJECT pDeviceObject, PIRP pIrp, NTSTATUS status);
	
//vCOM_writethread.c

VOID vCOMWriteThread(PVOID pContext);
NTSTATUS vCOMWriteThreadStart(PDEVICE_OBJECT pDeviceObject);
VOID vCOMWriteThreadStop(PDEVICE_OBJECT pDeviceObject);
VOID vCOMWriteThreadCompleteRequest(PDEVICE_OBJECT pDeviceObject, PIRP pIrp, NTSTATUS status);

//vCOM_transferthread.c

VOID vCOMTransferThread(PVOID pContext);
NTSTATUS vCOMTransferThreadStart(PDEVICE_OBJECT pDeviceObject);
VOID vCOMTransferThreadStop(PDEVICE_OBJECT pDeviceObject);

⌨️ 快捷键说明

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