HID源码分析
+ -

HidClassFDO_DispatchRequest

2022-05-07 205 0

NTSTATUS
HidClassFDO_DispatchRequest(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
{
    PHIDCLASS_COMMON_DEVICE_EXTENSION CommonDeviceExtension;
    NTSTATUS Status;
    PIO_STACK_LOCATION IoStack;

    //
    // get device extension
    //
    CommonDeviceExtension = DeviceObject->DeviceExtension;

    ASSERT(Irp->CurrentLocation > 0);

    //
    // create stack location
    //
    IoSetNextIrpStackLocation(Irp);

    //
    // get next stack location
    //
    IoStack = IoGetCurrentIrpStackLocation(Irp);

    //
    // store device object
    //
    IoStack->DeviceObject = DeviceObject;

    //
    // sanity check
    //
    ASSERT(CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction] != NULL);

    //
    // call driver
    //
    Status = CommonDeviceExtension->DriverExtension->MajorFunction[IoStack->MajorFunction](DeviceObject, Irp);

    //
    // done
    //
    return Status;
}

IoSetNextIrpStackLocationion源代码

FORCEINLINE
VOID
IoSetNextIrpStackLocation (
   _Inout_ PIRP Irp
    )
/*--

Routine Description:

    This routine is invoked to set the current IRP stack location to
    the next stack location, i.e. it "pushes" the stack.

Arguments:

    Irp - Pointer to the I/O Request Packet (IRP).

Return Value:

    None.

--*/
{
    NT_ASSERT(Irp->CurrentLocation > 0);
    Irp->CurrentLocation--;
    Irp->Tail.Overlay.CurrentStackLocation--;
}
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

HidClassFDO_DispatchRequest
NTSTATUSHidClassFDO_DispatchRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ PHIDCLASS_COMMON_DEVICE_EXTENSION CommonDeviceExtens......
HID.dll与整个HID驱动程序架构的关系揭密
这里我们首先回顾一下HID相关驱动之间的调用关系图。USB HID设备主要由包括以下几个驱动:HidClass.sys 这个驱动是HID驱动的类驱动,其实就是一个DLL,用于处理USB HID驱动通用功能。HIDUSB.sys 这个驱动是HID驱动的miniPort驱动,即我们常说的迷你小端口......
hidclass.sys多输入报告的长度研究
有没有思考过一个问题,一般我们的HID设备只一个输入输出报告,那么在hidclass.sys中在循环读取输入报告时,按指定的长度来进行读取即可。但是,我们知道,一个HID设备是可以支持多个输入报告的,多个输入报告使用ReportId来区分的。如我们提供如下的一个自定义通讯HID设备:0x06,0x......
HIDCLASS.SYS获取HID设备的硬件ID
在应用层通过如下代码实现: HANDLE tmp_DeviceHandle = CreateFile(st.DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, ......
HIDCLASS.SYS对外支持的IOCTL
//// Macro for defining HID ioctls//#define HID_CTL_CODE(id) CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS)#defi......
HIDCLASS电源事件IOCTL_GET_SYS_BUTTON_EVENT
系统应该是向HID设备发送一个IOCTL_GET_SYS_BUTTON_EVENT请求,该请求被HID设备Pending挂起,当有相关的Power Button报告时,完成该事件。#define FILE_DEVICE_BATTERY 0x00000029#define ......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!