21,595
社区成员
发帖
与我相关
我的任务
分享
NInputEvtDevicePrepareHardware(
IN WDFDEVICE Device,
IN WDFCMRESLIST ResourceList,
IN WDFCMRESLIST ResourceListTranslated
)
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_EXTENSION devContext = NULL;
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams;
WDF_OBJECT_ATTRIBUTES attributes;
PUSB_DEVICE_DESCRIPTOR usbDeviceDescriptor = NULL;
UNREFERENCED_PARAMETER(ResourceList);
UNREFERENCED_PARAMETER(ResourceListTranslated);
PAGED_CODE ();
devContext = GetDeviceContext(Device);
if (!NT_SUCCESS(status)) {
// TErr(
//"WdfUsbTargetDeviceCreate failed 0x%x\n",
//status);
return status;
}
}
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE( &configParams);
status = WdfUsbTargetDeviceSelectConfig(devContext->Device,
WDF_NO_OBJECT_ATTRIBUTES,
&configParams);
if(!NT_SUCCESS(status)) {
//TErr(
// "WdfUsbTargetDeviceSelectConfig failed %!STATUS!\n",
// status );
return status;
}
devContext->Interface =
configParams.Types.SingleInterface.ConfiguredUsbInterface;
//
// Get the device descriptor and store it in device context
//
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
attributes.ParentObject = Device;
status = WdfMemoryCreate(
&attributes,
NonPagedPool,
0,
sizeof(USB_DEVICE_DESCRIPTOR),
&devContext->DeviceDescriptor,
&usbDeviceDescriptor
);
if(!NT_SUCCESS(status)) {
// TErr(
//"WdfMemoryCreate for Device Descriptor failed %!STATUS!\n",
// status);
return status;
}
WdfUsbTargetDeviceGetDeviceDescriptor(
devContext->Device,
usbDeviceDescriptor
);
// 获取Pipe句柄
status = GetUsbPipes(devContext);
if(!NT_SUCCESS(status))
return status;
/* TErr(
"HidFx2EvtDevicePrepareHardware Exit, Status:0x%x\n",
status);*/
return status;
}
case IOCTL_HID_READ_REPORT:
status = NInputReadReport(devContext, Request, &RequestPending);
break;
NTSTATUS INTERNAL
UsbAsyncReadData(
__in PDEVICE_EXTENSION DevContext,
__in ULONG BuffLen,
__in PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine,
__in WDFREQUEST Request
)
{
NTSTATUS status = STATUS_SUCCESS;
WDFUSBPIPE BulkInputPipe;
WDFMEMORY hMem;
WDFREQUEST USBRequest = {0};
PUCHAR ReadBuffer = NULL;
BOOLEAN SentRequest = FALSE;
WDF_OBJECT_ATTRIBUTES RequestAttributes = {0};
WDFIOTARGET UsbIoTarget;
WDFIOTARGET SerialIoTarget;
WDFDEVICE hDevice;
//可能有问题
hDevice = WdfIoQueueGetDevice(DevContext->PingPongQueue);
BulkInputPipe = GetBulkPipe(TRUE, hDevice);
UsbIoTarget=WdfUsbTargetPipeGetIoTarget(BulkInputPipe);
SerialIoTarget=DevContext->IoTarget;
USBRequest=Request;
//status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES,
// UsbIoTarget,
// &USBRequest);
if(!NT_SUCCESS(status)){
TErr(("WdfRequestCreate failed.status=0x%x!", status));
return status;
}
//创建新的request //WDF_OBJECT_ATTRIBUTES_INIT(&RequestAttributes);
//RequestAttributes.ParentObject = USBRequest;
//status = WdfMemoryCreate(&RequestAttributes,
// NonPagedPool,
// 0,
// (size_t)BuffLen,
// &hMem,
// &ReadBuffer);
if(NT_SUCCESS(status)){
//RtlZeroMemory(ReadBuffer, BuffLen);
if(NULL == BulkInputPipe)
{
WdfRequestComplete(USBRequest, STATUS_UNSUCCESSFUL);
return status;
}
status = WdfRequestRetrieveOutputMemory(USBRequest, &hMem);
if(!NT_SUCCESS(status))
{
//KDBG(DPFLTR_INFO_LEVEL, "WdfRequestRetrieveOutputMemory failed with status 0x%0.8x!!!", status);
WdfRequestComplete(USBRequest, status);
return status;
}
// 和写一样,利用新建的对象访问
// 除了重利用外,也可以新建一个Request对象。新建的方法在本工程其他地方用得较多。
status = WdfUsbTargetPipeFormatRequestForRead(BulkInputPipe, USBRequest, hMem, NULL);
if(!NT_SUCCESS(status))
{
//KDBG(DPFLTR_INFO_LEVEL, "WdfUsbTargetPipeFormatRequestForRead failed with status 0x%08x\n", status);
WdfRequestComplete(USBRequest, status);
return status;
}
WdfRequestSetCompletionRoutine(USBRequest, CompletionRoutine,BulkInputPipe );
//此处发送成功,但是request没有返回,且获取不到params值 if(FALSE == WdfRequestSend(USBRequest, WdfUsbTargetPipeGetIoTarget(BulkInputPipe), NULL))
{
status = WdfRequestGetStatus(USBRequest);
//KDBG(DPFLTR_INFO_LEVEL, "WdfRequestSend failed with status 0x%08x\n", status);
WdfRequestComplete(USBRequest, status);
WdfObjectDelete(USBRequest);
}
}
TExit(Func, ("=%x", status));
return status;
}