21,597
社区成员
发帖
与我相关
我的任务
分享
case IRP_MJ_WRITE:
WriteLen = irpStack->Parameters.Write.Length;
DebugPrint(("Write : %d\n", WriteLen));
if (irpStack->Parameters.Write.Length >= sizeof(VK_SENDKEY)) {
status = FilterWriteRequest(DeviceObject, Irp, Irp->AssociatedIrp.SystemBuffer, WriteLen);
if (NT_SUCCESS(status))
Irp->IoStatus.Information = WriteLen;
}
else {
status = STATUS_INVALID_PARAMETER;
}
break;
即当得到符合长度的数据就往设备里面写,这个写函数如下: NTSTATUS FilterWriteRequest(PDEVICE_OBJECT RequestDevice, PIRP Irp, PUCHAR WriteBuffer, ULONG WriteLen)
{
PDEVICE_OBJECT pDeviceObject;
PCOMMON_DEVICE_DATA commonData;
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
PIRP pNewIrp;
IO_STATUS_BLOCK NewIoStatus;
KEVENT NewEvent;
NTSTATUS NewNtStatus = STATUS_UNSUCCESSFUL;
ULONG IoControlCode;
URB urb;
UCHAR byData[64] = {0x03, 0x07};
PIO_STACK_LOCATION pStack;
// 遍历并找到第一个符合的设备
pDeviceObject = RequestDevice->DriverObject->DeviceObject;
while (pDeviceObject != NULL) {
commonData = (PCOMMON_DEVICE_DATA)pDeviceObject->DeviceExtension;
DebugPrint(("FilterWriteRequest+2: %p %x\n", pDeviceObject, commonData->Type));
if (commonData->Type == DEVICE_TYPE_FIDO) {
UsbBuildInterruptOrBulkTransferRequest(
&urb,
sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
(USBD_PIPE_HANDLE)0x02,
byData,
NULL,
sizeof(byData),
0,
NULL
);
IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
KeInitializeEvent(&NewEvent, NotificationEvent, FALSE);
pNewIrp = IoBuildDeviceIoControlRequest(
IoControlCode,
pDeviceObject,
NULL,
0,
NULL,
0,
TRUE, // internal ( use IRP_MJ_INTERNAL_DEVICE_CONTROL )
&NewEvent,
&NewIoStatus
);
if (pNewIrp != NULL) {
pStack = IoGetNextIrpStackLocation(pNewIrp);
pStack->Parameters.Others.Argument1 = (PVOID)&urb;
NewNtStatus = IoCallDriver(pDeviceObject, pNewIrp);
DebugPrint(("FilterWriteRequest+3: %x\n", NewNtStatus));
if (NewNtStatus == STATUS_PENDING) {
DebugPrint(("FilterWriteRequest+4: Wait for single object\n"));
NewNtStatus = KeWaitForSingleObject(
&NewEvent,
Suspended,
KernelMode,
FALSE,
NULL);
DebugPrint(("CycleResetDevice+5: Wait forsingle object, returned %x\n", NewNtStatus));
} else {
NewIoStatus.Status = NewNtStatus;
}
NewNtStatus = NewIoStatus.Status;
}
else {
NewNtStatus = STATUS_INSUFFICIENT_RESOURCES;
}
ntStatus = NewNtStatus;
break;
}
// 换成下一个设备,继续遍历
pDeviceObject = pDeviceObject->NextDevice;
}
return ntStatus;
}