/*++ Copyright (c) 2000 Microsoft Corporation Module Name: fakemodem.h Environment: Kernel mode --*/ #define INITGUID #include #include #include #include #include #include #include #include #include #include #include #ifdef DEFINE_GUID DEFINE_GUID(GUID_CLASS_MODEM,0x2c7089aa, 0x2e0e,0x11d1,0xb1, 0x14, 0x00, 0xc0, 0x4f, 0xc2, 0xaa, 0xe4); #endif //DEFINE_GUID #define PNP_DEBUG 1 #define ALLOCATE_PAGED_POOL(_y) ExAllocatePoolWithTag(PagedPool,_y,'wkaF') #define ALLOCATE_NONPAGED_POOL(_y) ExAllocatePoolWithTag(NonPagedPool,_y,'wkaF') #define FREE_POOL(_x) {ExFreePool(_x);_x=NULL;}; #define DO_TYPE_PDO ' ODP' #define DO_TYPE_FDO ' ODF' #define DO_TYPE_DEL_PDO 'ODPx' #define DO_TYPE_DEL_FDO 'ODFx' #define DEVICE_OBJECT_NAME_LENGTH 128 extern ULONG DebugFlags; #if DBG #define DEBUG_FLAG_ERROR 0x0001 #define DEBUG_FLAG_INIT 0x0002 #define DEBUG_FLAG_PNP 0x0004 #define DEBUG_FLAG_POWER 0x0008 #define DEBUG_FLAG_WMI 0x0010 #define DEBUG_FLAG_TRACE 0x0020 #define D_INIT(_x) if (DebugFlags & DEBUG_FLAG_INIT) {_x} #define D_PNP(_x) if (DebugFlags & DEBUG_FLAG_PNP) {_x} #define D_POWER(_x) if (DebugFlags & DEBUG_FLAG_POWER) {_x} #define D_TRACE(_x) if (DebugFlags & DEBUG_FLAG_TRACE) {_x} #define D_ERROR(_x) if (DebugFlags & DEBUG_FLAG_ERROR) {_x} #define D_WMI(_x) if (DebugFlags & DEBUG_FLAG_WMI) {_x} #else #define D_INIT(_x) {} #define D_PNP(_x) {} #define D_POWER(_x) {} #define D_TRACE(_x) {} #define D_ERROR(_x) {} #define D_WMI(_x) {} #endif #define OBJECT_DIRECTORY L"DosDevices" #define READ_BUFFER_SIZE 128 #define COMMAND_MATCH_STATE_IDLE 0 #define COMMAND_MATCH_STATE_GOT_A 1 #define COMMAND_MATCH_STATE_GOT_T 2 typedef struct _DEVICE_EXTENSION { ULONG DoType; KSPIN_LOCK SpinLock; PDEVICE_OBJECT DeviceObject; LONG ReferenceCount; UNICODE_STRING InterfaceNameString; ULONG OpenCount; BOOLEAN Removing; BOOLEAN Started; KEVENT RemoveEvent; LIST_ENTRY HoldList; LIST_ENTRY RestartList; KEVENT PdoStartEvent; KDPC ReadDpc; PIRP CurrentReadIrp; LIST_ENTRY ReadQueue; PIRP CurrentWriteIrp; LIST_ENTRY WriteQueue; PIRP CurrentMaskIrp; LIST_ENTRY MaskQueue; ULONG CurrentMask; PDEVICE_OBJECT Pdo; PDEVICE_OBJECT LowerDevice; SERIAL_TIMEOUTS CurrentTimeouts; ULONG ReadBufferBegin; ULONG ReadBufferEnd; ULONG BytesInReadBuffer; UCHAR CommandMatchState; BOOLEAN ConnectCommand; BOOLEAN IgnoreNextChar; BOOLEAN CapsQueried; ULONG ModemStatus; BOOLEAN CurrentlyConnected; BOOLEAN ConnectionStateChanged; UCHAR ReadBuffer[READ_BUFFER_SIZE]; DEVICE_POWER_STATE SystemPowerStateMap[PowerSystemMaximum]; SYSTEM_POWER_STATE SystemWake; DEVICE_POWER_STATE DeviceWake; BOOLEAN WakeOnRingEnabled; ERESOURCE OpenCloseResource; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; extern UNICODE_STRING DriverEntryRegPath; #define RemoveReferenceForDispatch RemoveReference #define RemoveReferenceForIrp RemoveReference // Function prototypes NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); VOID FakeModemUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS FakeModemAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo ); NTSTATUS GetRegistryKeyValue ( IN HANDLE Handle, IN PWCHAR KeyNameString, IN ULONG KeyNameStringLength, IN PVOID Data, IN ULONG DataLength ); NTSTATUS FakeModemHandleSymbolicLink( PDEVICE_OBJECT Pdo, BOOLEAN Create, PUNICODE_STRING InterfaceName, PDEVICE_OBJECT Fdo ); NTSTATUS QueryDeviceCaps( PDEVICE_OBJECT Pdo, PDEVICE_CAPABILITIES Capabilities ); NTSTATUS ModemSetRegistryKeyValue( IN PDEVICE_OBJECT Pdo, IN ULONG DevInstKeyType, IN PWCHAR KeyNameString, IN ULONG DataType, IN PVOID Data, IN ULONG DataLength); NTSTATUS ModemGetRegistryKeyValue ( IN PDEVICE_OBJECT Pdo, IN ULONG DevInstKeyType, IN PWCHAR KeyNameString, IN PVOID Data, IN ULONG DataLength ); NTSTATUS FakeModemIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemOpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); void FakeModemKillPendingIrps( PDEVICE_OBJECT DeviceObject ); NTSTATUS ForwardIrp( PDEVICE_OBJECT NextDevice, PIRP Irp ); NTSTATUS FakeModemAdapterIoCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT pdoIoCompletedEvent ); NTSTATUS WaitForLowerDriverToCompleteIrp( PDEVICE_OBJECT TargetDeviceObject, PIRP Irp, PKEVENT Event ); NTSTATUS FakeModemPnP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemDealWithResources( IN PDEVICE_OBJECT Fdo, IN PIRP Irp ); VOID DevicePowerCompleteRoutine( PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); NTSTATUS FakeModemPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FakeModemWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID WriteIrpWorker( IN PDEVICE_OBJECT DeviceObject ); VOID ProcessWriteBytes( PDEVICE_EXTENSION DeviceExtension, PUCHAR Characters, ULONG Length ); VOID PutCharInReadBuffer( PDEVICE_EXTENSION DeviceExtension, UCHAR Character ); VOID ReadIrpWorker( PDEVICE_OBJECT DeviceObject ); VOID TryToSatisfyRead( PDEVICE_EXTENSION DeviceExtension ); VOID WriteCancelRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID ReadCancelRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID ProcessConnectionStateChange( IN PDEVICE_OBJECT DeviceObject ); NTSTATUS CheckStateAndAddReference( PDEVICE_OBJECT DeviceObject, PIRP Irp ); VOID RemoveReferenceAndCompleteRequest( PDEVICE_OBJECT DeviceObject, PIRP Irp, NTSTATUS StatusToReturn ); VOID RemoveReference( PDEVICE_OBJECT DeviceObject ); VOID FakeModemKillAllReadsOrWrites( IN PDEVICE_OBJECT DeviceObject, IN PLIST_ENTRY QueueToClean, IN PIRP *CurrentOpIrp );