patch.txt
来自「TUSB3410 win9x和win xp 驱动源代码,包含开发测试工具」· 文本 代码 · 共 477 行
TXT
477 行
--- /dos/c/98ddk/src/usb/bulkusb/sys/blk82930.h Mon Jun 15 02:49:24 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/blk82930.h Sat May 25 18:22:08 2002
@@ -34,9 +34,12 @@
#include "BusbDbg.h"
// the size of the transfer buffer on your test board or device
-#define BULKUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE (64 *1024 )
+#define BULKUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE ( 32 ) //roms: max packet size modified
+#define BULKUSB_MAX_TRANSFER_SIZE 32 //roms: max packet size modified
-#define BULKUSB_MAX_TRANSFER_SIZE 256
+//roms: install a timeout handler for read/write operations
+#undef DEADMAN_TIMER //#define DEADMAN_TIMER // comment it for disabling timeout routine
+#define DEADMAN_TIMEOUT 1500 // timeout in ms (default value)
// used to track driver-generated io irps for staged read/write processing
typedef struct _BULKUSB_RW_CONTEXT {
@@ -149,6 +152,11 @@
// default maximum transfer per staged irp size
ULONG MaximumTransferSize;
+
+ //roms: timeout for read/write operations
+ LONG TimeoutValue;
+ KDPC TimeoutDpc;
+ KTIMER TimeoutTimer;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
--- /dos/c/98ddk/src/usb/bulkusb/sys/bulkusb.h Wed Jun 3 09:28:06 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/bulkusb.h Sat May 25 15:30:46 2002
@@ -49,6 +49,26 @@
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
+//roms: new IOCTL codes
+#define IOCTL_BULKUSB_ABORT_PIPES CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ BULKUSB_IOCTL_INDEX+3,\
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_CANCEL_PENDING_IO CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ BULKUSB_IOCTL_INDEX+4,\
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_SET_TIMEOUT CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ BULKUSB_IOCTL_INDEX+5,\
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_GET_TIMEOUT CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ BULKUSB_IOCTL_INDEX+6,\
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
#endif // end, #ifndef BULKUSBH_INC
--- /dos/c/98ddk/src/usb/bulkusb/sys/busbdbg.h Mon Jun 15 02:49:42 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/busbdbg.h Sat May 25 14:30:30 2002
@@ -57,8 +57,9 @@
// registry path used for parameters global to all instances of the driver
+//roms: modified for TIGLUSB
#define BULKUSB_REGISTRY_PARAMETERS_PATH \
- L"\\REGISTRY\\Machine\\System\\CurrentControlSet\\SERVICES\\BULKUSB\\Parameters"
+ L"\\REGISTRY\\Machine\\System\\CurrentControlSet\\SERVICES\\TIGLUSB\\Parameters"
--- /dos/c/98ddk/src/usb/bulkusb/sys/bulkpnp.c Sat Sep 5 01:07:08 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/bulkpnp.c Sat May 25 14:30:22 2002
@@ -549,7 +549,7 @@
// ( CurrentControlSet\Services\BulkUsb\Parameters )
// Setting to 0 or 1 in registry disables auto power-down
BulkUsb_GetRegistryDword( BULKUSB_REGISTRY_PARAMETERS_PATH,
- L"PowerDownLevel",
+ L"PowerDownLevel", // REG_DWORD ValueName
&(deviceExtension->PowerDownLevel) );
--- /dos/c/98ddk/src/usb/bulkusb/sys/bulkusb.c Tue Jul 14 06:31:20 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/bulkusb.c Sat May 25 18:34:46 2002
@@ -289,7 +289,6 @@
}
-
NTSTATUS
BulkUsb_CreateDeviceObject(
IN PDRIVER_OBJECT DriverObject,
@@ -366,6 +365,11 @@
//default maximum transfer size per staged io request
deviceExtension->MaximumTransferSize = BULKUSB_MAX_TRANSFER_SIZE ;
+ //roms: default timeout value (1.5s)
+#ifdef DEADMAN_TIMER
+ deviceExtension->TimeoutValue = DEADMAN_TIMEOUT; // in ms
+#endif
+
#if DBG
// may be overridden in registry
BulkUsb_GetRegistryDword( BULKUSB_REGISTRY_PARAMETERS_PATH,
@@ -403,7 +407,6 @@
return ntStatus;
}
-
NTSTATUS
BulkUsb_CallUSBD(
IN PDEVICE_OBJECT DeviceObject,
@@ -555,7 +558,10 @@
// information or the data is truncated without error.
// Therefore the 'siz' set below is just a 'good guess', and we may have to retry
- siz = sizeof(USB_CONFIGURATION_DESCRIPTOR) + 512;
+ //roms: force driver to load the entire descriptor (32 bytes) rather than the
+ //first part (9 bytes)
+ //siz = sizeof(USB_CONFIGURATION_DESCRIPTOR) + 512;
+ siz = sizeof(USB_CONFIGURATION_DESCRIPTOR);
// We will break out of this 'retry loop' when UsbBuildGetDescriptorRequest()
// has a big enough deviceExtension->UsbConfigurationDescriptor buffer not to truncate
--- /dos/c/98ddk/src/usb/bulkusb/sys/ioctlblk.c Mon Jun 15 02:52:58 1998
+++ /dos/c/98ddk/src/usb/tiglusb/sys/ioctlblk.c Sat May 25 18:00:00 2002
@@ -90,7 +90,6 @@
//
deviceExtension = DeviceObject->DeviceExtension;
-
// Can't accept a new io request if:
// 1) device is removed,
@@ -98,6 +97,7 @@
// 3) is stopped,
// 4) has a remove request pending,
// 5) has a stop device pending
+
if ( !BulkUsb_CanAcceptIoRequests( DeviceObject ) ) {
ntStatus = STATUS_DELETE_PENDING;
Irp->IoStatus.Status = ntStatus;
@@ -128,29 +128,43 @@
switch (ioControlCode) {
case IOCTL_BULKUSB_RESET_PIPE:
+
+ //
+ // This api tries to reset IN and OUT pipes
+ //
+
+ //
+ // inputs - none
+ // outputs - none
+ //
+
{
- PUSBD_PIPE_INFORMATION pipe;
+ //PUSBD_PIPE_INFORMATION pipe;
+ PUSBD_PIPE_INFORMATION pipeIn, pipeOut;
PFILE_OBJECT fileObject;
-
- // get our context and see if it is a pipe
+
+ // get our context and see if it is a pipe
fileObject = irpStack->FileObject;
- pipe = (PUSBD_PIPE_INFORMATION) fileObject->FsContext;
+ //roms: modified (original code does not work)
+ //pipe = (PUSBD_PIPE_INFORMATION) fileObject->FsContext;
+ pipeIn = &deviceExtension->UsbInterface->Pipes[0];
+ pipeOut = &deviceExtension->UsbInterface->Pipes[1];
- if(pipe == NULL) {
+ if(pipeIn == NULL || pipeOut == NULL) {
// error, this is not a pipe
ntStatus =
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
} else {
- BulkUsb_ResetPipe(DeviceObject, pipe );
+ BulkUsb_ResetPipe(DeviceObject, pipeIn );
+ BulkUsb_ResetPipe(DeviceObject, pipeOut);
ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
}
}
break;
-
- case IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR:
+ case IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR:
//
// This api returns a copy of the configuration descriptor
@@ -189,12 +203,101 @@
break;
+ case IOCTL_BULKUSB_RESET_DEVICE:
+ //
+ // This api reset the device. Dangerous...
+ //
- case IOCTL_BULKUSB_RESET_DEVICE:
+ //
+ // inputs - none
+ // outputs - none
+ //
ntStatus = BulkUsb_ResetDevice( DeviceObject );
break;
+
+ //roms: added some IOCTL codes
+ case IOCTL_BULKUSB_ABORT_PIPES:
+
+ //
+ // This api abort transfer on both pipes
+ //
+
+ //
+ // inputs - none
+ // outputs - none
+ //
+
+ ntStatus = BulkUsb_AbortPipes( DeviceObject );
+ break;
+
+ case IOCTL_BULKUSB_CANCEL_PENDING_IO:
+
+ //
+ // This api cancels any pending I/O
+ //
+
+ //
+ // inputs - none
+ // outputs - none
+ //
+
+ ntStatus = BulkUsb_CancelPendingIo(DeviceObject);
+ break;
+
+ case IOCTL_BULKUSB_SET_TIMEOUT: // set internal timeout (in 0.1s) for I/O operations
+
+ //
+ // This api set the internal timeout value for I/O operations.
+ // The timeout value is given in tenth of seconds (0.1s unit).
+ //
+
+ //
+ // inputs - a LONG value
+ // outputs - none
+ //
+
+ if(inputBufferLength == sizeof(LONG))
+ {
+ PLONG p = (PLONG)ioBuffer;
+
+ if(*p < 10)
+ {
+ ntStatus = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+ }
+ else
+ {
+ deviceExtension->TimeoutValue = 100 * (*p);
+ ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
+ }
+ }
+ else
+ {
+ ntStatus = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+ }
+ break;
+
+ case IOCTL_BULKUSB_GET_TIMEOUT: // get internal timeout (in 0.1s) for I/O operations
+
+ //
+ // This api returns the internal timeout value used for I/O operations.
+ // The timeout value is given in tenth of seconds (0.1s unit).
+ //
+
+ //
+ // inputs - none
+ // outputs - a LONG value
+ //
+
+ {
+ PLONG p = (PLONG) ioBuffer;
+
+ outputBufferLength = sizeof(LONG);
+ *p = deviceExtension->TimeoutValue;
+ ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ }
default:
--- /dos/c/98ddk/src/usb/bulkusb/sys/ocrwblk.c Sat May 25 18:28:54 2002
+++ /dos/c/98ddk/src/usb/tiglusb/sys/ocrwblk.c Sat May 25 18:38:02 2002
@@ -43,6 +43,62 @@
#include "Blk82930.h"
+//roms: install a Timeout mechanism
+#ifdef DEADMAN_TIMER
+VOID
+TiglUsb_StagedReadWriteTimeoutDPC(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2
+ )
+/*++
+
+Routine Description:
+
+ This routine runs at DISPATCH_LEVEL IRQL.
+
+ This routine cancels any pending I/O irp if the I/O completion
+ routine has not been called before timeout expires.
+
+
+Arguments:
+
+ Dpc - Pointer to the DPC object.
+
+ DeferredContext -
+
+ SystemArgument1 - not used.
+
+ SystemArgument2 - not used.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ PDEVICE_OBJECT DeviceObject;
+#if DBG
+ BOOLEAN status;
+#endif
+
+ BULKUSB_KdPrint( DBGLVL_MEDIUM,("!!! TIMEOUT !!! All Irp cancelled !\n"));
+ DeviceObject = DeferredContext;
+
+
+#if DBG
+ status =
+#endif
+ BulkUsb_CancelPendingIo(DeviceObject);
+
+#if DBG
+ ASSERT(status == TRUE);
+#endif
+}
+
+#endif /* DEADMAN_TIMER */
+
NTSTATUS
BulkUsb_StagedReadWrite(
@@ -94,7 +150,7 @@
ULONG ChunkSize = deviceExtension->MaximumTransferSize;
ULONG arraySize;
PBULKUSB_RW_CONTEXT context = NULL;
-
+ LARGE_INTEGER dueTime; //roms: used for timeout
BULKUSB_KdPrint ( DBGLVL_DEFAULT, ("enter BulkUsb_StagedReadWrite()\n"));
@@ -288,6 +344,18 @@
ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
(( PBULKUSB_RW_CONTEXT) pCon)->Irp);
+#ifdef DEADMAN_TIMER //roms: initialize timer
+ KeInitializeTimer(&deviceExtension->TimeoutTimer);
+ KeInitializeDpc(&deviceExtension->TimeoutDpc,
+ TiglUsb_StagedReadWriteTimeoutDPC,
+ DeviceObject);
+
+ dueTime.QuadPart = -10000 * deviceExtension->TimeoutValue; //DEADMAN_TIMEOUT;
+
+ KeSetTimer(&deviceExtension->TimeoutTimer,
+ dueTime,
+ &deviceExtension->TimeoutDpc);
+#endif /* DEADMAN_TIMER */
} else {
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
@@ -346,9 +414,26 @@
//
BULKUSB_KdPrint ( DBGLVL_HIGH, ("BulkUsb_StagedReadWrite(),marking base IRP 0x%x pending!\n", Irp));
BULKUSB_ASSERT( Irp == deviceExtension->BaseIrp );
- ntStatus = STATUS_PENDING;
- Irp->IoStatus.Status = ntStatus;
- IoMarkIrpPending(Irp);
+
+ if( Irp != deviceExtension->BaseIrp ) // if different -> pb !
+ {
+ BULKUSB_KdPrint ( DBGLVL_MEDIUM, ("Warning !!! Irp asserted !\n"));
+#ifdef DEADMAN_TIMER //roms: clear timer
+ //
+ // remove our timeoutDPC from the queue
+ //
+ KeCancelTimer(&deviceExtension->TimeoutTimer);
+#endif /* DEADMAN_TIMER */
+ //IoCancelIrp(Irp);
+ BulkUsb_CancelPendingIo(DeviceObject);
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ else
+ {
+ ntStatus = STATUS_PENDING;
+ Irp->IoStatus.Status = ntStatus;
+ IoMarkIrpPending(Irp);
+ }
} else {
// It is possible for BulkUsb_AsyncReadWrite_Complete() to have completed the
// original irp before we even get here!
@@ -484,6 +569,13 @@
deviceObject = context->DeviceObject;
deviceExtension = deviceObject->DeviceExtension;
+#ifdef DEADMAN_TIMER //roms: clear timer
+ //
+ // remove our timeoutDPC from the queue
+ //
+ KeCancelTimer(&deviceExtension->TimeoutTimer);
+#endif /* DEADMAN_TIMER */
+
// If the lower driver returned PENDING, mark our stack location as pending also.
if ( Irp->PendingReturned ) {
IoMarkIrpPending(Irp);
@@ -506,7 +598,7 @@
deviceExtension->StagedPendingIrpCount--;
// decrement the driver's overall pending irp count
- BulkUsb_DecrementIoCount(deviceObject);
+ BulkUsb_DecrementIoCount(deviceObject);
//
// IoCallDriver has been called on this Irp;
@@ -585,7 +677,10 @@
--*/
{
- NTSTATUS ntStatus = BulkUsb_StagedReadWrite(DeviceObject,
+ NTSTATUS ntStatus;
+
+ BULKUSB_KdPrint ( DBGLVL_HIGH, ("READ\n"));
+ ntStatus = BulkUsb_StagedReadWrite(DeviceObject,
Irp,
TRUE); // false to write, true to read
@@ -618,7 +713,10 @@
--*/
{
- NTSTATUS ntStatus = BulkUsb_StagedReadWrite(DeviceObject,
+ NTSTATUS ntStatus;
+
+ BULKUSB_KdPrint ( DBGLVL_HIGH, ("WRITE\n"));
+ ntStatus = BulkUsb_StagedReadWrite(DeviceObject,
Irp,
FALSE); // false to write, true to read
@@ -671,6 +769,8 @@
if (fileObject->FsContext) {
// closing pipe handle
pipeHandle = fileObject->FsContext;
+ // roms: reset USB pipes (for flushing them)
+ BulkUsb_ResetPipe(DeviceObject, pipeHandle );
if ( pipeHandle->PipeFlags ) { // set if opneed
// may have been aborted
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?