197 lines
3.1 KiB
C
197 lines
3.1 KiB
C
|
|
||
|
#include <ntddk.h>
|
||
|
|
||
|
|
||
|
#include <irenum.h>
|
||
|
#include <ircommdbg.h>
|
||
|
|
||
|
|
||
|
|
||
|
extern ULONG EnumStaticDevice;
|
||
|
|
||
|
#define DO_TYPE_PDO ' ODP'
|
||
|
#define DO_TYPE_FDO ' ODF'
|
||
|
|
||
|
#define DO_TYPE_DEL_PDO 'ODPx'
|
||
|
#define DO_TYPE_DEL_FDO 'ODFx'
|
||
|
|
||
|
typedef KEVENT PASSIVE_LOCK, *PPASSICE_LOCK;
|
||
|
|
||
|
#define INIT_PASSIVE_LOCK(_lock) KeInitializeEvent(_lock,SynchronizationEvent,TRUE)
|
||
|
|
||
|
#define ACQUIRE_PASSIVE_LOCK(_lock) KeWaitForSingleObject(_lock,Executive,KernelMode, FALSE, NULL)
|
||
|
|
||
|
#define RELEASE_PASSIVE_LOCK(_lock) KeSetEvent(_lock,IO_NO_INCREMENT,FALSE)
|
||
|
|
||
|
#define IRENUM_COMPAT_ID L"PNPC103"
|
||
|
#define IRENUM_PREFIX L"IRENUM\\"
|
||
|
|
||
|
#define MAX_COMPAT_IDS 17
|
||
|
|
||
|
typedef struct _IR_DEVICE {
|
||
|
|
||
|
ULONG DeviceId;
|
||
|
|
||
|
WCHAR DeviceName[24];
|
||
|
|
||
|
UCHAR Hint1;
|
||
|
UCHAR Hint2;
|
||
|
|
||
|
PWSTR HardwareId;
|
||
|
LONG CompatIdCount;
|
||
|
PWSTR CompatId[MAX_COMPAT_IDS];
|
||
|
PWSTR Name;
|
||
|
PWSTR Manufacturer;
|
||
|
|
||
|
|
||
|
ULONG PresentCount;
|
||
|
BOOLEAN InUse;
|
||
|
BOOLEAN Enumerated;
|
||
|
BOOLEAN Static;
|
||
|
BOOLEAN Printer;
|
||
|
BOOLEAN Modem;
|
||
|
|
||
|
PDEVICE_OBJECT Pdo;
|
||
|
|
||
|
} IR_DEVICE, *PIR_DEVICE;
|
||
|
|
||
|
|
||
|
typedef PVOID ENUM_HANDLE;
|
||
|
|
||
|
typedef struct _FDO_DEVICE_EXTENSION {
|
||
|
|
||
|
ULONG DoType;
|
||
|
|
||
|
PDEVICE_OBJECT DeviceObject;
|
||
|
PDEVICE_OBJECT Pdo;
|
||
|
PDEVICE_OBJECT LowerDevice;
|
||
|
|
||
|
ENUM_HANDLE EnumHandle;
|
||
|
|
||
|
BOOLEAN CreateStaticDevice;
|
||
|
|
||
|
BOOLEAN Removing;
|
||
|
BOOLEAN Removed;
|
||
|
|
||
|
|
||
|
|
||
|
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||
|
|
||
|
typedef struct _PDO_DEVICE_EXTENSION {
|
||
|
|
||
|
ULONG DoType;
|
||
|
|
||
|
PDEVICE_OBJECT ParentFdo;
|
||
|
|
||
|
PIR_DEVICE DeviceDescription;
|
||
|
|
||
|
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumAddDevice(
|
||
|
IN PDRIVER_OBJECT DriverObject,
|
||
|
IN PDEVICE_OBJECT Pdo
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumPnP(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumPower(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumWmi(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
#define LEAVE_NEXT_AS_IS FALSE
|
||
|
#define COPY_CURRENT_TO_NEXT TRUE
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
WaitForLowerDriverToCompleteIrp(
|
||
|
PDEVICE_OBJECT TargetDeviceObject,
|
||
|
PIRP Irp,
|
||
|
BOOLEAN CopyCurrentToNext
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ForwardIrp(
|
||
|
PDEVICE_OBJECT NextDevice,
|
||
|
PIRP Irp
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// enumeration object
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
CreateEnumObject(
|
||
|
PDEVICE_OBJECT Fdo,
|
||
|
ENUM_HANDLE *Object,
|
||
|
BOOLEAN CreateStaticDevice
|
||
|
);
|
||
|
|
||
|
|
||
|
VOID
|
||
|
CloseEnumObject(
|
||
|
ENUM_HANDLE Handle
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
GetDeviceList(
|
||
|
ENUM_HANDLE Handle,
|
||
|
PIRP Irp
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
RemoveDevice(
|
||
|
ENUM_HANDLE Handle,
|
||
|
PIR_DEVICE IrDevice
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// child irp handlers
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumPdoPnp (
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumPdoPower(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IrEnumPdoWmi(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
GetRegistryKeyValue(
|
||
|
IN PDEVICE_OBJECT Pdo,
|
||
|
IN ULONG DevInstKeyType,
|
||
|
IN PWCHAR KeyNameString,
|
||
|
IN PVOID Data,
|
||
|
IN ULONG DataLength
|
||
|
);
|