📄 支持 ps2 与 usb 的键盘过滤驱动(可卸载).txt
字号:
/////////////////////////////////////////////////////////////////
BOOLEAN
GetAttachedDeviceInfo( IN PDEVICE_OBJECT DevObj )
{
PDEVICE_OBJECT DeviceObject;
BOOLEAN bFound = FALSE;
if ( DevObj == NULL )
{
DbgPrint( "DevObj is NULL!\n" );
return FALSE;
}
DeviceObject = DevObj->AttachedDevice;
while ( DeviceObject )
{
//
// 一些 OBJECT 的名称都存在分页区,虽然大部分时候不会被交换出去,但
// 有一次足够了。这算是经验之谈
//
if ( MmIsAddressValid( DeviceObject->DriverObject->DriverName.Buffer ) )
{
DbgPrint( "Attached Driver Name:%S,Attached Driver Address:0x%x,Attached DeviceAddress:0x%x\n",
DeviceObject->DriverObject->DriverName.Buffer,
DeviceObject->DriverObject,
DeviceObject );
//
// 找到 USB 键盘驱动的 kbdhid 设备了么?找到了就不继续了
//
if ( _wcsnicmp( DeviceObject->DriverObject->DriverName.Buffer,
KDBDEVICENAME,
wcslen( KDBDEVICENAME ) ) == 0 )
{
DbgPrint( "Found kbdhid Device\n" );
bFound = TRUE;
break;
}
}
DeviceObject = DeviceObject->AttachedDevice;
}
return bFound;
}
/////////////////////////////////////////////////////////////////
// 函数类型 : 自定义工具函数
// 函数模块 : 设备栈信息模块
/////////////////////////////////////////////////////////////////
// 功能 : 从 DEVICE_OBJECT 中得到设备与驱动名称并打印地址
// 注意 : 函数功能只是打印信息,不同环境使用中应该会做修改
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.05.02
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
/////////////////////////////////////////////////////////////////
// 修改者 : sinister
// 修改日期 : 2007.2.12
// 修改内容 : 打印出 USB 键盘驱动的设备名称,仅作调试使用
/////////////////////////////////////////////////////////////////
VOID
GetDeviceObjectInfo( IN PDEVICE_OBJECT DevObj )
{
POBJECT_HEADER ObjectHeader;
POBJECT_HEADER_NAME_INFO ObjectNameInfo;
if ( DevObj == NULL )
{
DbgPrint( "DevObj is NULL!\n" );
return;
}
//
// 得到对象头
//
ObjectHeader = OBJECT_TO_OBJECT_HEADER( DevObj );
if ( ObjectHeader )
{
//
// 查询设备名称并打印
//
ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO( ObjectHeader );
if ( ObjectNameInfo && ObjectNameInfo->Name.Buffer )
{
DbgPrint( "Device Name:%S - Device Address:0x%x\n",
ObjectNameInfo->Name.Buffer,
DevObj );
//
// 复制 USB 键盘设备名到一个全局 BUFFER 里,为调试时显示
// 用,没有实际的功能用途
//
RtlZeroMemory( szUsbDeviceName, sizeof( szUsbDeviceName ) );
wcsncpy( szUsbDeviceName,
ObjectNameInfo->Name.Buffer,
ObjectNameInfo->Name.Length / sizeof( WCHAR ) );
}
//
// 对于没有名称的设备,则打印 NULL
//
else if ( DevObj->DriverObject )
{
DbgPrint( "Driver Name:%S - Device Name:%S - Driver Address:0x%x - Device Address:0x%x\n",
DevObj->DriverObject->DriverName.Buffer,
L"NULL",
DevObj->DriverObject,
DevObj );
}
}
}
/////////////////////////////////////////////////////////////////
// 函数类型 : 自定义工具函数
// 函数模块 : 键盘过滤模块
/////////////////////////////////////////////////////////////////
// 功能 : 得到 USB 驱动 hidusb 的驱动对象,并遍历以上所有设备
// 对象,过滤出 USB 键盘设备,将其设备对象返回
// 注意 :
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2007.02.13
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
/////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////
NTSTATUS
GetUsbKeybordDevice( OUT PDEVICE_OBJECT* UsbDeviceObject )
{
UNICODE_STRING DriverName;
PDRIVER_OBJECT DriverObject = NULL;
PDEVICE_OBJECT DeviceObject = NULL;
BOOLEAN bFound = FALSE;
RtlInitUnicodeString( &DriverName, USBKEYBOARDNAME );
ObReferenceObjectByName( &DriverName,
OBJ_CASE_INSENSITIVE,
NULL,
0,
( POBJECT_TYPE ) IoDriverObjectType,
KernelMode,
NULL,
&DriverObject );
if ( DriverObject == NULL )
{
DbgPrint( "Not found USB Keyboard Device hidusb!\n" );
return STATUS_UNSUCCESSFUL;
}
DeviceObject = DriverObject->DeviceObject;
while ( DeviceObject )
{
GetDeviceObjectInfo( DeviceObject );
if ( DeviceObject->AttachedDevice )
{
//
// 查找 USB 键盘设备
//
if ( GetAttachedDeviceInfo( DeviceObject ) )
{
bFound = TRUE;
goto __End;
}
}
DeviceObject = DeviceObject->NextDevice;
}
__End:
if ( bFound )
{
//
// 找到则返回 USB 键盘设备对象
//
*UsbDeviceObject = DeviceObject;
}
else
{
*UsbDeviceObject = NULL;
}
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////
// 函数类型 : 自定义工具函数
// 函数模块 : 键盘过滤模块
////////////////////////////////////////////////////////////////
// 功能 : 创建过滤设备将其附加到需要跟踪的设备上,保存设备相关
// 信息,返回附加后的驱动对象
// 注意 : 此函数仅挂接 USB 键盘设备
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2005.12.27
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////
NTSTATUS
AttachUSBKeyboardDevice( IN PDEVICE_OBJECT UsbDeviceObject,
IN PDRIVER_OBJECT DriverObject )
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT TargetDevice;
PDEVICE_EXTENSION DevExt;
NTSTATUS ntStatus;
//
// 创建过滤设备对象
//
ntStatus = IoCreateDevice( DriverObject,
sizeof( DEVICE_EXTENSION ),
NULL,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject );
if ( !NT_SUCCESS( ntStatus ) )
{
DbgPrint( "IoCreateDevice() 0x%x!\n", ntStatus );
return ntStatus;
}
DevExt = ( PDEVICE_EXTENSION ) DeviceObject->DeviceExtension;
//
// 初始化自旋锁
//
KeInitializeSpinLock( &DevExt->SpinLock );
//
// 初始化 IRP 计数器
//
DevExt->IrpsInProgress = 0;
//
// 将过滤设备对象附加在目标设备对象之上,并返回附加后的原设备对象
//
TargetDevice = IoAttachDeviceToDeviceStack( DeviceObject, UsbDeviceObject );
if ( !TargetDevice )
{
IoDeleteDevice( DeviceObject );
DbgPrint( "IoAttachDeviceToDeviceStack() 0x%x!\n", ntStatus );
return STATUS_INSUFFICIENT_RESOURCES;
}
//
// 保存过滤设备信息
//
DevExt->DeviceObject = DeviceObject;
DevExt->TargetDevice = TargetDevice;
//
// 设置过滤设备相关信息与标志
//
DeviceObject->Flags |= ( DO_BUFFERED_IO | DO_POWER_PAGABLE );
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
/////////////////////////////////////////////////////////////////
// 函数类型 : 自定义工具函数
// 函数模块 : 键盘过滤模块
////////////////////////////////////////////////////////////////
// 功能 : 创建过滤设备将其附加到需要跟踪的设备上,保存设备相关
// 信息,返回附加后的驱动对象
// 注意 : 此函数仅挂接 PS/2 键盘设备
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2005.12.27
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////
NTSTATUS
AttachPS2KeyboardDevice( IN UNICODE_STRING* DeviceName, // 需要跟踪的设备名
IN PDRIVER_OBJECT DriverObject, // 过滤驱动也就是本驱动的驱动对象
OUT PDRIVER_OBJECT* FilterDriverObject ) // 返回附加后的驱动对象
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT FilterDeviceObject;
PDEVICE_OBJECT TargetDevice;
PFILE_OBJECT FileObject;
PDEVICE_EXTENSION DevExt;
NTSTATUS ntStatus;
//
// 根据设备名称找到需要附加的设备对象
//
ntStatus = IoGetDeviceObjectPointer( DeviceName,
FILE_ALL_ACCESS,
&FileObject,
&DeviceObject );
if ( !NT_SUCCESS( ntStatus ) )
{
DbgPrint( "IoGetDeviceObjectPointer() 0x%x\n", ntStatus );
return ntStatus;
}
//
// 创建过滤设备对象
//
ntStatus = IoCreateDevice( DriverObject,
sizeof( DEVICE_EXTENSION ),
NULL,
FILE_DEVICE_KEYBOARD,
0,
FALSE,
&FilterDeviceObject );
if ( !NT_SUCCESS( ntStatus ) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -