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

📄 fakemodem.h

📁 modem driver for windows. Tools: winddk
💻 H
字号:
/*++

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
                             );

⌨️ 快捷键说明

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