阅读:2238回复:6
PDIUSB12 中的IOCTL_READ_REGISTERS IOCTL调用问题
我写的PDIUSB12 WDM驱动程序可以运行,可以选择CONFIG了。我做了几个IOCTL接口供应用程序调用,有
IOCTL_D12_GET_DEVICE_DESCRIPTOR,IOCTL_D12_GET_DEVICE_DESCRIPTOR,IOCTL_D12_GE T_DEVICE_DESCRIPTOR, 这些都成功了,我自己写了一个WIN32程序可以成功地调用这三个接口了。但是我看了别人的WIN32源程序,就是在驱动开发网下载的那个,里边有一个IOCTL_READ_REGISTERS的IOCTL调用,我想应该是一个VENDOR自定义的IO操作,但我不知道如何用UsbBuildVendorRequest去 构建相应的URB。请问各位大侠知道怎么办吗? |
|
最新喜欢:![]()
|
沙发#
发布于:2005-05-12 14:45
能把pdiusb12 的驱动程序代码给我一份么,我参考一下 ,谢谢了。
taoyijian@163.com |
|
板凳#
发布于:2002-06-22 10:55
对已经写好的固件程序是如此。
|
|
|
地板#
发布于:2002-06-19 00:49
Request, Value, Index的定义应该是厂商事先定义好了的吧?
当然,自己可以通过驱动程序改变它和WIN32应该程序的接口,但是如果和硬件打交道,那些值好像应该就确定的,您说是吗。 |
|
|
地下室#
发布于:2002-06-18 11:22
这就是USB灵活的地方,Request、Value、Index的定义和使用完全由设备驱动程序和固件程序定义,没有使用固件程序不好办。
|
|
|
5楼#
发布于:2002-06-18 01:20
请看看,有重要问题:
我想问的正是它的Request和Index的号码。其中ReadRegister的操作我已经成功了。我是用了一个大大的循环来试出的Request和Index的值,也许某个文档上有它的值,只是我没有注意到罢了。下边是我的代码: /////////////////////////////////////////////////////////////////////////////// #pragma LOCKEDCODE NTSTATUS ReadRegister(PDEVICE_OBJECT fdo, PIRP Irp) { //ReadRegister NTSTATUS status = STATUS_SUCCESS; PURB urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER)); if (!urb) { KdPrint((DRIVERNAME \" - Unable to allocate interrupt polling URB\\n\")); IoFreeIrp(Irp); return STATUS_INSUFFICIENT_RESOURCES; } //This loop just for test, It\'s no use in final code. for(ULONG i=0; i<1; i++) { UsbBuildVendorRequest(urb, URB_FUNCTION_VENDOR_DEVICE, sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST), USBD_TRANSFER_DIRECTION_IN, 0, IOCTL_READ_REGISTERS, //Request,read_write_register 0, //Value GET_FIRMWARE_VERSION, //Index Irp->UserBuffer, //Transfer Buffer NULL, //TransferBufferMDL 1, //TransferBufferLength NULL); status = SendAwaitUrb(fdo, urb); //The same function is as CallUSBDI(); if(!NT_SUCCESS(status)) { KdPrint((\"___Read 472 register failed status = %x i = %d\\n\", status, i)); } else { KdPrint((\"___Read 472 register successfully. r = %x i = %d\\n\", (PCHAR)Irp->UserBuffer, i)); } } return status; } //ReadRegister 现在我的问题是Write Register的操作我又不知道怎么办了,我写了如下代码,但是却是失败的: /////////////////////////////////////////////////////////////////////////////// #pragma LOCKEDCODE NTSTATUS WriteRegister(PDEVICE_OBJECT fdo, PIRP Irp) { //WriteRegister NTSTATUS status = STATUS_SUCCESS; PURB urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER)); if (!urb) { KdPrint((DRIVERNAME \" - Unable to allocate interrupt polling URB\\n\")); IoFreeIrp(Irp); return STATUS_INSUFFICIENT_RESOURCES; } PIO_REQUEST ioRequest; PIO_BLOCK ioBlock; ioBlock = (PIO_BLOCK)Irp->AssociatedIrp.SystemBuffer; ioRequest = (PIO_REQUEST)ioBlock->pbyData; KdPrint((\"ioRequest->uAddressL = 0x%x \\n\", ioRequest->uAddressL)); KdPrint((\"ioRequest->bAddressH = 0x%x \\n\", ioRequest->bAddressH)); KdPrint((\"ioRequest->uSize = 0x%x \\n\", ioRequest->uSize)); KdPrint((\"ioRequest->bCommand = 0x%x \\n\", ioRequest->bCommand)); //This loop just for test, It\'s no use in final code. for(ULONG i=0; i<1; i++) { UsbBuildVendorRequest(urb, URB_FUNCTION_VENDOR_DEVICE, sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST), USBD_TRANSFER_DIRECTION_OUT, 0, IOCTL_WRITE_REGISTERS, //Request,read_write_register 0, //Value SETUP_DMA_REQUEST, //Index (PVOID)ioRequest, //ioRequest->uSize, //Transfer Buffer NULL, //TransferBufferMDL sizeof(PIO_REQUEST), //TransferBufferLength NULL); status = SendAwaitUrb(fdo, urb); //The same function is as CallUSBDI(); if(!NT_SUCCESS(status)) { KdPrint((\"___Write xSETUP_DMA_REQUEST register failed status = %x i = %d\\n\", status, i)); } else { KdPrint((\"___Write xSETUP_DMA_REQUEST register successfully. i = %d\\n\", i)); } } return status; } //WriteRegister 请问大侠,应该怎么办? :D :cool: :D :( |
|
|
6楼#
发布于:2002-06-15 12:22
这是我经过无数次检验的代码,应该很适合你
NTSTATUS UsbDriverControlVendorCommandWorker( IN PVOID DeviceContext, IN UCHAR Request, IN USHORT Value, IN USHORT Index, IN PVOID Buffer, IN OUT PULONG BufferLength, IN BOOLEAN GetData ) /*++ Routine Description: Send a vendor command to the camera to fetch data. Arguments: DeviceObject - pointer to the device object for this instance of the USB camera devcice. Request - Request code for setup packet. Value - Value for setup packet. Index - Index for setup packet. Buffer - Pointer to input buffer BufferLength - pointer size of input/output buffer (optional) Return Value: NT status code --*/ { NTSTATUS ntStatus; BOOLEAN allocated = FALSE; PUCHAR localBuffer; PUCHAR buffer; PURB urb; PDEVICE_OBJECT deviceObject; ULONG length = BufferLength ? *BufferLength : 0; USHORT i; #if DBG DebugPrint(\"\'enter USBCAMD_ControlVendorCommand\\n\"); #endif deviceObject = (PDEVICE_OBJECT)DeviceContext; buffer = (PUCHAR)UsbDriverExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) + length); if (buffer) { urb = (PURB) (buffer + length); #if DBG DebugPrint(\"enter UsbDriverControlVendorCommand() req %x val %x index %x\\n\", Request, Value, Index); #endif if (BufferLength && *BufferLength != 0) { localBuffer = buffer; if (!GetData) { RtlCopyMemory(localBuffer, Buffer, *BufferLength); } } else { localBuffer = NULL; } UsbBuildVendorRequest(urb, URB_FUNCTION_VENDOR_DEVICE, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), GetData ? USBD_TRANSFER_DIRECTION_IN : 0, 0, Request, Value, Index, localBuffer, NULL, length, NULL); #if DBG DebugPrint(\"BufferLength = 0x%x buffer = 0x%x\\n\", length, localBuffer); #endif ntStatus = UsbDriverCallUSBD(deviceObject, urb); if (NT_SUCCESS(ntStatus)) { if (BufferLength) { *BufferLength = urb->UrbControlVendorClassRequest.TransferBufferLength; #if DBG DebugPrint(\"\'BufferLength = 0x%x buffer = 0x%x\\n\", *BufferLength, localBuffer); #endif if (localBuffer && GetData) { RtlCopyMemory(Buffer, localBuffer, *BufferLength); } } } UsbDriverExFreePool(buffer); } else { ntStatus = STATUS_INSUFFICIENT_RESOURCES; } #if DBG DebugPrint(\"exit UsbDriverControlVendorCommand() 0x%x\\n\", ntStatus); #endif return ntStatus; } |
|
|