diff --git a/src/windows/wdfserial/QCPNP.c b/src/windows/wdfserial/QCPNP.c index c8ed894..99fa4a4 100644 --- a/src/windows/wdfserial/QCPNP.c +++ b/src/windows/wdfserial/QCPNP.c @@ -3112,6 +3112,18 @@ NTSTATUS QCPNP_ResetUsbPipe ) { NTSTATUS status = STATUS_SUCCESS; + + if (usbPipe == NULL) + { + QCSER_DbgPrint + ( + QCSER_DBG_MASK_CIRP, + QCSER_DBG_LEVEL_ERROR, + ("<%ws> QCPNP_ResetUsbPipe called with NULL pipe, skipping\n", pDevContext->PortName) + ); + return STATUS_SUCCESS; + } + WDFIOTARGET ioTarget = WdfUsbTargetPipeGetIoTarget(usbPipe); WDF_REQUEST_SEND_OPTIONS syncReqOptions; WDF_REQUEST_SEND_OPTIONS_INIT(&syncReqOptions, 0); diff --git a/src/windows/wdfserial/QCRD.c b/src/windows/wdfserial/QCRD.c index 6f6699c..979b271 100644 --- a/src/windows/wdfserial/QCRD.c +++ b/src/windows/wdfserial/QCRD.c @@ -132,8 +132,8 @@ void QCRD_ReadRequestHandlerThread PREQUEST_CONTEXT pReqContext; PDEVICE_CONTEXT pDevContext = pContext; ULONG devErrCnt = 0; - WDFIOTARGET ioTarget = WdfUsbTargetPipeGetIoTarget(pDevContext->BulkIN); - PKWAIT_BLOCK pWaitBlock = ExAllocatePoolUninitialized(NonPagedPoolNx, (READ_THREAD_RESUME_EVENT_COUNT) * sizeof(KWAIT_BLOCK), '3gaT'); + WDFIOTARGET ioTarget = NULL; + PKWAIT_BLOCK pWaitBlock = NULL; BOOLEAN bRunning = TRUE; BOOLEAN bDeviceOpened = FALSE; BOOLEAN bDeviceAwaken = FALSE; @@ -144,6 +144,22 @@ void QCRD_ReadRequestHandlerThread WDF_REQUEST_PARAMETERS requestParam; // for application requests PRING_BUFFER rxBuffer = &pDevContext->ReadRingBuffer; + if (pDevContext->BulkIN == NULL) + { + QCSER_DbgPrint + ( + QCSER_DBG_MASK_READ, + QCSER_DBG_LEVEL_ERROR, + ("<%ws> RIRP: QCRD_ReadRequestHandlerThread ERROR no USB pipe for read, exiting\n", pDevContext->PortName) + ); + KeSetEvent(&pDevContext->ReadThreadStartedEvent, IO_NO_INCREMENT, FALSE); + PsTerminateSystemThread(STATUS_SUCCESS); + return; + } + + ioTarget = WdfUsbTargetPipeGetIoTarget(pDevContext->BulkIN); + pWaitBlock = ExAllocatePoolUninitialized(NonPagedPoolNx, (READ_THREAD_RESUME_EVENT_COUNT) * sizeof(KWAIT_BLOCK), '3gaT'); + if (pWaitBlock == NULL) { WdfDeviceSetFailed(pDevContext->Device, WdfDeviceFailedNoRestart); diff --git a/src/windows/wdfserial/QCWT.c b/src/windows/wdfserial/QCWT.c index c60ee18..0b707d6 100644 --- a/src/windows/wdfserial/QCWT.c +++ b/src/windows/wdfserial/QCWT.c @@ -403,7 +403,7 @@ void QCWT_WriteRequestHandlerThread WDF_REQUEST_PARAMETERS_INIT(&writeParam); WdfRequestGetParameters(request, &writeParam); QCWT_EvtIoWrite(pDevContext->WriteQueue, request, writeParam.Parameters.Write.Length); - if (gVendorConfig.EnableZeroLengthPacket && (writeParam.Parameters.Write.Length % pDevContext->wMaxPktSize == 0)) + if (gVendorConfig.EnableZeroLengthPacket && (pDevContext->wMaxPktSize != 0) && (writeParam.Parameters.Write.Length % pDevContext->wMaxPktSize == 0)) { #ifdef QCUSB_MUX_PROTOCOL if (pDevContext->DeviceFunction != QCUSB_DEV_FUNC_LPC)