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

📄 main.h

📁 windows平台下虚拟串口的driver文件
💻 H
字号:
/*++

Copyright (c) 1990-98    Microsoft Corporation All Rights Reserved

Module Name:

    filter.h

Abstract:

    Device driver that controls the Filter device.

Environment:

    Kernel mode

Revision History:

    Eliyas Yakub Oct 29 1998

--*/
#if !defined(_FILTER_H_)
#define _FILTER_H_

#include <ntddser.h>

#define DRIVERNAME "Serial.sys: "


#if DBG
#define DebugPrint(_x_) \
               DbgPrint (DRIVERNAME); \
               DbgPrint _x_;

#define TRAP() DbgBreakPoint()

#else
#define DebugPrint(_x_)
#define TRAP()
#endif

//
// These are the states Filter transition to upon
// receiving a specific PnP Irp. Refer to the PnP Device States
// diagram in DDK documentation for better understanding.
//

typedef enum _DEVICE_PNP_STATE {

    NotStarted = 0,         // Not started yet
    Started,                // Device has received the START_DEVICE IRP
    StopPending,            // Device has received the QUERY_STOP IRP
    Stopped,                // Device has received the STOP_DEVICE IRP
    RemovePending,          // Device has received the QUERY_REMOVE IRP
    SurpriseRemovePending,  // Device has received the SURPRISE_REMOVE IRP
    Deleted                 // Device has received the REMOVE_DEVICE IRP

} DEVICE_PNP_STATE;

#define INITIALIZE_PNP_STATE(_Data_)    \
        (_Data_)->DevicePnPState =  NotStarted;\
        (_Data_)->PreviousPnPState = NotStarted;

#define SET_NEW_PNP_STATE(_Data_, _state_) \
        (_Data_)->PreviousPnPState =  (_Data_)->DevicePnPState;\
        (_Data_)->DevicePnPState = (_state_);

#define RESTORE_PREVIOUS_PNP_STATE(_Data_)   \
        (_Data_)->DevicePnPState =   (_Data_)->PreviousPnPState;\


// for Virtual serial
#define DEVICE_OBJECT_NAME_LENGTH	128
#define SYMBOLIC_NAME_LENGTH		128
#define SERIAL_DEVICE_MAP			L"SERIALCOMM"
#define DEVICE_NAME					L"\\Device\\SiSerial"
#define DOS_DEVICE_NAME				L"\\DosDevices\\COM"
#define MAX_NUM_DEV					256
#define INVALID_INSTANCE			0xFFFFFFFF
#define MAX_PACKET_NUM				8
#define PACKET_SIZE					1024


//DEFINE_GUID(GUID_CLASS_COMPORT,          0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);

//++	Serial section
// These defines are used to set the line control register.
#define SERIAL_5_DATA       ((UCHAR)0x00)
#define SERIAL_6_DATA       ((UCHAR)0x01)
#define SERIAL_7_DATA       ((UCHAR)0x02)
#define SERIAL_8_DATA       ((UCHAR)0x03)
#define SERIAL_DATA_MASK    ((UCHAR)0x03)

#define SERIAL_1_STOP       ((UCHAR)0x00)
#define SERIAL_1_5_STOP     ((UCHAR)0x04) // Only valid for 5 data bits
#define SERIAL_2_STOP       ((UCHAR)0x04) // Not valid for 5 data bits
#define SERIAL_STOP_MASK    ((UCHAR)0x04)

#define SERIAL_NONE_PARITY  ((UCHAR)0x00)
#define SERIAL_ODD_PARITY   ((UCHAR)0x08)
#define SERIAL_EVEN_PARITY  ((UCHAR)0x18)
#define SERIAL_MARK_PARITY  ((UCHAR)0x28)
#define SERIAL_SPACE_PARITY ((UCHAR)0x38)
#define SERIAL_PARITY_MASK  ((UCHAR)0x38)
//--
//++	default xon/xoff characters
#define SERIAL_DEF_XON 0x11
#define SERIAL_DEF_XOFF 0x13
//--

typedef struct _DEVICE_EXTENSION
{
    //
    // A back pointer to the device object.
    //
    
    PDEVICE_OBJECT  Self;

	//PDRIVER_OBJECT  DriverObject;

    //
    // The top of the stack before this filter was added.
    //
	PDEVICE_OBJECT	PhysicalDeviceObject;
    
    PDEVICE_OBJECT  NextLowerDriver;

    //
    // current PnP state of the device
    //
    
    DEVICE_PNP_STATE  DevicePnPState;

    //
    // Remembers the previous pnp state
    //
    
    DEVICE_PNP_STATE    PreviousPnPState;


	//++ names aboug device object
    UNICODE_STRING      InterfaceName; // The name returned from 
                                       // IoRegisterDeviceInterface,
	UNICODE_STRING		DeviceName;

	UNICODE_STRING		SymbolicLinkName;
	BOOLEAN				CreatedSymbolicLink;

	UNICODE_STRING		DosName;
	BOOLEAN				CreatedSerialCommEntry;

	ULONG				ComX;
	ULONG				localInstance;
	ULONG				remoteInstance;
	//--
	
	DEVICE_POWER_STATE	PowerState;

	BOOLEAN				bIsOpen;

	BOOLEAN				bIsConnected;


	//++	settings for Serial Ports
	KSPIN_LOCK			CancelSpinLock;

	LIST_ENTRY			ReadIrpQueue;
	LIST_ENTRY			WriteIrpQueue;
	PIRP				WaitOnMaskIrp;
	LIST_ENTRY			ReadDataQueue;
	KSPIN_LOCK			ReadQueueSpinLock;

	ULONG				CurrentBaud;
	ULONG				BufferSize;
	ULONG				WaitMask;
	BOOLEAN				bIsWaitOnMask;
    SERIAL_CHARS		SpecialChars;
    SERIAL_HANDFLOW		HandFlow;
	SERIAL_TIMEOUTS		Timeouts;
	SERIAL_LINE_CONTROL	LineControl;

	//--

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

typedef struct _Device_Description{
	PDEVICE_EXTENSION  deviceExtension;
}DEVICE_ARRAY, *PDEVICE_ARRAY;

typedef struct _Packet{
	ULONG		nTotalNum;
	ULONG		nReadBytes;
	LIST_ENTRY	ListEntry;
	UCHAR		Buffer[ PACKET_SIZE ];
}PACKET,*PPACKET;
PCHAR
PnPMinorFunctionString (
    UCHAR MinorFunction
);

NTSTATUS
AddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    );


NTSTATUS
DispatchPnp (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
DispatchPower(
    IN PDEVICE_OBJECT    DeviceObject,
    IN PIRP              Irp
    );

VOID
Unload(
    IN PDRIVER_OBJECT DriverObject
    );
NTSTATUS DefaultPnpHandler(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

NTSTATUS PnpStartDevice(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);
NTSTATUS PnpRemoveDevice(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);
NTSTATUS ForwardAndWait(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);
NTSTATUS RequestCreate (
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

NTSTATUS RequestClose(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

NTSTATUS RequestControl(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

NTSTATUS CompleteRequest ( 
	IN PIRP Irp,
	IN NTSTATUS status,
	IN ULONG info
	);
NTSTATUS OnRequestComplete(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp,
    IN PKEVENT event
	);

NTSTATUS
SerialCreateDevObj(
	IN PDRIVER_OBJECT DriverObject,
	OUT PDEVICE_OBJECT *NewDeviceObject
	);
NTSTATUS
SerialRemoveDevObj(
	IN PDEVICE_OBJECT DeviceObject
	);

NTSTATUS
SerialFinishStartDevice(
	IN	PDEVICE_EXTENSION	deviceExtension
	);

NTSTATUS
DispatchRead(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

NTSTATUS
DispatchWrite(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);

BOOLEAN
RequestCancelRoutine(
	IN PLIST_ENTRY		QueueToProcess,
	IN PKSPIN_LOCK		CancelSpinLock,
	IN PIRP				Irp
	);
NTSTATUS
RequestCleanup(
	IN PDEVICE_OBJECT DeviceObject,
	IN PIRP Irp
	);
VOID
RequestPurgeIrpQueue(
	IN PDEVICE_OBJECT	DeviceObject,
	IN PLIST_ENTRY		QueueToProcess
	);
VOID
RequestCancelReadRoutine(
	IN PDEVICE_OBJECT	DeviceObject,
	IN PIRP				Irp
	);
VOID
RequestCancelWriteRoutine(
	IN PDEVICE_OBJECT	DeviceObject,
	IN PIRP				Irp
	);
VOID
RequestCancelMaskRoutine(
	IN PDEVICE_OBJECT	DeviceObject,
	IN PIRP				Irp
	);
VOID
OnTimer(
    IN PDEVICE_OBJECT DeviceObject,
    IN PVOID Context
    );
VOID
CompleteReadIrpOnTimer(
	IN PDEVICE_EXTENSION	deviceExtension,
	IN PIRP					Irp
	);

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    );
NTSTATUS
SerialDoExternalNaming(
	IN PDEVICE_EXTENSION	deviceExtension,
	IN LONG					ComX
	);
NTSTATUS
SerialUndoExternalNaming(
	IN PDEVICE_EXTENSION	deviceExtension
	);
NTSTATUS
AddInterface(
	IN	PDEVICE_EXTENSION	deviceExtension
	);
VOID
DelInterface(
	IN	PDEVICE_EXTENSION	deviceExtension
	);
NTSTATUS Disconnect(	IN PDEVICE_EXTENSION deviceExtension );
VOID
RequestPurgeDataQueue(
	IN PDEVICE_OBJECT	DeviceObject,
	IN PLIST_ENTRY		QueueToProcess
	);
NTSTATUS
CompleteReadIrp(
	IN PDEVICE_EXTENSION	deviceExtension,
	IN PIRP					Irp
	);
#endif

⌨️ 快捷键说明

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