<?xml version="1.0" encoding="UTF-8"?>
<?mso-infoPathSolution solutionVersion="1.0.0.188" PIVersion="1.0.0.0" href="file:///PerfSignature.xsn" name="urn:schemas-microsoft-com:office:infopath:PerfSig:" language="en-us" productVersion="12.0.0" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<PerformanceSignature SchemaVersion="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-10T03:14:31" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
  <SignatureId>7CA7BEE8-25E0-4967-9EAD-7DBD6C99A3EB</SignatureId>
  <Title>WaitAnalysisWorkItems</Title>
  <SignatureType>Basic</SignatureType>
  <Description>Wait Analysis Work Item Stacks</Description>
  <TraceType>
    <Type>Common</Type>
  </TraceType>
  <Category>Wait (All Wait Classes) [Wait]</Category>
  <Component></Component>
  <AuthorAlias>xperf</AuthorAlias>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!KeRemoveQueueEx</Frame>
        </FrameBlocks>
      </CSwitchStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!KeRemovePriQueue</Frame>
        </FrameBlocks>
      </CSwitchStack>
    </Wait>
  </Recognition>
  
  <!--
    Normally, ExpWorkerThread will call KeRemovePriQueue which is used to determine if a wait is a work item, but this function
    is removed in the arm and amd64 kernel by inline it at every place it was called. So the rest of the wait stack is put in the 
    CSwitchStack as the replacement of KeRemovePriQueue.
  -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!ExpWorkerThread</Frame>
          <Frame>nt!KiCommitThreadWait</Frame>
          <Frame>nt!KiSwapThread</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!KeInsertPriQueue</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!ExpWorkerThread</Frame>
          <Frame>nt!KiCommitThreadWait</Frame>
          <Frame>nt!KiSwapThread</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!ExQueueWorkItem</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>user32.dll!RealMsgWaitForMultipleObjectsEx</Frame>
        </FrameBlocks>
      </CSwitchStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>user32.dll!MsgWaitForMultipleObjectsEx</Frame>
        </FrameBlocks>
      </CSwitchStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>ntdll.dll!TppWaiterpThread</Frame>
          <Frame>ntdll.dll!ZwWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!KiProcessThreadWaitList</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  
  <!--
    _PostMessageExtended has been changed to a wrapper of _PostTransformableMessageExtended in blue and the xxxRealSleepThread now
    calls KeWaitForMultipleObjects instread of KeWaitForSingleObject, so the stacks has been changed, and the new version of the
    recognitions should be added for detacting the work items after blue.
  -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserGetMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostMessageCheckIL</Frame>
          <Frame>win32k.sys!_PostMessageExtended</Frame>
          <Frame>win32k.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserGetMessage</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostMessageCheckIL</Frame>
          <Frame>win32kfull.sys!_PostMessageExtended</Frame>
          <Frame>win32kfull.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!--
    _PostTransformableMessageIL is almost the same as _PostMessageCheckIL and _PostMessageCheckIL is in the original path, so both
    paths are added.
  -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserGetMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostMessageCheckIL</Frame>
          <Frame>win32k.sys!_PostTransformableMessageExtended</Frame>
          <Frame>win32k.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserGetMessage</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostMessageCheckIL</Frame>
          <Frame>win32kfull.sys!_PostTransformableMessageExtended</Frame>
          <Frame>win32kfull.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserGetMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostTransformableMessageIL</Frame>
          <Frame>win32k.sys!_PostTransformableMessageExtended</Frame>
          <Frame>win32k.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserGetMessage</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostTransformableMessageIL</Frame>
          <Frame>win32kfull.sys!_PostTransformableMessageExtended</Frame>
          <Frame>win32kfull.sys!SetWakeBit</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserGetMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserGetMessage</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserGetMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserGetMessage</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserWaitMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore. Besides module name, win32k.sys!NtUserWaitMessage is replaced with win32kfull.sys!xxxWaitMessageEx -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!xxxWaitMessageEx</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserWaitMessage</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore. Besides module name, win32k.sys!NtUserWaitMessage is replaced with win32kfull.sys!xxxWaitMessageEx -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!xxxWaitMessageEx</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserWaitAvailableMessageEx</Frame>
          <Frame>win32k.sys!xxxSleepThread</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserWaitAvailableMessageEx</Frame>
          <Frame>win32kfull.sys!xxxSleepThread</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!NtUserWaitAvailableMessageEx</Frame>
          <Frame>win32k.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32k.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <!-- win32k.sys module is changed in OneCore -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!NtUserWaitAvailableMessageEx</Frame>
          <Frame>win32kfull.sys!xxxRealSleepThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kfull.sys!_PostTransformableMessageExtended</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>SHELL32.DLL!CEnumTask::_IncrEnumFolder</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>SHELL32.DLL!CEventResult::SignalDone</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>dxgmms1.sys!VidSchiWorkerThread</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!PopFxPluginWork</Frame>
          <Frame>dxgkrnl.sys!DxgkPowerRuntimeComponentActiveCallback</Frame>
          <Frame>dxgkrnl.sys!DXGADAPTER::PowerRuntimeComponentActiveCallback</Frame>
          <Frame>dxgmms1.sys!VidSchSetNodePowerState</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>

  <!--
    Add ready boot IO stack as work item because the IO is done asynchronously and
    treating it as wait will introduce many irrelevant IO into critical path.
  -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>rdyboost.sys!SMKM_STORE&lt;SMD_TRAITS&gt;::SmStWorker</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>nt!KiRetireDpcList</Frame>
          <Frame>rdyboost.sys!SmdReadWriteCompletion</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  
  <!--
    COREMESSAGING.DLL uses these functions to queue work items. We see them in Mobile traces.
  -->
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::Dispatcher::Callback_DispatchLoop</Frame>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::WaitController::Callback_DoGeneralWait</Frame>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::WaitArray::Callback_WaitAny</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Messaging::AnonymousStream::Send</Frame>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::EventLoop::SignalWakeObject</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::Dispatcher::Callback_DispatchLoop</Frame>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::WaitController::Callback_DoGeneralWait</Frame>
          <Frame>COREMESSAGING.DLL!Microsoft::CoreUI::Dispatch::WaitArray::Callback_WaitAny</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>COREMESSAGING.DLL!Cn::Threading::InterconnectQueue::PostItem_LockedByCaller</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>MinUser.dll!minMsgWaitForMultipleObjectsEx</Frame>
          <Frame>MinUser.dll!Core::Yield::gggWaitForMultipleObjectsEx</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>COREMESSAGING.DLL!Cn::Threading::InterconnectQueue::PostItem_LockedByCaller</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>MinUser.dll!minMsgWaitForMultipleObjectsEx</Frame>
          <Frame>MinUser.dll!Core::Yield::gggWaitForMultipleObjectsEx</Frame>
          <Frame>nt!KeWaitForMultipleObjects</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>Windows.UI.dll!Windows::UI::Core::CDispatcher::RunAsync</Frame>
          <Frame>Windows.UI.dll!Windows::UI::Core::CDispatcher::RunAsyncWorker</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition> 
  <Recognition>
    <Wait>
      <CSwitchStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>winsrvext.dll!PowerNotificationThread</Frame>
          <Frame>ntdll.dll!ZwWaitForSingleObject</Frame>
          <Frame>nt!KeWaitForSingleObject</Frame>
        </FrameBlocks>
      </CSwitchStack>
      <ReadyThreadStack>
        <FrameBlocks>
          <AllowSkippingFrames>true</AllowSkippingFrames>
          <Frame>win32kbase.sys!QueuePowerRequest</Frame>
          <Frame>nt!KeSetEvent</Frame>
        </FrameBlocks>
      </ReadyThreadStack>
    </Wait>
  </Recognition>
  <AdditionalComments>This signature identifies stacks that will be treated as work items.</AdditionalComments>
</PerformanceSignature>
