windows-nt/Source/XPSP1/NT/net/unimodem/sample/sys/fakemodem.h
2020-09-26 16:20:57 +08:00

360 lines
7.8 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
fakemodem.h
Environment:
Kernel mode
--*/
#define INITGUID
#include <stddef.h>
#include <stdarg.h>
#include <stdio.h>
#include <ntddk.h>
#include <ntddser.h>
#include <wmistr.h>
#include <wmilib.h>
#include <windef.h>
#include <wmistr.h>
#include <wdmguid.h>
#include <string.h>
#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
);