none
WdfRequestMarkCancelableEx crashes my system RRS feed

  • Question

  • To mark my IRPs cancelable , I have added WdfRequestMarkCancelableEx  funtion in my IOCTL handler and I am unmarking cancelable when the activity is completed on the hardware . But the system crashes when I invoke WdfRequestMarkCancelableEx with BugCheck 139.

    EVT_WDF_REQUEST_CANCEL EvtWdfRequestCancel;

    ----------------------------------------------------------------------------

    void EvtWdfRequestCancel(WDFREQUEST Request )
    {
    NTSTATUS status = WdfRequestUnmarkCancelable(Request);
    if (!NT_SUCCESS(status)) {
    TraceError(DBG_IO, "WdfRequestUnmarkCancelable failed: %!STATUS!", status);
    goto ErrExit;
    }
    WdfRequestComplete(Request, STATUS_CANCELLED);
    }

    -----------------------------------------------------------------------------

    status = WdfRequestMarkCancelableEx(Request, EvtWdfRequestCancel);  <<<< this causes bsod 

    Thanks 

    rj

    Thursday, September 12, 2019 5:42 PM

All replies

  • Post the output of !analyze -v. Also, why not park the request in a manual queue and let the queue handle cancellation?

    d -- This posting is provided "AS IS" with no warranties, and confers no rights.

    Thursday, September 12, 2019 7:39 PM
  • 7: kd> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Bugcheck Analysis                                    *
    *                                                                             *
    *******************************************************************************

    KERNEL_SECURITY_CHECK_FAILURE (139)
    A kernel component has corrupted a critical data structure.  The corruption
    could potentially allow a malicious user to gain control of this machine.
    Arguments:
    Arg1: 0000000000000003, A LIST_ENTRY has been corrupted (i.e. double remove).
    Arg2: ffff85839dbd5170, Address of the trap frame for the exception that caused the bugcheck
    Arg3: ffff85839dbd50c8, Address of the exception record for the exception that caused the bugcheck
    Arg4: 0000000000000000, Reserved

    Debugging Details:
    ------------------


    KEY_VALUES_STRING: 1


    TIMELINE_ANALYSIS: 1


    DUMP_CLASS: 1

    DUMP_QUALIFIER: 400

    BUILD_VERSION_STRING:  18362.1.amd64fre.19h1_release.190318-1202

    SYSTEM_MANUFACTURER:  Gigabyte Technology Co., Ltd.

    SYSTEM_PRODUCT_NAME:  Z270-Gaming 3

    SYSTEM_SKU:  Default string

    SYSTEM_VERSION:  Default string

    BIOS_VENDOR:  American Megatrends Inc.

    BIOS_VERSION:  F3

    BIOS_DATE:  02/10/2017

    BASEBOARD_MANUFACTURER:  Gigabyte Technology Co., Ltd.

    BASEBOARD_PRODUCT:  Z270-Gaming 3

    BASEBOARD_VERSION:  Default string

    DUMP_TYPE:  2

    BUGCHECK_P1: 3

    BUGCHECK_P2: ffff85839dbd5170

    BUGCHECK_P3: ffff85839dbd50c8

    BUGCHECK_P4: 0

    TRAP_FRAME:  ffff85839dbd5170 -- (.trap 0xffff85839dbd5170)
    NOTE: The trap frame does not contain all registers.
    Some register values may be zeroed or incorrect.
    rax=ffffb8036b1c1e88 rbx=0000000000000000 rcx=0000000000000003
    rdx=0000000000000002 rsi=0000000000000000 rdi=0000000000000000
    rip=fffff8026a89cd15 rsp=ffff85839dbd5300 rbp=ffffb8036a2e2de0
     r8=fffff80264307750  r9=ffffb8036a254df0 r10=ffffb8036a099538
    r11=ffff85839dbd5418 r12=0000000000000000 r13=0000000000000000
    r14=0000000000000000 r15=0000000000000000
    iopl=0         nv up ei pl nz ac pe cy
    Wdf01000!RtlFailFast+0x5:
    fffff802`6a89cd15 cd29            int     29h
    Resetting default scope

    EXCEPTION_RECORD:  ffff85839dbd50c8 -- (.exr 0xffff85839dbd50c8)
    ExceptionAddress: fffff8026a89cd15 (Wdf01000!RtlFailFast+0x0000000000000005)
       ExceptionCode: c0000409 (Security check failure or stack buffer overrun)
      ExceptionFlags: 00000001
    NumberParameters: 1
       Parameter[0]: 0000000000000003
    Subcode: 0x3 FAST_FAIL_CORRUPT_LIST_ENTRY

    CPU_COUNT: 8

    CPU_MHZ: 1068

    CPU_VENDOR:  GenuineIntel

    CPU_FAMILY: 6

    CPU_MODEL: 9e

    CPU_STEPPING: 9

    CPU_MICROCODE: 6,9e,9,0 (F,M,S,R)  SIG: B4'00000000 (cache) B4'00000000 (init)

    BLACKBOXBSD: 1 (!blackboxbsd)


    BLACKBOXPNP: 1 (!blackboxpnp)


    CUSTOMER_CRASH_COUNT:  1

    BUGCHECK_STR:  0x139

    PROCESS_NAME:  my-test.exe

    CURRENT_IRQL:  2

    DEFAULT_BUCKET_ID:  CODE_CORRUPTION

    ERROR_CODE: (NTSTATUS) 0xc0000409 - The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.

    EXCEPTION_CODE: (NTSTATUS) 0xc0000409 - The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.

    EXCEPTION_CODE_STR:  c0000409

    EXCEPTION_PARAMETER1:  0000000000000003

    ANALYSIS_SESSION_HOST:  DESKTOP-DTNBC9V

    ANALYSIS_SESSION_TIME:  09-13-2019 11:14:37.0298

    ANALYSIS_VERSION: 10.0.17134.1 amd64fre

    LAST_CONTROL_TRANSFER:  from fffff80266fd2ee9 to fffff80266fc10a0

    STACK_TEXT:  
    ffff8583`9dbd4e48 fffff802`66fd2ee9 : 00000000`00000139 00000000`00000003 ffff8583`9dbd5170 ffff8583`9dbd50c8 : nt!KeBugCheckEx
    ffff8583`9dbd4e50 fffff802`66fd3310 : ffff8583`9dbd5280 ffffb803`6c420d00 ffffb803`6c45bf00 ffff8583`9dbd5040 : nt!KiBugCheckDispatch+0x69
    ffff8583`9dbd4f90 fffff802`66fd16a5 : ffffb803`6c8ca080 ffffb803`6c45bfc0 fffff802`66e00000 ffffb803`6c45bf90 : nt!KiFastFailDispatch+0xd0
    ffff8583`9dbd5170 fffff802`6a89cd15 : 000047fc`95f66b38 ffffb803`6a0994c0 ffffb803`0006a095 00000000`000001c0 : nt!KiRaiseSecurityCheckFailure+0x325
    ffff8583`9dbd5300 fffff802`6431bc96 : ffffb803`6a0994c0 fffff802`64306402 00000000`00220005 ffffb803`6a0994c0 : Wdf01000!imp_WdfRequestMarkCancelableEx+0x163c5 [minkernel\wdf\framework\shared\core\fxrequestapi.cpp @ 3529] 
    ffff8583`9dbd5380 fffff802`6430cabf : 000047fc`95f66b38 fffff802`64307750 ffffb803`6c162d30 fffff802`6a8befd2 : my_driver!WdfRequestMarkCancelableEx+0x46 [c:\program files (x86)\windows kits\10\include\wdf\kmdf\1.19\wdfrequest.h @ 776] 
    ffff8583`9dbd53c0 fffff802`6a879455 : 000047fc`94a4a3e8 000047fc`95f66b38 00000000`00000000 00000000`00000008 : my_driver!myEvtIoDeviceControl+0x4f [c:\users\rj\source\repos\my_driver\sys\my_driver-control.c @ 525] 
    ffff8583`9dbd5420 fffff802`6a878e07 : ffffffff`ffffff00 ffff8583`9dbd55c0 ffffb803`6b397000 00000000`000000c0 : Wdf01000!FxIoQueue::DispatchRequestToDriver+0x225 [minkernel\wdf\framework\shared\irphandlers\io\fxioqueue.cpp @ 3325] 
    ffff8583`9dbd54c0 fffff802`6a876fc6 : ffffb803`6b5b5c10 ffffb803`6895c200 00000000`00000000 fffff802`00000000 : Wdf01000!FxIoQueue::DispatchEvents+0x657 [minkernel\wdf\framework\shared\irphandlers\io\fxioqueue.cpp @ 3125] 
    ffff8583`9dbd55a0 fffff802`6a876a7d : ffffb803`6895c260 ffffb803`6a254d00 ffffb803`6a0994c0 00000000`00000001 : Wdf01000!FxPkgIo::DispatchStep1+0x536 [minkernel\wdf\framework\shared\irphandlers\io\fxpkgio.cpp @ 324] 
    ffff8583`9dbd5660 fffff802`6a87abd3 : ffffb803`6a254df0 ffffa080`039609d8 ffffb803`6c8a3901 fffff802`673eff85 : Wdf01000!FxPkgIo::Dispatch+0x5d [minkernel\wdf\framework\shared\irphandlers\io\fxpkgio.cpp @ 119] 
    ffff8583`9dbd56c0 fffff802`66e31f39 : 00000000`00000002 00000000`00000000 00000000`00000000 ffffb803`6d2b82b0 : Wdf01000!FxDevice::DispatchWithLock+0x113 [minkernel\wdf\framework\shared\core\fxdevice.cpp @ 1430] 
    ffff8583`9dbd5720 fffff802`673e8345 : ffffb803`6a254df0 00000000`00000000 00000000`00000000 ffffb803`6d2b82b0 : nt!IofCallDriver+0x59
    ffff8583`9dbd5760 fffff802`673e8150 : 00000000`00000001 ffff8583`9dbd5a80 ffffb803`6a254df0 ffff8583`9dbd5a80 : nt!IopSynchronousServiceTail+0x1a5
    ffff8583`9dbd5800 fffff802`673e7526 : 000000fd`562fd180 00000000`00000120 00000000`00000000 000000fd`562fd258 : nt!IopXxxControlFile+0xc10
    ffff8583`9dbd5920 fffff802`66fd2915 : ffffb803`6c8ca080 000000fd`562fd168 ffff8583`9dbd59a8 00000000`00000000 : nt!NtDeviceIoControlFile+0x56
    ffff8583`9dbd5990 00007ff9`343dc1b4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x25
    000000fd`562fd138 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007ff9`343dc1b4


    CHKIMG_EXTENSION: !chkimg -lo 50 -d !Wdf01000
        fffff8026a873229-fffff8026a87322a  2 bytes - Wdf01000!imp_WdfRegistryClose+59
    [ 48 ff:4c 8b ]
        fffff8026a876b33-fffff8026a876b34  2 bytes - Wdf01000!FxPkgIo::DispatchStep1+a3 (+0x390a)
    [ 48 ff:4c 8b ]
        fffff8026a876b3a-fffff8026a876b3e  5 bytes - Wdf01000!FxPkgIo::DispatchStep1+aa (+0x07)
    [ 0f 1f 44 00 00:e8 61 7b 5c fc ]
        fffff8026a876fd2-fffff8026a876fd3  2 bytes - Wdf01000!FxPkgIo::DispatchStep1+542 (+0x498)
    [ 48 ff:4c 8b ]
        fffff8026a876fd9-fffff8026a876fdd  5 bytes - Wdf01000!FxPkgIo::DispatchStep1+549 (+0x07)
    [ 0f 1f 44 00 00:e8 c2 1f 5c fc ]
        fffff8026a877248-fffff8026a877249  2 bytes - Wdf01000!FxRequestFromLookaside::SelfDestruct+d8 (+0x26f)
    [ 48 ff:4c 8b ]
        fffff8026a87724f-fffff8026a877253  5 bytes - Wdf01000!FxRequestFromLookaside::SelfDestruct+df (+0x07)
    [ 0f 1f 44 00 00:e8 0c a5 68 fc ]
        fffff8026a877260-fffff8026a877261  2 bytes - Wdf01000!FxRequestFromLookaside::SelfDestruct+f0 (+0x11)
    [ 48 ff:4c 8b ]
        fffff8026a877267-fffff8026a87726b  5 bytes - Wdf01000!FxRequestFromLookaside::SelfDestruct+f7 (+0x07)
    [ 0f 1f 44 00 00:e8 84 1d 75 fc ]
        fffff8026a877f12-fffff8026a877f13  2 bytes - Wdf01000!FxObject::DeleteObject+12 (+0xcab)
    [ 48 ff:4c 8b ]
        fffff8026a877f19-fffff8026a877f1d  5 bytes - Wdf01000!FxObject::DeleteObject+19 (+0x07)
    [ 0f 1f 44 00 00:e8 12 a5 62 fc ]
        fffff8026a877f61-fffff8026a877f62  2 bytes - Wdf01000!FxObject::DeleteObject+61 (+0x48)
    [ 48 ff:4c 8b ]
        fffff8026a877f68-fffff8026a877f6c  5 bytes - Wdf01000!FxObject::DeleteObject+68 (+0x07)
    [ 0f 1f 44 00 00:e8 c3 a4 62 fc ]
        fffff8026a877fb1-fffff8026a877fb2  2 bytes - Wdf01000!FxObject::DeleteObject+b1 (+0x49)
    [ 48 ff:4c 8b ]
        fffff8026a877fb8-fffff8026a877fbc  5 bytes - Wdf01000!FxObject::DeleteObject+b8 (+0x07)
    [ 0f 1f 44 00 00:e8 03 a2 62 fc ]
        fffff8026a878e16-fffff8026a878e17  2 bytes - Wdf01000!FxIoQueue::DispatchEvents+666 (+0xe5e)
    [ 48 ff:4c 8b ]
        fffff8026a878e1d-fffff8026a878e21  5 bytes - Wdf01000!FxIoQueue::DispatchEvents+66d (+0x07)
    [ 0f 1f 44 00 00:e8 0e 96 62 fc ]
        fffff8026a87ac33-fffff8026a87ac34  2 bytes - Wdf01000!FxDevice::DispatchWithLock+173 (+0x1e16)
    [ 48 ff:4c 8b ]
        fffff8026a87ac3a-fffff8026a87ac3e  5 bytes - Wdf01000!FxDevice::DispatchWithLock+17a (+0x07)
    [ 0f 1f 44 00 00:e8 d1 70 5e fc ]
        fffff8026a8869fc-fffff8026a8869fd  2 bytes - Wdf01000!imp_WdfRequestMarkCancelableEx+ac (+0xbdc2)
    [ 48 ff:4c 8b ]
        fffff8026a886a03-fffff8026a886a07  5 bytes - Wdf01000!imp_WdfRequestMarkCancelableEx+b3 (+0x07)
    [ 0f 1f 44 00 00:e8 28 ba 61 fc ]
        fffff8026a888298-fffff8026a888299  2 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+28 (+0x1895)
    [ 48 ff:4c 8b ]
        fffff8026a88829f-fffff8026a8882a3  5 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+2f (+0x07)
    [ 0f 1f 44 00 00:e8 9c ce 6e fc ]
        fffff8026a8882a9-fffff8026a8882aa  2 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+39 (+0x0a)
    [ 48 ff:4c 8b ]
        fffff8026a8882b0-fffff8026a8882b4  5 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+40 (+0x07)
    [ 0f 1f 44 00 00:e8 9b f3 5b fc ]
        fffff8026a8882d0-fffff8026a8882d1  2 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+60 (+0x20)
    [ 48 ff:4c 8b ]
        fffff8026a8882d7-fffff8026a8882db  5 bytes - Wdf01000!FxPkgPdo::PowerReleasePendingDeviceIrp+67 (+0x07)
    [ 0f 1f 44 00 00:e8 54 e3 68 fc ]
        fffff8026a889950-fffff8026a889951  2 bytes - Wdf01000!MxTimer::Stop+10 (+0x1679)
    [ 48 ff:4c 8b ]
        fffff8026a889957-fffff8026a88995b  5 bytes - Wdf01000!MxTimer::Stop+17 (+0x07)
    [ 0f 1f 44 00 00:e8 e4 14 66 fc ]
        fffff8026a889965-fffff8026a889966  2 bytes - Wdf01000!MxTimer::Stop+25 (+0x0e)
    [ 48 ff:4c 8b ]
        fffff8026a88996c-fffff8026a889970  5 bytes - Wdf01000!MxTimer::Stop+2c (+0x07)
    [ 0f 1f 44 00 00:e8 df 7c 5d fc ]
        fffff8026a889ac2-fffff8026a889ac3  2 bytes - Wdf01000!FxCallbackMutexLock::Unlock+32 (+0x156)
    [ 48 ff:4c 8b ]
        fffff8026a889ac9-fffff8026a889acf  7 bytes - Wdf01000!FxCallbackMutexLock::Unlock+39 (+0x07)
    [ 0f 1f 44 00 00 48 ff:e8 62 74 61 fc 4c 8b ]
        fffff8026a889ad5-fffff8026a889ad9  5 bytes - Wdf01000!FxCallbackMutexLock::Unlock+45 (+0x0c)
    [ 0f 1f 44 00 00:e8 c6 f4 5a fc ]
        fffff8026a889b80-fffff8026a889b81  2 bytes - Wdf01000!MxTimer::Start+20 (+0xab)
    [ 48 ff:4c 8b ]
        fffff8026a889b87-fffff8026a889b8b  5 bytes - Wdf01000!MxTimer::Start+27 (+0x07)
    [ 0f 1f 44 00 00:e8 a4 9f 5d fc ]
        fffff8026a889ec9-fffff8026a889eca  2 bytes - Wdf01000!FxCallbackMutexLock::Lock+29 (+0x342)
    [ 48 ff:4c 8b ]
        fffff8026a889ed0-fffff8026a889ed4  5 bytes - Wdf01000!FxCallbackMutexLock::Lock+30 (+0x07)
    [ 0f 1f 44 00 00:e8 cb 47 5b fc ]
        fffff8026a889ed9-fffff8026a889eda  2 bytes - Wdf01000!FxCallbackMutexLock::Lock+39 (+0x09)
    [ 48 ff:4c 8b ]
        fffff8026a889ee0-fffff8026a889ee4  5 bytes - Wdf01000!FxCallbackMutexLock::Lock+40 (+0x07)
    [ 0f 1f 44 00 00:e8 8b 70 61 fc ]
        fffff8026a88a0ed-fffff8026a88a0ee  2 bytes - Wdf01000!FxSpinLockTransactionedList::AcquireLock+d (+0x20d)
    [ 48 ff:4c 8b ]
        fffff8026a88a0f4-fffff8026a88a0f8  5 bytes - Wdf01000!FxSpinLockTransactionedList::AcquireLock+14 (+0x07)
    [ 0f 1f 44 00 00:e8 37 83 61 fc ]
        fffff8026a88a16b-fffff8026a88a16c  2 bytes - Wdf01000!FxSpinLockTransactionedList::ReleaseLock+b (+0x77)
    [ 48 ff:4c 8b ]
        fffff8026a88a172-fffff8026a88a176  5 bytes - Wdf01000!FxSpinLockTransactionedList::ReleaseLock+12 (+0x07)
    [ 0f 1f 44 00 00:e8 49 80 61 fc ]
        fffff8026a88a19a-fffff8026a88a19b  2 bytes - Wdf01000!FxObject::MarkPassiveCallbacks+16 (+0x28)
    [ 48 ff:4c 8b ]
        fffff8026a88a1a1-fffff8026a88a1a5  5 bytes - Wdf01000!FxObject::MarkPassiveCallbacks+1d (+0x07)
    [ 0f 1f 44 00 00:e8 8a 82 61 fc ]
        fffff8026a88a1b1-fffff8026a88a1b2  2 bytes - Wdf01000!FxObject::MarkPassiveCallbacks+2d (+0x10)
    [ 48 ff:4c 8b ]
        fffff8026a88a1b8-fffff8026a88a1bc  5 bytes - Wdf01000!FxObject::MarkPassiveCallbacks+34 (+0x07)
    [ 0f 1f 44 00 00:e8 03 80 61 fc ]
        fffff8026a88a298-fffff8026a88a299  2 bytes - Wdf01000!FxPowerIdleMachine::TimingOut+28 (+0xe0)
    [ 48 ff:4c 8b ]
        fffff8026a88a29f-fffff8026a88a2a3  5 bytes - Wdf01000!FxPowerIdleMachine::TimingOut+2f (+0x07)
    [ 0f 1f 44 00 00:e8 2c 3a 61 fc ]
    WARNING: !chkimg output was truncated to 50 lines. Invoke !chkimg without '-lo [num_lines]' to view  entire output.
    406 errors : !Wdf01000 (fffff8026a873229-fffff8026a905a73)

    MODULE_NAME: memory_corruption

    IMAGE_NAME:  memory_corruption

    FOLLOWUP_NAME:  memory_corruption

    DEBUG_FLR_IMAGE_TIMESTAMP:  0

    MEMORY_CORRUPTOR:  LARGE

    STACK_COMMAND:  .thread ; .cxr ; kb

    FAILURE_BUCKET_ID:  MEMORY_CORRUPTION_LARGE

    BUCKET_ID:  MEMORY_CORRUPTION_LARGE

    PRIMARY_PROBLEM_CLASS:  MEMORY_CORRUPTION_LARGE

    TARGET_TIME:  2019-09-12T10:15:38.000Z

    OSBUILD:  18362

    OSSERVICEPACK:  356

    SERVICEPACK_NUMBER: 0

    OS_REVISION: 0

    SUITE_MASK:  272

    PRODUCT_TYPE:  1

    OSPLATFORM_TYPE:  x64

    OSNAME:  Windows 10

    OSEDITION:  Windows 10 WinNt TerminalServer SingleUserTS

    OS_LOCALE:  

    USER_LCID:  0

    OSBUILD_TIMESTAMP:  unknown_date

    BUILDDATESTAMP_STR:  190318-1202

    BUILDLAB_STR:  19h1_release

    BUILDOSVER_STR:  10.0.18362.1.amd64fre.19h1_release.190318-1202

    ANALYSIS_SESSION_ELAPSED_TIME:  ab21

    ANALYSIS_SOURCE:  KM

    FAILURE_ID_HASH_STRING:  km:memory_corruption_large

    FAILURE_ID_HASH:  {e29154ac-69a4-0eb8-172a-a860f73c0a3c}

    Followup:     memory_corruption
    Friday, September 13, 2019 5:50 AM
  • I have an user app , that initiates I/O to my device.

    One requirement is to close the application whenever needed.

    But as of now , if some I/O is in progress , the application does not close immediately but closes after the I/O is complete.

    I read in some document that if the requests are not marked cancellable, the I/O manager does not cancel the requests till completion and the application cannot terminate till then .

    So I tried to mark the request cancellable in a function that receives the request from the I/O queue , once it is dispatched from the device I/O queue by the framework and hence the BSOD.


    Friday, September 13, 2019 6:41 AM
  • I have my requests in a device queue created in the driver (WdfIoQueueCreate with config WdfIoQueueDispatchParallel) 

    whenever app sends an IOCTL , the framework dispatches the request to the driver and my  event callback in driver is invoked .

    I have a question - when the request is dispatched to the driver , is the request "still in queue and owned by framework " or is removed from the queue.

    The request does not complete immediately. so before completion and after dispatch , is the request owned by driver ? and during this time if my user application crashes/ exits , should the driver cancel the request or the framework will cancel ?

    If the user closes the application , actually application is not closing till the driver completes all requests .

    Is tehre any way to clean up / cancel the IO when the applciation want to close ?

    Assuming the driver has to mark the request cancellable so that the framework can cancel the request when the application crashes , I tried to mark the request cancellable . But the system crashes when I invoke  WdfRequestMarkCancelableEx.

    Please comment.

    Friday, September 13, 2019 12:34 PM
  • Once the request is dispatched to the driver, it is no longer in a queue.  It is owned by the driver.

    > The request does not complete immediately. ... should the driver cancel the
    > request or the framework will cancel?

    If the request is just stored in a driver variable, then it's up to the driver to check for and handle the cancellation request.  That's why the smart thing is to store the request in a manual queue.  When you do that, the framework will handle the cancellation for you.

    Queues are lightweight.  There's nothing wrong with creating several of them for specific purposes like this.

    What are you doing with the request before you mark it?  Have you passed it to another driver?


    Tim Roberts | Driver MVP Emeritus | Providenza &amp; Boekelheide, Inc.

    Saturday, September 14, 2019 6:43 AM