阅读:1547回复:0
USB的C语言驱动程序*ReadDispatch/*WriteDispatch/*DeviceIoControlDispatch如何编写
我用DS3.1生成了USB驱动程序,VID、PID都正确,USB资源申请了两个管道PIPE01PIPE00/bulk/1/IN/64/4096;PIPE01/bulk/1/OUT/64/4096,允许多个句柄打开设备。IRP_MJ_READI、RP_MJ_WRITE和自定义的IOCTL_Control都为Buffered方式。编译,插上USB,硬件驱动正常,应用程序也能找到驱动程序,应用程序执行DeviceIoControl,softice跟踪发现,驱动程序的*DeviceIoControlDispatch得到执行。问题是如何用C语言在*ReadDispatch/*WriteDispatch/*DeviceIoControlDispatch编写对这两个管道的操作,如管道0为IN,如何用管道0读取数据?管道1为OUT,如何用管道1写数据?
应用程序需要两个句柄来对应两个管道吗? IORW.C代码见下: // iorw.c // // Generated by C DriverWizard 3.1.0 (Build 1722) // Requires DDK Only // File created on 6/6/2008 // #include "pch.h" #include "..\intrface.h" #ifdef TEMP_WMI_TRACE #include "iorw.tmh" #endif /////////////////////////////////////////////////////////////////////////////////////////////////// // TempReadDispatch // Handled incoming read requests // // Arguments: // IN DeviceObject // Device object for our device // // IN Irp // The read IRP to handle // // Return Value: // NT status code // NTSTATUS TempReadDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PTEMP_DEVICE_EXTENSION deviceExtension; NTSTATUS status; PIO_STACK_LOCATION irpStack; PVOID readBuffer; ULONG readLength; //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp); deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; status = TempCheckIoLock(&deviceExtension->IoLock, Irp); if (!NT_SUCCESS(status) || (status == STATUS_PENDING)) { //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } // Get our IRP stack location irpStack = IoGetCurrentIrpStackLocation(Irp); // Get the read buffer length readLength = irpStack->Parameters.Read.Length; if (readLength == 0) { // just complete 0 length request status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); TempDecrementIoCount(&deviceExtension->IoLock); //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p, STATUS %x", Irp, status); return status; } readBuffer = Irp->AssociatedIrp.SystemBuffer; //************************************************************************************************* //此处应做出处理。我做的PCI是在这里处理 //************************************************************************************************* status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT); TempDecrementIoCount(&deviceExtension->IoLock); //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } /////////////////////////////////////////////////////////////////////////////////////////////////// // TempWriteDispatch // Handled incoming write requests // // Arguments: // IN DeviceObject // Device object for our device // // IN Irp // The write IRP to handle // // Return Value: // NT status code // NTSTATUS TempWriteDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PTEMP_DEVICE_EXTENSION deviceExtension; NTSTATUS status; PIO_STACK_LOCATION irpStack; PVOID writeBuffer; ULONG writeLength; //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp); deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; status = TempCheckIoLock(&deviceExtension->IoLock, Irp); if (!NT_SUCCESS(status) || (status == STATUS_PENDING)) { //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } // Get our IRP stack location irpStack = IoGetCurrentIrpStackLocation(Irp); // Get the write buffer length writeLength = irpStack->Parameters.Write.Length; if (writeLength == 0) { // just complete 0 length request status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); TempDecrementIoCount(&deviceExtension->IoLock); //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p, STATUS %x", Irp, status); return status; } writeBuffer = Irp->AssociatedIrp.SystemBuffer; //************************************************************************************************* //此处应做出处理,我做的PCI是在这里处理 //************************************************************************************************* status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT); TempDecrementIoCount(&deviceExtension->IoLock); //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } /////////////////////////////////////////////////////////////////////////////////////////////////// // TempDeviceIoControlDispatch // Handled incoming IOCTL requests // // Arguments: // IN DeviceObject // Device object for our device // // IN Irp // The IOCTL IRP to handle // // Return Value: // NT status code // NTSTATUS TempDeviceIoControlDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PIO_STACK_LOCATION irpStack; NTSTATUS status; PTEMP_DEVICE_EXTENSION deviceExtension; PVOID inputBuffer; ULONG inputLength; PVOID outputBuffer; ULONG outputLength; //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp); deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; // Get our IRP stack location irpStack = IoGetCurrentIrpStackLocation(Irp); // Get the buffer lengths inputLength = irpStack->Parameters.DeviceIoControl.InputBufferLength; outputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength; switch (irpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_Control: //TempDebugPrint(DBG_IO, DBG_INFO, __FUNCTION__": IOCTL_Control"); status = TempCheckIoLock(&deviceExtension->IoLock, Irp); if (!NT_SUCCESS(status) || (status == STATUS_PENDING)) { //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } // buffered ioctl inputBuffer = Irp->AssociatedIrp.SystemBuffer; outputBuffer = Irp->AssociatedIrp.SystemBuffer; //************************************************************************************************* //此处应做出处理,我做的PCI是在这里处理 //************************************************************************************************* status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT); TempDecrementIoCount(&deviceExtension->IoLock); break; default: status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT); break; } //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; } |
|