I find that one of the problem was caused by NtReadFile call from
Rundll32.exe after adding the filter (after add the filter , the HID Game
controller will return INVALID_USER_BUFFER for READ).
I used IRP Tracker to trace the IRP flow :
Without Filter :
08:55:40.061 NTAPIRet NtDeviceIoControlFile rundll32.exe
\Device_HID00000002#COLLECTION00000001 DEVICE_CONTROL SUCCESS
Process : rundll32.exe
NTAPI Data :
IN HANDLE FileHandle = 0x218
PFILE_OBJECT FileObject = 0xff451318
PDEVICE_OBJECT DeviceObject = 0xffb66d50
(\Device_HID00000002#COLLECTION00000001)
IN HANDLE Event = 0x0
IN PIO_APC_ROUTINE ApcRoutine = 0x0
IN PVOID ApcContext = 0x0
OUT PIO_STATUS_BLOCK IoStatusBlock = 0x115ff20
NTSTATUS Status = 0x0 (SUCCESS)
PVOID Pointer = 0x0
ULONG_PTR Information = 0x0
IN ULONG IoControlCode = 0xb0197 (Unknown)
IN PVOID InputBuffer = 0x0
IN ULONG InputBufferLength = 0x0
OUT PVOID OutputBuffer = 0x0
IN ULONG OutputBufferLength = 0x0
08:55:40.061 NTAPI NtReadFile rundll32.exe
\Device_HID00000002#COLLECTION00000001 READ
Process : rundll32.exe
NTAPI Data :
IN HANDLE FileHandle = 0x218
PFILE_OBJECT FileObject = 0xff451318
PDEVICE_OBJECT DeviceObject = 0xffb66d50
(\Device_HID00000002#COLLECTION00000001)
IN HANDLE Event = 0x0
IN PIO_APC_ROUTINE ApcRoutine = 0x77e906d0
IN PVOID ApcContext = 0x955a8
OUT PIO_STATUS_BLOCK IoStatusBlock = 0xb5348
OUT PVOID Buffer = 0xb5b78
IN ULONG Length = 0x9
IN PLARGE_INTEGER ByteOffset = 0x115ff40
*ByteOffset = 0x0
IN PULONG Key = 0x0
08:55:40.061 Call 0x82DF4EB8-122 \Device_HID00000002#COLLECTION00000001
READ NORMAL
Process : rundll32.exe
Irp Data :
SHORT Type = 0x6
USHORT Size = 0x148
PMDL MdlAddress = 0xff61c670
ULONG Flags = 0x900
union AssociatedIrp
struct _IRP *MasterIrp = 0x0
LONG IrpCount = 0x0
PVOID SystemBuffer = 0x0
LIST_ENTRY ThreadListEntry
LIST_ENTRY Flink = 0x8199f6b8
LIST_ENTRY Blink = 0x8199f6b8
IO_STATUS_BLOCK IoStatus
NTSTATUS Status = 0x0 (SUCCESS)
PVOID Pointer = 0x0
ULONG Information = 0x0
KPROCESSOR_MODE RequestorMode = 0x1 (UserMode)
BOOLEAN PendingReturned = 0x0
CHAR StackCount = 0x6
CHAR CurrentLocation = 0x6
BOOLEAN Cancel = 0x0
ULONG CancelIrql = 0x0
CCHAR ApcEnvironment = 0x0
UCHAR AllocationFlags = 0x81
PIO_STATUS_BLOCK UserIosb = 0xb5348
PKEVENT UserEvent = 0x0
union Overlay
struct AsynchronousParameters
PIO_APC_ROUTINE UserApcRoutine = 0x77e906d0
PVOID UserApcContext = 0x955a8
LARGE_INTEGER AllocationSize
LONGLONG QuadPart = 0x77e906d0
PDRIVER_CANCEL CancelRoutine = 0x0
PVOID UserBuffer = 0x0
union Tail
struct Overlay
KDEVICE_QUEUE_ENTRY DeviceQueueEntry
LIST_ENTRY DeviceListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
ULONG SortKey = 0x0
CHAR Inserted = 0x0
PVOID DriverContext[4]
PVOID DriverContext[0] = 0x0
PVOID DriverContext[1] = 0x0
PVOID DriverContext[2] = 0x0
PVOID DriverContext[3] = 0x0
PETHREAD Thread = 0x8199f4a8
PCHAR AuxiliaryBuffer = 0x0
LIST_ENTRY ListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
PIO_STACK_LOCATION CurrentStackLocation = 0x82df4fdc
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0x0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xffb66d50
(\Device_HID00000002#COLLECTION00000001)
PFILE_OBJECT FileObject = 0xff451318
PIO_COMPLETION_ROUTINE CompletionRoutine = 0x0
PVOID Context = 0x0
ULONG PacketType = 0x82df4fdc
PFILE_OBJECT OriginalFileObject = 0xff451318
KAPC Apc
USHORT Type = 0x0
USHORT Size = 0x0
ULONG Spare0 = 0x0
PETHREAD Thread = 0x0
LIST_ENTRY ApcListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x8199f4a8
PVOID KernelRoutine = 0x0
PVOID RundownRoutine = 0x0
PVOID NormalRoutine = 0x82df4fdc
PVOID NormalContext = 0x82df4fdc
PVOID SystemArgument1 = 0xff451318
PVOID SystemArgument2 = 0x0
CHAR ApcStateIndex = 0x0
CHAR ApcMode = 0x0
CHAR Inserted = 0x0
PVOID CompletionKey = 0x0
08:55:40.061 NTAPIRet NtReadFile rundll32.exe
\Device_HID00000002#COLLECTION00000001 READ PENDING
Process : rundll32.exe
NTAPI Data :
IN HANDLE FileHandle = 0x218
PFILE_OBJECT FileObject = 0xff451318
PDEVICE_OBJECT DeviceObject = 0xffb66d50
(\Device_HID00000002#COLLECTION00000001)
IN HANDLE Event = 0x0
IN PIO_APC_ROUTINE ApcRoutine = 0x77e906d0
IN PVOID ApcContext = 0x955a8
OUT PIO_STATUS_BLOCK IoStatusBlock = 0xb5348
NTSTATUS Status = 0x103 (PENDING)
PVOID Pointer = 0x103
ULONG_PTR Information = 0x0
OUT PVOID Buffer = 0xb5b78
IN ULONG Length = 0x9
IN PLARGE_INTEGER ByteOffset = 0x115ff40
*ByteOffset = 0x0
IN PULONG Key = 0x0
08:55:40.081 Comp 0x82DF4EB8-122 \Device_HID00000002#COLLECTION00000001
READ NORMAL SUCCESS, Info = 0x9
Process : rundll32.exe
Irp Data :
SHORT Type = 0x6
USHORT Size = 0x148
PMDL MdlAddress = 0xff61c670
ULONG Flags = 0x40000900
union AssociatedIrp
struct _IRP *MasterIrp = 0x0
LONG IrpCount = 0x0
PVOID SystemBuffer = 0x0
LIST_ENTRY ThreadListEntry
LIST_ENTRY Flink = 0x8199f6b8
LIST_ENTRY Blink = 0x8199f6b8
IO_STATUS_BLOCK IoStatus
NTSTATUS Status = 0x0 (SUCCESS)
PVOID Pointer = 0x0
ULONG Information = 0x9
KPROCESSOR_MODE RequestorMode = 0x1 (UserMode)
BOOLEAN PendingReturned = 0x0
CHAR StackCount = 0x6
CHAR CurrentLocation = 0x6
BOOLEAN Cancel = 0x0
ULONG CancelIrql = 0x0
CCHAR ApcEnvironment = 0x0
UCHAR AllocationFlags = 0x81
PIO_STATUS_BLOCK UserIosb = 0xb5348
PKEVENT UserEvent = 0x0
union Overlay
struct AsynchronousParameters
PIO_APC_ROUTINE UserApcRoutine = 0x77e906d0
PVOID UserApcContext = 0x955a8
LARGE_INTEGER AllocationSize
LONGLONG QuadPart = 0x77e906d0
PDRIVER_CANCEL CancelRoutine = 0x0
PVOID UserBuffer = 0x0
union Tail
struct Overlay
KDEVICE_QUEUE_ENTRY DeviceQueueEntry
LIST_ENTRY DeviceListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
ULONG SortKey = 0x0
CHAR Inserted = 0x0
PVOID DriverContext[4]
PVOID DriverContext[0] = 0x0
PVOID DriverContext[1] = 0x0
PVOID DriverContext[2] = 0x0
PVOID DriverContext[3] = 0x0
PETHREAD Thread = 0x8199f4a8
PCHAR AuxiliaryBuffer = 0x0
LIST_ENTRY ListEntry
LIST_ENTRY *Flink = 0x8053a2c4
LIST_ENTRY *Blink = 0x8053a2c4
PIO_STACK_LOCATION CurrentStackLocation = 0x82df4fdc
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0x0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xffb66d50
(\Device_HID00000002#COLLECTION00000001)
PFILE_OBJECT FileObject = 0xff451318
PIO_COMPLETION_ROUTINE CompletionRoutine = 0x0
PVOID Context = 0x0
ULONG PacketType = 0x82df4fdc
PFILE_OBJECT OriginalFileObject = 0xff451318
KAPC Apc
USHORT Type = 0x0
USHORT Size = 0x0
ULONG Spare0 = 0x0
PETHREAD Thread = 0x0
LIST_ENTRY ApcListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x8199f4a8
PVOID KernelRoutine = 0x0
PVOID RundownRoutine = 0x8053a2c4
PVOID NormalRoutine = 0x82df4fdc
PVOID NormalContext = 0x82df4fdc
PVOID SystemArgument1 = 0xff451318
PVOID SystemArgument2 = 0x0
CHAR ApcStateIndex = 0x0
CHAR ApcMode = 0x0
CHAR Inserted = 0x0
PVOID CompletionKey = 0x0
With Filter :
09:02:51.522 NTAPIRet NtDeviceIoControlFile rundll32.exe (0xFF589F08)
\Driver\Ctrl2cap DEVICE_CONTROL SUCCESS
Process : rundll32.exe
NTAPI Data :
IN HANDLE FileHandle = 0x218
PFILE_OBJECT FileObject = 0x81a35a30
PDEVICE_OBJECT DeviceObject = 0xff589f08 ((0xFF589F08) \Driver\Ctrl2cap)
IN HANDLE Event = 0x0
IN PIO_APC_ROUTINE ApcRoutine = 0x0
IN PVOID ApcContext = 0x0
OUT PIO_STATUS_BLOCK IoStatusBlock = 0x115ff20
NTSTATUS Status = 0x0 (SUCCESS)
PVOID Pointer = 0x0
ULONG_PTR Information = 0x0
IN ULONG IoControlCode = 0xb0197 (Unknown)
IN PVOID InputBuffer = 0x0
IN ULONG InputBufferLength = 0x0
OUT PVOID OutputBuffer = 0x0
IN ULONG OutputBufferLength = 0x0
09:02:51.522 NTAPI NtReadFile rundll32.exe (0xFF589F08) \Driver\Ctrl2cap
READ
Process : rundll32.exe
NTAPI Data :
IN HANDLE FileHandle = 0x218
PFILE_OBJECT FileObject = 0x81a35a30
PDEVICE_OBJECT DeviceObject = 0xff589f08 ((0xFF589F08) \Driver\Ctrl2cap)
IN HANDLE Event = 0x0
IN PIO_APC_ROUTINE ApcRoutine = 0x77e906d0
IN PVOID ApcContext = 0xa4308
OUT PIO_STATUS_BLOCK IoStatusBlock = 0xac9e8
OUT PVOID Buffer = 0xa30f0
IN ULONG Length = 0x9
IN PLARGE_INTEGER ByteOffset = 0x115ff40
*ByteOffset = 0x0
IN PULONG Key = 0x0
09:02:51.522 Call 0x835FAE90-122 (0xFF589F08) \Driver\Ctrl2cap
\Device_HID00000003#COLLECTION00000001 READ NORMAL
Process : rundll32.exe
Irp Data :
SHORT Type = 0x6
USHORT Size = 0x16c
PMDL MdlAddress = 0x0
ULONG Flags = 0x40000900
union AssociatedIrp
struct _IRP *MasterIrp = 0x0
LONG IrpCount = 0x0
PVOID SystemBuffer = 0x0
LIST_ENTRY ThreadListEntry
LIST_ENTRY Flink = 0xffa14230
LIST_ENTRY Blink = 0xffa14230
IO_STATUS_BLOCK IoStatus
NTSTATUS Status = 0x0 (SUCCESS)
PVOID Pointer = 0x0
ULONG Information = 0x0
KPROCESSOR_MODE RequestorMode = 0x1 (UserMode)
BOOLEAN PendingReturned = 0x0
CHAR StackCount = 0x7
CHAR CurrentLocation = 0x6
BOOLEAN Cancel = 0x0
ULONG CancelIrql = 0x0
CCHAR ApcEnvironment = 0x0
UCHAR AllocationFlags = 0x81
PIO_STATUS_BLOCK UserIosb = 0xac9e8
PKEVENT UserEvent = 0x0
union Overlay
struct AsynchronousParameters
PIO_APC_ROUTINE UserApcRoutine = 0x77e906d0
PVOID UserApcContext = 0xa4308
LARGE_INTEGER AllocationSize
LONGLONG QuadPart = 0x77e906d0
PDRIVER_CANCEL CancelRoutine = 0x0
PVOID UserBuffer = 0xa30f0
union Tail
struct Overlay
KDEVICE_QUEUE_ENTRY DeviceQueueEntry
LIST_ENTRY DeviceListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
ULONG SortKey = 0x0
CHAR Inserted = 0x0
PVOID DriverContext[4]
PVOID DriverContext[0] = 0x0
PVOID DriverContext[1] = 0x0
PVOID DriverContext[2] = 0x0
PVOID DriverContext[3] = 0x0
PETHREAD Thread = 0xffa14020
PCHAR AuxiliaryBuffer = 0x0
LIST_ENTRY ListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
PIO_STACK_LOCATION CurrentStackLocation = 0x835fafb4
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0xe0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xff519030
(\Device_HID00000003#COLLECTION00000001)
PFILE_OBJECT FileObject = 0x81a35a30
PIO_COMPLETION_ROUTINE CompletionRoutine = 0xf9a45af0
PVOID Context = 0xff589f08
PIO_STACK_LOCATION StackLocation 7
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0x0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xff589f08 ((0xFF589F08) \Driver\Ctrl2cap)
PFILE_OBJECT FileObject = 0x81a35a30
PIO_COMPLETION_ROUTINE CompletionRoutine = 0x0
PVOID Context = 0x0
ULONG PacketType = 0x835fafb4
PFILE_OBJECT OriginalFileObject = 0x81a35a30
KAPC Apc
USHORT Type = 0x0
USHORT Size = 0x0
ULONG Spare0 = 0x0
PETHREAD Thread = 0x0
LIST_ENTRY ApcListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0xffa14020
PVOID KernelRoutine = 0x0
PVOID RundownRoutine = 0x0
PVOID NormalRoutine = 0x835fafb4
PVOID NormalContext = 0x835fafb4
PVOID SystemArgument1 = 0x81a35a30
PVOID SystemArgument2 = 0x0
CHAR ApcStateIndex = 0x0
CHAR ApcMode = 0x0
CHAR Inserted = 0x0
PVOID CompletionKey = 0x0
09:02:51.522 Comp 0x835FAE90-122 \Device_HID00000003#COLLECTION00000001
READ NORMAL INVALID_USER_BUFFER, Info = 0x0
Process : rundll32.exe
Irp Data :
SHORT Type = 0x6
USHORT Size = 0x16c
PMDL MdlAddress = 0x0
ULONG Flags = 0x40000900
union AssociatedIrp
struct _IRP *MasterIrp = 0x0
LONG IrpCount = 0x0
PVOID SystemBuffer = 0x0
LIST_ENTRY ThreadListEntry
LIST_ENTRY Flink = 0xffa14230
LIST_ENTRY Blink = 0xffa14230
IO_STATUS_BLOCK IoStatus
NTSTATUS Status = 0xc00000e8 (INVALID_USER_BUFFER)
PVOID Pointer = 0xc00000e8
ULONG Information = 0x0
KPROCESSOR_MODE RequestorMode = 0x1 (UserMode)
BOOLEAN PendingReturned = 0x0
CHAR StackCount = 0x7
CHAR CurrentLocation = 0x6
BOOLEAN Cancel = 0x0
ULONG CancelIrql = 0x0
CCHAR ApcEnvironment = 0x0
UCHAR AllocationFlags = 0x81
PIO_STATUS_BLOCK UserIosb = 0xac9e8
PKEVENT UserEvent = 0x0
union Overlay
struct AsynchronousParameters
PIO_APC_ROUTINE UserApcRoutine = 0x77e906d0
PVOID UserApcContext = 0xa4308
LARGE_INTEGER AllocationSize
LONGLONG QuadPart = 0x77e906d0
PDRIVER_CANCEL CancelRoutine = 0x0
PVOID UserBuffer = 0xa30f0
union Tail
struct Overlay
KDEVICE_QUEUE_ENTRY DeviceQueueEntry
LIST_ENTRY DeviceListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
ULONG SortKey = 0x0
CHAR Inserted = 0x0
PVOID DriverContext[4]
PVOID DriverContext[0] = 0x0
PVOID DriverContext[1] = 0x0
PVOID DriverContext[2] = 0x0
PVOID DriverContext[3] = 0x0
PETHREAD Thread = 0xffa14020
PCHAR AuxiliaryBuffer = 0x0
LIST_ENTRY ListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0x0
PIO_STACK_LOCATION CurrentStackLocation = 0x835fafb4
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0xe0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xff519030
(\Device_HID00000003#COLLECTION00000001)
PFILE_OBJECT FileObject = 0x81a35a30
PIO_COMPLETION_ROUTINE CompletionRoutine = 0xf9a45af0
PVOID Context = 0xff589f08
PIO_STACK_LOCATION StackLocation 7
UCHAR MajorFunction = 0x3 (READ)
UCHAR MinorFunction = 0x0 (NORMAL)
UCHAR Flags = 0x0
UCHAR Control = 0x0
union Parameters
struct Read
ULONG Length = 0x9
ULONG Key = 0x0
LARGE_INTEGER ByteOffset
LONGLONG QuadPart = 0x0
PDEVICE_OBJECT DeviceObject = 0xff589f08 ((0xFF589F08) \Driver\Ctrl2cap)
PFILE_OBJECT FileObject = 0x81a35a30
PIO_COMPLETION_ROUTINE CompletionRoutine = 0x0
PVOID Context = 0x0
ULONG PacketType = 0x835fafb4
PFILE_OBJECT OriginalFileObject = 0x81a35a30
KAPC Apc
USHORT Type = 0x0
USHORT Size = 0x0
ULONG Spare0 = 0x0
PETHREAD Thread = 0x0
LIST_ENTRY ApcListEntry
LIST_ENTRY *Flink = 0x0
LIST_ENTRY *Blink = 0xffa14020
PVOID KernelRoutine = 0x0
PVOID RundownRoutine = 0x0
PVOID NormalRoutine = 0x835fafb4
PVOID NormalContext = 0x835fafb4
PVOID SystemArgument1 = 0x81a35a30
PVOID SystemArgument2 = 0x0
CHAR ApcStateIndex = 0x0
CHAR ApcMode = 0x0
CHAR Inserted = 0x0
PVOID CompletionKey = 0x0