From b1494bcb020011bde3309d24beccb7f8e6e7ce97 Mon Sep 17 00:00:00 2001 From: Matt Wojciakowski Date: Wed, 30 Mar 2022 11:41:05 -0700 Subject: [PATCH] Add Arm64EC ABI doc (#2337) * Author new Arm64EC ABI doc --- landing/arm-docs/index.yml | 146 +- windows-apps-src/develop/toc.yml | 3094 ++++++++++++----------- windows-apps-src/porting/arm64ec-abi.md | 768 ++++++ 3 files changed, 2390 insertions(+), 1618 deletions(-) create mode 100644 windows-apps-src/porting/arm64ec-abi.md diff --git a/landing/arm-docs/index.yml b/landing/arm-docs/index.yml index 114f26a8d0..3b63c6c286 100644 --- a/landing/arm-docs/index.yml +++ b/landing/arm-docs/index.yml @@ -1,73 +1,75 @@ -### YamlMime:Landing - -title: Windows on ARM documentation -summary: Windows runs on PCs powered by ARM processors. This page provides the information for you to learn more about the platform and get started developing apps. # < 160 chars -metadata: - title: Windows on ARM documentation - description: This page provides the information for you to get started developing ARM64 win32 and UWP apps. - ms.service: guidance - ms.topic: landing-page - author: mattwojo - ms.author: mattwoj - ms.date: 06/25/2021 - ms.localizationpriority: medium - -# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | sample | tutorial | video | whats-new - -landingContent: -# Cards and links should be based on top customer tasks or top subjects -# Start card title with a verb - - title: About Windows on ARM - linkLists: - - linkListType: overview - links: - - text: Windows on ARM - url: /windows/uwp/porting/apps-on-arm - - linkListType: learn - links: - - text: Learn how x86 emulation works - url: /windows/uwp/porting/apps-on-arm-x86-emulation - - linkListType: video - links: - - text: Build ARM64 Win32 C++ Apps - url: https://youtu.be/OZtVBDeVqCE - - text: Build 2018 Windows 10 on ARM for developers - url: /events/build-2018/brk2438 - - # Card - - title: Develop for Windows on ARM - linkLists: - - linkListType: how-to-guide - links: - - text: ARM64EC for Windows 11 apps on ARM - url: /windows/uwp/porting/arm64ec - - text: Build ARM64 apps with the SDK - url: https://blogs.windows.com/windowsdeveloper/2018/11/15/official-support-for-windows-10-on-arm-development/ - - text: Build ARM64 Drivers with the WDK - url: /windows-hardware/drivers/develop/building-arm64-drivers - - text: Troubleshoot UWP apps on ARM - url: /windows/uwp/porting/apps-on-arm-troubleshooting-arm32 - - text: Debug on ARM - url: /windows-hardware/drivers/debugger/debugging-arm64 - - linkListType: reference - links: - - text: Developer resources at Qualcomm Developer Network - url: https://developer.qualcomm.com/hardware/windows-on-snapdragon/developer-resources - - text: Windows on ARM documentation at developer.arm.com - url: https://developer.arm.com/solutions/os/windows-on-arm - - linkListType: whats-new - links: - - text: Develop apps for ARM with Snapdragon Developer Kit - url: https://developer.qualcomm.com/hardware/windows-on-snapdragon/snapdragon-developer-kit - - # Card - - title: Feedback - linkLists: - - linkListType: reference - links: - - text: Use the feedback hub - url: feedback-hub://?tabid=2&contextid=803 - - text: Report a bug - url: mailto:woafeedback@microsoft.com - - text: Provide documentation feedback +### YamlMime:Landing + +title: Windows on ARM documentation +summary: Windows runs on PCs powered by ARM processors. This page provides the information for you to learn more about the platform and get started developing apps. # < 160 chars +metadata: + title: Windows on ARM documentation + description: This page provides the information for you to get started developing ARM64 win32 and UWP apps. + ms.service: guidance + ms.topic: landing-page + author: mattwojo + ms.author: mattwoj + ms.date: 03/18/2022 + ms.localizationpriority: medium + +# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | sample | tutorial | video | whats-new + +landingContent: +# Cards and links should be based on top customer tasks or top subjects +# Start card title with a verb + - title: About Windows on ARM + linkLists: + - linkListType: overview + links: + - text: Windows on ARM + url: /windows/uwp/porting/apps-on-arm + - linkListType: learn + links: + - text: Learn how x86 emulation works + url: /windows/uwp/porting/apps-on-arm-x86-emulation + - linkListType: video + links: + - text: Build ARM64 Win32 C++ Apps + url: https://youtu.be/OZtVBDeVqCE + - text: Build 2018 Windows 10 on ARM for developers + url: /events/build-2018/brk2438 + + # Card + - title: Develop for Windows on ARM + linkLists: + - linkListType: how-to-guide + links: + - text: ARM64EC for Windows 11 apps on ARM + url: /windows/uwp/porting/arm64ec + - text: Understanding Arm64EC ABI and assembly code + url: /windows/uwp/porting/arm64ec-abi.md + - text: Build ARM64 apps with the SDK + url: https://blogs.windows.com/windowsdeveloper/2018/11/15/official-support-for-windows-10-on-arm-development/ + - text: Build ARM64 Drivers with the WDK + url: /windows-hardware/drivers/develop/building-arm64-drivers + - text: Troubleshoot UWP apps on ARM + url: /windows/uwp/porting/apps-on-arm-troubleshooting-arm32 + - text: Debug on ARM + url: /windows-hardware/drivers/debugger/debugging-arm64 + - linkListType: reference + links: + - text: Developer resources at Qualcomm Developer Network + url: https://developer.qualcomm.com/hardware/windows-on-snapdragon/developer-resources + - text: Windows on ARM documentation at developer.arm.com + url: https://developer.arm.com/solutions/os/windows-on-arm + - linkListType: whats-new + links: + - text: Develop apps for ARM with Snapdragon Developer Kit + url: https://developer.qualcomm.com/hardware/windows-on-snapdragon/snapdragon-developer-kit + + # Card + - title: Feedback + linkLists: + - linkListType: reference + links: + - text: Use the feedback hub + url: feedback-hub://?tabid=2&contextid=803 + - text: Report a bug + url: mailto:woafeedback@microsoft.com + - text: Provide documentation feedback url: https://github.com/MicrosoftDocs/windows-uwp/issues \ No newline at end of file diff --git a/windows-apps-src/develop/toc.yml b/windows-apps-src/develop/toc.yml index 2210f0c9b8..9bc4004836 100644 --- a/windows-apps-src/develop/toc.yml +++ b/windows-apps-src/develop/toc.yml @@ -1,1546 +1,1548 @@ -- name: Overview - href: index.md -- name: App types - items: - - name: Education apps - href: ../apps-for-education/index.md - items: - - name: Take a Test API - href: ../apps-for-education/take-a-test-api.md - - name: Enterprise apps - href: ../enterprise/index.md - items: - - name: Windows Information Protection (WIP) - href: ../enterprise/wip-hub.md - items: - - name: WIP developer guide - href: ../enterprise/wip-dev-guide.md - - name: Enterprise shared storage - href: ../enterprise/enterprise-shared-storage.md - - name: "Tutorial: Create a customer database application" - href: ../enterprise/customer-database-tutorial.md - items: - - name: Customer database tutorial app structure - href: ../enterprise/customer-database-app-structure.md - - name: Progressive Web Apps - href: /microsoft-edge/progressive-web-apps -- name: Audio, video, and camera - href: ../audio-video-camera/index.md - items: - - name: Camera - href: ../audio-video-camera/camera.md - items: - - name: Capture photos and video with Windows built-in camera UI - href: ../audio-video-camera/capture-photos-and-video-with-cameracaptureui.md - - name: Display the camera preview - href: ../audio-video-camera/simple-camera-preview-access.md - - name: Basic photo, video, and audio capture with MediaCapture - href: ../audio-video-camera/basic-photo-video-and-audio-capture-with-MediaCapture.md - - name: Camera UI features for mobile devices - href: ../audio-video-camera/camera-ui-features-for-mobile-devices.md - - name: Handle device and screen orientation with MediaCapture - href: ../audio-video-camera/handle-device-orientation-with-mediacapture.md - - name: Discover and select camera capabilities with camera profiles - href: ../audio-video-camera/camera-profiles.md - - name: Set format, resolution, and frame rate for MediaCapture - href: ../audio-video-camera/set-media-encoding-properties.md - - name: HDR and low-light photo capture - href: ../audio-video-camera/high-dynamic-range-hdr-photo-capture.md - - name: Manual camera controls for photo and video capture - href: ../audio-video-camera/capture-device-controls-for-photo-and-video-capture.md - - name: Manual camera controls for video capture - href: ../audio-video-camera/capture-device-controls-for-video-capture.md - - name: Video stabilization effect for video capture - href: ../audio-video-camera/effects-for-video-capture.md - - name: Scene analysis for MediaCapture - href: ../audio-video-camera/scene-analysis-for-media-capture.md - - name: Capture a photo sequence with VariablePhotoSequence - href: ../audio-video-camera/variable-photo-sequence.md - - name: Process media frames with MediaFrameReader - href: ../audio-video-camera/process-media-frames-with-mediaframereader.md - items: - - name: Process audio frames with MediaFrameReader - href: ../audio-video-camera/process-audio-frames-with-mediaframereader.md - - name: Use OpenCV with MediaFrameReader - href: ../audio-video-camera/use-opencv-with-mediaframereader.md - - name: Capture from multiple sources using MediaFrameSourceGroup - href: ../audio-video-camera/capture-from-multiple-sources-simultaneously.md - - name: Connect to remote cameras - href: ../audio-video-camera/connect-to-remote-cameras.md - - name: Get a preview frame - href: ../audio-video-camera/get-a-preview-frame.md - - name: Media playback - href: ../audio-video-camera/media-playback.md - items: - - name: Play audio and video with MediaPlayer - href: ../audio-video-camera/play-audio-and-video-with-mediaplayer.md - - name: Media items, playlists, and tracks - href: ../audio-video-camera/media-playback-with-mediasource.md - - name: Integrate with the System Media Transport Controls - href: ../audio-video-camera/integrate-with-systemmediatransportcontrols.md - items: - - name: Manual control of the System Media Transport Controls - href: ../audio-video-camera/system-media-transport-controls.md - - name: System-supported timed metadata cues - href: ../audio-video-camera/system-supported-metadata-cues.md - - name: Create, schedule, and manage media breaks - href: ../audio-video-camera/create-schedule-and-manage-media-breaks.md - - name: Play media in the background - href: ../audio-video-camera/background-audio.md - items: - - name: Legacy background media playback - href: ../audio-video-camera/legacy-background-media-playback.md - - name: Adaptive streaming - href: ../audio-video-camera/adaptive-streaming.md - items: - - name: HLS tag support - href: ../audio-video-camera/hls-tag-support.md - - name: DASH profile support - href: ../audio-video-camera/dash-profile-support.md - - name: Media casting - href: ../audio-video-camera/media-casting.md - - name: Enable audio playback from remote Bluetooth-connected devices - href: ../audio-video-camera/enable-remote-audio-playback.md - - name: PlayReady DRM - href: ../audio-video-camera/playready-client-sdk.md - items: - - name: Hardware DRM - href: ../audio-video-camera/hardware-drm.md - - name: Adaptive streaming with PlayReady - href: ../audio-video-camera/adaptive-streaming-with-playready.md - - name: PlayReady Encrypted Media Extension - href: ../audio-video-camera/playready-encrypted-media-extension.md - - name: Detect faces in images or videos - href: ../audio-video-camera/detect-and-track-faces-in-an-image.md - - name: Custom video effects - href: ../audio-video-camera/custom-video-effects.md - - name: Custom audio effects - href: ../audio-video-camera/custom-audio-effects.md - - name: Media compositions and editing - href: ../audio-video-camera/media-compositions-and-editing.md - - name: Audio device information properties - href: ../audio-video-camera/audio-device-information-properties.md - - name: Detect and respond to audio state changes - href: ../audio-video-camera/detect-and-respond-to-audio-state-changes.md - - name: Create, edit, and save bitmap images - href: ../audio-video-camera/imaging.md - items: - - name: Process bitmaps with OpenCV - href: ../audio-video-camera/process-software-bitmaps-with-opencv.md - - name: Process bitmaps with the LowLightFusion API - href: ../audio-video-camera/process-bitmaps-low-light-fusion.md - - name: BitmapEncoder options reference - href: ../audio-video-camera/bitmapencoder-options-reference.md - - name: Image metadata - href: ../audio-video-camera/image-metadata.md - - name: Transcode media files - href: ../audio-video-camera/transcode-media-files.md - - name: Process media files in the background - href: ../audio-video-camera/process-media-files-in-the-background.md - - name: Audio graphs - href: ../audio-video-camera/audio-graphs.md - - name: MIDI - href: ../audio-video-camera/midi.md - - name: Import media from a device - href: ../audio-video-camera/import-media-from-a-device.md - - name: Camera-independent Flashlight - href: ../audio-video-camera/camera-independent-flashlight.md - - name: Supported codecs - href: ../audio-video-camera/supported-codecs.md - - name: Query for installed codecs - href: ../audio-video-camera/codec-query.md - - name: Screen capture - href: ../audio-video-camera/screen-capture.md - - name: Screen capture to video - href: ../audio-video-camera/screen-capture-video.md -- name: Communication - items: - - name: App-to-app communication - href: ../app-to-app/index.md - items: - - name: Share data - href: ../app-to-app/share-data.md - - name: Receive data - href: ../app-to-app/receive-data.md - - name: Copy and paste - href: ../app-to-app/copy-and-paste.md - - name: Interprocess communication (IPC) - href: ../communication/interprocess-communication.md - - name: Networking and web services - href: ../networking/index.md - items: - - name: Networking basics - href: ../networking/networking-basics.md - - name: Which networking technology? - href: ../networking/which-networking-technology.md - - name: Network communications in the background - href: ../networking/network-communications-in-the-background.md - - name: Sockets - href: ../networking/sockets.md - - name: WebSockets - href: ../networking/websockets.md - - name: HttpClient - href: ../networking/httpclient.md - - name: RSS/Atom feeds - href: ../networking/web-feeds.md - - name: Background transfers - href: ../networking/background-transfers.md - - name: Sharing named objects - href: ../communication/sharing-named-objects.md -- name: Data and files - items: - - name: App resources - href: ../app-resources/index.md - items: - - name: Resource Management System - href: ../app-resources/resource-management-system.md - - name: How the RMS matches and chooses resources - href: ../app-resources/how-rms-matches-and-chooses-resources.md - - name: How the RMS matches language tags - href: ../app-resources/how-rms-matches-lang-tags.md - - name: Tailor your resources for language, scale, contrast, others - href: ../app-resources/tailor-resources-lang-scale-contrast.md - - name: Localize strings in your UI and app package manifest - href: ../app-resources/localize-strings-ui-manifest.md - - name: Load images, assets tailored for scale, theme, contrast, others - href: ../app-resources/images-tailored-for-scale-theme-contrast.md - - name: URI schemes - href: ../app-resources/uri-schemes.md - - name: Specify the default resources that your app uses - href: ../app-resources/specify-default-resources-installed.md - - name: Build resources into your app package, instead of into a resource pack - href: ../app-resources/build-resources-into-app-package.md - - name: PRI APIs and custom build systems - href: ../app-resources/pri-apis-custom-build-systems.md - items: - - name: Scenario 1 (PRI APIs) - href: ../app-resources/pri-apis-scenario-1.md - - name: Compile resources manually with MakePri.exe - href: ../app-resources/compile-resources-manually-with-makepri.md - - name: MakePri.exe command-line options - href: ../app-resources/makepri-exe-command-options.md - - name: MakePri.exe configuration file - href: ../app-resources/makepri-exe-configuration.md - - name: MakePri.exe format-specific indexers - href: ../app-resources/makepri-exe-format-specific-indexers.md - - name: Migrate legacy resources - href: ../app-resources/using-mrt-for-converted-desktop-apps-and-games.md - - name: Data access - href: ../data-access/index.md - items: - - name: Use a SQLite database - href: ../data-access/sqlite-databases.md - - name: Use a SQL Server database - href: ../data-access/sql-server-databases.md - - name: Use a MongoDB database - href: ../data-access/mongo-db-databases.md - - name: Use a MySQL database - href: ../data-access/mysql-databases.md - - name: Data binding - href: ../data-binding/index.md - items: - - name: Data binding overview - href: ../data-binding/data-binding-quickstart.md - - name: Data binding in depth - href: ../data-binding/data-binding-in-depth.md - - name: "Functions in x:Bind" - href: ../data-binding/function-bindings.md - - name: "Tutorial: Create data bindings" - href: ../data-binding/xaml-basics-data-binding.md - - name: Sample data on the design surface, and for prototyping - href: ../data-binding/displaying-data-in-the-designer.md - - name: Bind hierarchical data and create a master/details view - href: ../data-binding/how-to-bind-to-hierarchical-data-and-create-a-master-details-view.md - - name: Data binding and MVVM - href: ../data-binding/data-binding-and-mvvm.md - - name: Files, folders, and libraries - href: ../files/index.md - items: - - name: Enumerate and query files and folders - href: ../files/quickstart-listing-files-and-folders.md - - name: Create, write, and read a file - href: ../files/quickstart-reading-and-writing-files.md - - name: Best practices for writing to files - href: ../files/best-practices-for-writing-to-files.md - - name: Get file properties - href: ../files/quickstart-getting-file-properties.md - - name: Open files and folders with a picker - href: ../files/quickstart-using-file-and-folder-pickers.md - - name: Save a file with a picker - href: ../files/quickstart-save-a-file-with-a-picker.md - - name: Accessing HomeGroup content - href: ../files/quickstart-accessing-homegroup-content.md - - name: Determining availability of Microsoft OneDrive files - href: ../files/quickstart-determining-availability-of-microsoft-onedrive-files.md - - name: Files and folders in the Music, Pictures, and Videos libraries - href: ../files/quickstart-managing-folders-in-the-music-pictures-and-videos-libraries.md - - name: Thumbnail images - href: ../files/thumbnails.md - - name: Track recently used files and folders - href: ../files/how-to-track-recently-used-files-and-folders.md - - name: Track file system changes in the background - href: ../files/change-tracking-filesystem.md - - name: Access the SD card - href: ../files/access-the-sd-card.md - - name: File access permissions - href: ../files/file-access-permissions.md - - name: Fast access to file properties in UWP - href: ../files/fast-file-properties.md - - name: Machine Learning - href: /windows/ai/ -- name: Deployment - items: - - name: Choose a UWP version - href: ../updates-and-versions/choose-a-uwp-version.md - - name: Debugging, testing, and performance - href: ../debug-test-perf/index.md - items: - - name: Deploying and debugging UWP apps - href: ../debug-test-perf/deploying-and-debugging-uwp-apps.md - - name: Testing and debugging tools for PLM - href: ../debug-test-perf/testing-debugging-plm.md - - name: Test with the Microsoft Emulator for Windows - href: ../debug-test-perf/test-with-the-emulator.md - - name: Test Surface Hub apps using Visual Studio - href: ../debug-test-perf/test-surface-hub-apps-using-visual-studio.md - - name: Deploy an app through loose file registration - href: ../debug-test-perf/loose-file-registration.md - - name: Beta testing - href: ../debug-test-perf/beta-testing.md - - name: Windows Device Portal - href: ../debug-test-perf/device-portal.md - items: - - name: Windows Device Portal for Desktop - href: ../debug-test-perf/device-portal-desktop.md - - name: Windows Device Portal for Mobile - href: ../debug-test-perf/device-portal-mobile.md - - name: Windows Device Portal core REST APIs - href: ../debug-test-perf/device-portal-api-core.md - - name: Write a custom plugin for Windows Device Portal - href: ../debug-test-perf/device-portal-plugin.md - - name: Provision Windows Device Portal with a custom SSL certificate - href: ../debug-test-perf/device-portal-ssl.md - - name: Windows App Certification Kit - href: ../debug-test-perf/windows-app-certification-kit.md - items: - - name: Windows App Certification Kit tests - href: ../debug-test-perf/windows-app-certification-kit-tests.md - items: - - name: Windows Desktop Bridge app tests - href: ../debug-test-perf/windows-desktop-bridge-app-tests.md - - name: Performance - href: ../debug-test-perf/performance-and-xaml-ui.md - items: - - name: Planning for performance - href: ../debug-test-perf/planning-and-measuring-performance.md - - name: Optimize background activity - href: ../debug-test-perf/optimize-background-activity.md - - name: ListView and GridView UI optimization - href: ../debug-test-perf/optimize-gridview-and-listview.md - - name: ListView and GridView data virtualization - href: ../debug-test-perf/listview-and-gridview-data-optimization.md - - name: Improve garbage collection performance - href: ../debug-test-perf/improve-garbage-collection-performance.md - - name: Keep the UI thread responsive - href: ../debug-test-perf/keep-the-ui-thread-responsive.md - - name: Optimize your XAML markup - href: ../debug-test-perf/optimize-xaml-loading.md - - name: Optimize your XAML layout - href: ../debug-test-perf/optimize-your-xaml-layout.md - - name: MVVM and language performance tips - href: ../debug-test-perf/mvvm-performance-tips.md - - name: Best practices for your app's startup performance - href: ../debug-test-perf/best-practices-for-your-app-s-startup-performance.md - - name: Optimize animations, media, and images - href: ../debug-test-perf/optimize-animations-and-media.md - - name: Optimize suspend/resume - href: ../debug-test-perf/optimize-suspend-resume.md - - name: Optimize file access - href: ../debug-test-perf/optimize-file-access.md - - name: Windows Runtime components and optimizing interop - href: ../debug-test-perf/windows-runtime-components-and-optimizing-interop.md - - name: Tools for profiling and performance - href: ../debug-test-perf/tools-for-profiling-and-performance.md - - name: Version adaptive apps - href: ../debug-test-perf/version-adaptive-apps.md - items: - - name: Version adaptive code - href: ../debug-test-perf/version-adaptive-code.md - - name: Conditional XAML - href: ../debug-test-perf/conditional-xaml.md - - name: Monetization, engagement, and Store services - href: ../monetize/index.md - items: - - name: In-app purchases and trials - href: ../monetize/in-app-purchases-and-trials.md - items: - - name: Get product info for apps and add-ons - href: ../monetize/get-product-info-for-apps-and-add-ons.md - - name: Get license info for apps and add-ons - href: ../monetize/get-license-info-for-apps-and-add-ons.md - - name: Enable in-app purchases of apps and add-ons - href: ../monetize/enable-in-app-purchases-of-apps-and-add-ons.md - - name: Enable consumable add-on purchases - href: ../monetize/enable-consumable-add-on-purchases.md - - name: Enable subscription add-ons for your app - href: ../monetize/enable-subscription-add-ons-for-your-app.md - - name: Implement a trial version of your app - href: ../monetize/implement-a-trial-version-of-your-app.md - - name: Data schemas for Store products - href: ../monetize/data-schemas-for-store-products.md - - name: Error codes for Store operations - href: ../monetize/error-codes-for-store-operations.md - - name: Using the Windows.ApplicationModel.Store namespace - href: ../monetize/in-app-purchases-and-trials-using-the-windows-applicationmodel-store-namespace.md - items: - - name: Exclude or limit features in a trial version - href: ../monetize/exclude-or-limit-features-in-a-trial-version-of-your-app.md - - name: Enable in-app product purchases - href: ../monetize/enable-in-app-product-purchases.md - - name: Enable consumable in-app product purchases - href: ../monetize/enable-consumable-in-app-product-purchases.md - - name: Manage a large catalog of in-app products - href: ../monetize/manage-a-large-catalog-of-in-app-products.md - - name: Use receipts to verify product purchases - href: ../monetize/use-receipts-to-verify-product-purchases.md - - name: Display ads in your app with the Microsoft Advertising SDK - href: ../monetize/display-ads-in-your-app.md - items: - - name: Install the Microsoft Advertising SDK - href: ../monetize/install-the-microsoft-advertising-libraries.md - items: - - name: Update your app to the latest libraries for banner ads - href: ../monetize/update-your-app-to-the-latest-advertising-libraries.md - - name: Implement ads in your app - href: ../monetize/developer-walkthroughs.md - items: - - name: Banner ads - href: ../monetize/banner-ads.md - items: - - name: AdControl in XAML and .NET - href: ../monetize/adcontrol-in-xaml-and--net.md - - name: AdControl in HTML 5 and JavaScript - href: ../monetize/adcontrol-in-html-5-and-javascript.md - - name: Supported banner ad sizes - href: ../monetize/supported-ad-sizes-for-banner-ads.md - - name: Interstitial ads - href: ../monetize/interstitial-ads.md - items: - - name: Interstitial ad sample code in C# - href: ../monetize/interstitial-ad-sample-code-in-c.md - - name: Interstitial ad sample code in JavaScript - href: ../monetize/interstitial-ad-sample-code-in-javascript.md - - name: Native ads - href: ../monetize/native-ads.md - - name: Show ads in video content - href: ../monetize/add-advertisements-to-video-content.md - - name: Set up ad units in your app - href: ../monetize/set-up-ad-units-in-your-app.md - - name: Microsoft ad mediation service - href: ../monetize/ad-mediation-service.md - - name: Best practices - href: ../monetize/best-practices-for-ads-in-apps.md - items: - - name: UI and user experience guidelines - href: ../monetize/ui-and-user-experience-guidelines.md - - name: Optimize the viewability of your ad units - href: ../monetize/optimize-ad-unit-viewability.md - - name: Handle ad errors - href: ../monetize/error-handling-with-advertising-libraries.md - items: - - name: Error handling in XAML/C# walkthrough - href: ../monetize/error-handling-in-xamlc-walkthrough.md - - name: Error handling in JavaScript walkthrough - href: ../monetize/error-handling-in-javascript-walkthrough.md - - name: Known issues and troubleshooting - href: ../monetize/known-issues-for-the-advertising-libraries.md - items: - - name: HTML and JavaScript troubleshooting guide - href: ../monetize/html-and-javascript-troubleshooting-guide.md - - name: XAML and C# troubleshooting guide - href: ../monetize/xaml-and-c-troubleshooting-guide.md - - name: Release notes - href: ../monetize/release-notes-for-the-advertising-libraries.md - - name: Windows Premium Ads Publishers Program - href: ../monetize/windows-premium-ads-publishers-program.md - - name: Engage customers with the Microsoft Store Services SDK - href: ../monetize/microsoft-store-services-sdk.md - items: - - name: Run app experiments with A/B testing - href: ../monetize/run-app-experiments-with-a-b-testing.md - items: - - name: Create an experiment project in Partner Center - href: ../monetize/create-a-project-and-define-remote-variables-in-the-dev-center-dashboard.md - - name: Code your app for experimentation - href: ../monetize/code-your-experiment-in-your-app.md - - name: Define your experiment in Partner Center - href: ../monetize/define-your-experiment-in-the-dev-center-dashboard.md - - name: Manage your experiment in Partner Center - href: ../monetize/manage-your-experiment.md - - name: Create and run your first experiment - href: ../monetize/create-and-run-your-first-experiment-with-a-b-testing.md - - name: Launch Feedback Hub from your app - href: ../monetize/launch-feedback-hub-from-your-app.md - - name: Configure your app for targeted push notifications - href: ../monetize/configure-your-app-to-receive-dev-center-notifications.md - - name: Log custom events for Partner Center - href: ../monetize/log-custom-events-for-dev-center.md - - name: Request ratings and reviews - href: ../monetize/request-ratings-and-reviews.md - - name: Microsoft Store services - href: ../monetize/using-windows-store-services.md - items: - - name: Access analytics data - href: ../monetize/access-analytics-data-using-windows-store-services.md - items: - - name: Get acquisitions data for your games and apps - href: ../monetize/acquisitions-data.md - - name: Get add-on acquisitions data for your games and apps - href: ../monetize/add-on-acquisitions-data.md - - name: UWP apps - items: - - name: Get acquisitions and installs data - items: - - name: Get app acquisitions (legacy) - href: ../monetize/get-app-acquisitions.md - - name: Get app installs - href: ../monetize/get-app-installs.md - - name: Get app acquisition funnel data (legacy) - href: ../monetize/get-acquisition-funnel-data.md - - name: Get app conversions by channel - href: ../monetize/get-app-conversions-by-channel.md - - name: Get add-on acquisitions - href: ../monetize/get-in-app-acquisitions.md - - name: Get subscription add-on acquisitions - href: ../monetize/get-subscription-acquisitions.md - - name: Get add-on conversions by channel - href: ../monetize/get-add-on-conversions-by-channel.md - - name: Get insights data for your app - href: ../monetize/get-insights-data-for-your-app.md - - name: Get app ratings - href: ../monetize/get-app-ratings.md - - name: Get app reviews - href: ../monetize/get-app-reviews.md - - name: Get daily app usage - href: ../monetize/get-app-usage-daily.md - - name: Get monthly app usage - href: ../monetize/get-app-usage-monthly.md - - name: Get error reporting data - href: ../monetize/get-error-reporting-data.md - items: - - name: Get details for an error in your app - href: ../monetize/get-details-for-an-error-in-your-app.md - - name: Get the stack trace for an error in your app - href: ../monetize/get-the-stack-trace-for-an-error-in-your-app.md - - name: Download the CAB file for an error in your app - href: ../monetize/download-the-cab-file-for-an-error-in-your-app.md - - name: Get ad performance data - href: ../monetize/get-ad-performance-data.md - - name: Get ad campaign performance data - href: ../monetize/get-ad-campaign-performance-data.md - - name: Desktop apps - items: - - name: Get desktop application installs - href: ../monetize/get-desktop-app-installs.md - - name: Get insights data for your desktop application - href: ../monetize/get-insights-data-for-your-desktop-app.md - - name: Get upgrade blocks for your desktop application - href: ../monetize/get-desktop-block-data.md - - name: Get upgrade block details for your desktop application - href: ../monetize/get-desktop-block-data-details.md - - name: Get error reporting data for your desktop application - href: ../monetize/get-desktop-application-error-reporting-data.md - items: - - name: Get details for an error in your desktop application - href: ../monetize/get-details-for-an-error-in-your-desktop-application.md - - name: Get the stack trace for an error in your desktop application - href: ../monetize/get-the-stack-trace-for-an-error-in-your-desktop-application.md - - name: Download the CAB file for an error in your desktop application - href: ../monetize/download-the-cab-file-for-an-error-in-your-desktop-application.md - - name: Xbox One games and Xbox Live - items: - - name: Get Xbox Live analytics data - href: ../monetize/get-xbox-live-analytics.md - items: - - name: Get Xbox Live achievements data - href: ../monetize/get-xbox-live-achievements-data.md - - name: Get Xbox Live health data - href: ../monetize/get-xbox-live-health-data.md - - name: Get Xbox Live Game Hub data - href: ../monetize/get-xbox-live-game-hub-data.md - - name: Get Xbox Live club data - href: ../monetize/get-xbox-live-club-data.md - - name: Get Xbox Live multiplayer data - href: ../monetize/get-xbox-live-multiplayer-data.md - - name: Get Xbox Live concurrent usage data - href: ../monetize/get-xbox-live-concurrent-usage-data.md - - name: Respond to reviews - href: ../monetize/respond-to-reviews-using-windows-store-services.md - items: - - name: Get response info for reviews - href: ../monetize/get-response-info-for-app-reviews.md - - name: Submit responses to reviews - href: ../monetize/submit-responses-to-app-reviews.md - - name: Run ad campaigns - href: ../monetize/run-ad-campaigns-using-windows-store-services.md - items: - - name: Manage ad campaigns - href: ../monetize/manage-ad-campaigns.md - - name: Manage delivery lines - href: ../monetize/manage-delivery-lines-for-ad-campaigns.md - - name: Manage targeting profiles - href: ../monetize/manage-targeting-profiles-for-ad-campaigns.md - - name: Manage creatives - href: ../monetize/manage-creatives-for-ad-campaigns.md - - name: Create and manage submissions - href: ../monetize/create-and-manage-submissions-using-windows-store-services.md - items: - - name: Get app data - href: ../monetize/get-app-data.md - items: - - name: Get all apps - href: ../monetize/get-all-apps.md - - name: Get an app - href: ../monetize/get-an-app.md - - name: Get add-ons for an app - href: ../monetize/get-add-ons-for-an-app.md - - name: Get package flights for an app - href: ../monetize/get-flights-for-an-app.md - - name: Manage app submissions - href: ../monetize/manage-app-submissions.md - items: - - name: Get an app submission - href: ../monetize/get-an-app-submission.md - - name: Get the status of an app submission - href: ../monetize/get-status-for-an-app-submission.md - - name: Create an app submission - href: ../monetize/create-an-app-submission.md - - name: Commit an app submission - href: ../monetize/commit-an-app-submission.md - - name: Update an app submission - href: ../monetize/update-an-app-submission.md - - name: Delete an app submission - href: ../monetize/delete-an-app-submission.md - - name: Get rollout info for an app submission - href: ../monetize/get-package-rollout-info-for-an-app-submission.md - - name: Update the rollout percentage for an app submission - href: ../monetize/update-the-package-rollout-percentage-for-an-app-submission.md - - name: Halt the rollout for an app submission - href: ../monetize/halt-the-package-rollout-for-an-app-submission.md - - name: Finalize the rollout for an app submission - href: ../monetize/finalize-the-package-rollout-for-an-app-submission.md - - name: Manage add-ons - href: ../monetize/manage-add-ons.md - items: - - name: Get all add-ons - href: ../monetize/get-all-add-ons.md - - name: Get an add-on - href: ../monetize/get-an-add-on.md - - name: Create an add-on - href: ../monetize/create-an-add-on.md - - name: Delete an add-on - href: ../monetize/delete-an-add-on.md - - name: Manage add-on submissions - href: ../monetize/manage-add-on-submissions.md - items: - - name: Get an add-on submission - href: ../monetize/get-an-add-on-submission.md - - name: Get the status of an add-on submission - href: ../monetize/get-status-for-an-add-on-submission.md - - name: Create an add-on submission - href: ../monetize/create-an-add-on-submission.md - - name: Commit an add-on submission - href: ../monetize/commit-an-add-on-submission.md - - name: Update an add-on submission - href: ../monetize/update-an-add-on-submission.md - - name: Delete an add-on submission - href: ../monetize/delete-an-add-on-submission.md - - name: Manage package flights - href: ../monetize/manage-flights.md - items: - - name: Get a package flight - href: ../monetize/get-a-flight.md - - name: Create a package flight - href: ../monetize/create-a-flight.md - - name: Delete a package flight - href: ../monetize/delete-a-flight.md - - name: Manage package flight submissions - href: ../monetize/manage-flight-submissions.md - items: - - name: Get a package flight submission - href: ../monetize/get-a-flight-submission.md - - name: Get the status of a package flight submission - href: ../monetize/get-status-for-a-flight-submission.md - - name: Create a package flight submission - href: ../monetize/create-a-flight-submission.md - - name: Commit a package flight submission - href: ../monetize/commit-a-flight-submission.md - - name: Update a package flight submission - href: ../monetize/update-a-flight-submission.md - - name: Delete a package flight submission - href: ../monetize/delete-a-flight-submission.md - - name: Get rollout info for a flight submission - href: ../monetize/get-package-rollout-info-for-a-flight-submission.md - - name: Update the rollout percentage for a flight submission - href: ../monetize/update-the-package-rollout-percentage-for-a-flight-submission.md - - name: Halt the rollout for a flight submission - href: ../monetize/halt-the-package-rollout-for-a-flight-submission.md - - name: Finalize the rollout for a flight submission - href: ../monetize/finalize-the-package-rollout-for-a-flight-submission.md - - name: Code examples for the submission API - href: ../monetize/code-examples-for-the-windows-store-submission-api.md - items: - - name: "C# sample: submissions for apps, add-ons, and flights" - href: ../monetize/csharp-code-examples-for-the-windows-store-submission-api.md - - name: "C# sample: app submission with game options and trailers" - href: ../monetize/csharp-code-examples-for-submissions-game-options-and-trailers.md - - name: "Java sample: submissions for apps, add-ons, and flights" - href: ../monetize/java-code-examples-for-the-windows-store-submission-api.md - - name: "Java sample: app submission with game options and trailers" - href: ../monetize/java-code-examples-for-submissions-game-options-and-trailers.md - - name: "Python sample: submissions for apps, add-ons, and flights" - href: ../monetize/python-code-examples-for-the-windows-store-submission-api.md - - name: "Python sample: app submission with game options and trailers" - href: ../monetize/python-code-examples-for-submissions-game-options-and-trailers.md - - name: Manage targeted offers - href: ../monetize/manage-targeted-offers-using-windows-store-services.md - items: - - name: Get targeted offers - href: ../monetize/get-targeted-offers.md - - name: Manage product entitlements from a service - href: ../monetize/view-and-grant-products-from-a-service.md - items: - - name: Query for products - href: ../monetize/query-for-products.md - - name: Report consumable products as fulfilled - href: ../monetize/report-consumable-products-as-fulfilled.md - - name: Grant free products - href: ../monetize/grant-free-products.md - - name: Get subscriptions for a user - href: ../monetize/get-subscriptions-for-a-user.md - - name: Change the billing state of a subscription for a user - href: ../monetize/change-the-billing-state-of-a-subscription-for-a-user.md - - name: Renew a Microsoft Store ID key - href: ../monetize/renew-a-windows-store-id-key.md - - name: Send requests to the Store - href: ../monetize/send-requests-to-the-store.md - - name: Add retail demo (RDX) features - href: ../monetize/retail-demo-experience.md - - name: Simplify payments with the Payment Request API - href: ../monetize/index.md - - name: Packaging apps - items: - - name: Overview - href: ../packaging/index.md - - name: App capability declarations - href: ../packaging/app-capability-declarations.md - - name: Set up automated builds for your UWP app - href: ../packaging/auto-build-package-uwp-apps.md - - name: Install apps with the WinAppDeployCmd.exe tool - href: ../packaging/install-universal-windows-apps-with-the-winappdeploycmd-tool.md - - name: Download and install package updates from the Store - href: ../packaging/self-install-package-updates.md -- name: Platform - items: - - name: C++/WinRT - href: ../cpp-and-winrt-apis/index.md - items: - - name: Introduction - href: ../cpp-and-winrt-apis/intro-to-using-cpp-with-winrt.md - - name: Get started - href: ../cpp-and-winrt-apis/get-started.md - - name: What's new - href: ../cpp-and-winrt-apis/news.md - - name: Frequently-asked questions - href: ../cpp-and-winrt-apis/faq.yml - - name: Troubleshooting - href: ../cpp-and-winrt-apis/troubleshooting.md - - name: Photo Editor sample application - href: ../cpp-and-winrt-apis/photo-editor-sample.md - - name: String handling - href: ../cpp-and-winrt-apis/strings.md - - name: Standard C++ data types - href: ../cpp-and-winrt-apis/std-cpp-data-types.md - - name: Boxing and unboxing values to IInspectable - href: ../cpp-and-winrt-apis/boxing.md - - name: Consume APIs - href: ../cpp-and-winrt-apis/consume-apis.md - - name: Author APIs - href: ../cpp-and-winrt-apis/author-apis.md - - name: Error handling - href: ../cpp-and-winrt-apis/error-handling.md - - name: Handle events by using delegates - href: ../cpp-and-winrt-apis/handle-events.md - - name: Author events - href: ../cpp-and-winrt-apis/author-events.md - - name: Collections - href: ../cpp-and-winrt-apis/collections.md - - name: Concurrency and asynchronous operations - href: ../cpp-and-winrt-apis/concurrency.md - - name: Advanced concurrency and asynchrony - href: ../cpp-and-winrt-apis/concurrency-2.md - - name: A completion source sample - href: ../cpp-and-winrt-apis/concurrency-3.md - - name: XAML controls; bind to a property - href: ../cpp-and-winrt-apis/binding-property.md - - name: XAML items controls; bind to a collection - href: ../cpp-and-winrt-apis/binding-collection.md - - name: XAML custom (templated) controls - href: ../cpp-and-winrt-apis/xaml-cust-ctrl.md - - name: Passing parameters into the ABI boundary - href: ../cpp-and-winrt-apis/pass-parms-to-abi.md - - name: Consume COM components - href: ../cpp-and-winrt-apis/consume-com.md - - name: Author COM components - href: ../cpp-and-winrt-apis/author-coclasses.md - - name: Move to C++/WinRT from C++/CX - href: ../cpp-and-winrt-apis/move-to-winrt-from-cx.md - - name: Interop with C++/CX - href: ../cpp-and-winrt-apis/interop-winrt-cx.md - - name: Asynchrony, and interop with C++/CX - href: ../cpp-and-winrt-apis/interop-winrt-cx-async.md - - name: Move to C++/WinRT from WRL - href: ../cpp-and-winrt-apis/move-to-winrt-from-wrl.md - - name: Porting a sample app from C# - href: ../cpp-and-winrt-apis/clipboard-to-winrt-from-csharp.md - - name: Move to C++/WinRT from C# - href: ../cpp-and-winrt-apis/move-to-winrt-from-csharp.md - - name: Interop with the ABI - href: ../cpp-and-winrt-apis/interop-winrt-abi.md - - name: Strong and weak references - href: ../cpp-and-winrt-apis/weak-references.md - - name: Agile objects - href: ../cpp-and-winrt-apis/agile-objects.md - - name: Diagnosing direct allocations - href: ../cpp-and-winrt-apis/diag-direct-alloc.md - - name: Extension points for implementation types - href: ../cpp-and-winrt-apis/details-about-destructors.md - - name: A simple C++/WinRT WinUI example - href: ../cpp-and-winrt-apis/simple-winui-example.md - - name: Windows Runtime components (C++/WinRT) - href: ../winrt-components/create-a-windows-runtime-component-in-cppwinrt.md - - name: Use a C# component in a C++/WinRT app - href: ../cpp-and-winrt-apis/use-csharp-component-from-cpp-winrt.md - - name: Native debug visualization - href: ../cpp-and-winrt-apis/natvis.md - - name: Naming conventions - href: ../cpp-and-winrt-apis/naming.md - - name: C++ language - items: - - name: Value categories, and references - href: ../cpp-and-winrt-apis/cpp-value-categories.md - - name: .NET Native - items: - - name: Overview - href: ../dotnet-native/index.md - - name: .NET Native and compilation - href: ../dotnet-native/net-native-and-compilation.md - - name: Get started - href: ../dotnet-native/getting-started-with-net-native.md - items: - - name: "Example: Troubleshoot dynamic programming" - href: ../dotnet-native/example-troubleshooting-dynamic-programming.md - - name: "Example: Handle exceptions when binding data" - href: ../dotnet-native/example-handling-exceptions-when-binding-data.md - - name: Runtime exceptions - href: ../dotnet-native/runtime-exceptions-in-net-native-apps.md - - name: Measure startup improvement - href: ../dotnet-native/measuring-startup-improvement-with-net-native.md - - name: Reflection - items: - - name: Overview - href: ../dotnet-native/reflection-and-net-native.md - - name: APIs that rely on reflection - href: ../dotnet-native/apis-that-rely-on-reflection.md - - name: Reflection API reference - href: ../dotnet-native/net-native-reflection-api-reference.md - items: - - name: MissingInteropDataException class - href: ../dotnet-native/missinginteropdataexception-class-net-native.md - - name: MissingMetadataException class - href: ../dotnet-native/missingmetadataexception-class-net-native.md - - name: MissingRuntimeArtifactException class - href: ../dotnet-native/missingruntimeartifactexception-class-net-native.md - - name: Runtime directives config file reference - href: ../dotnet-native/runtime-directives-rd-xml-configuration-file-reference.md - items: - - name: Runtime directive elements - href: ../dotnet-native/runtime-directive-elements.md - items: - - name: Application element - href: ../dotnet-native/application-element-net-native.md - - name: Assembly element - href: ../dotnet-native/assembly-element-net-native.md - - name: AttributeImplies element - href: ../dotnet-native/attributeimplies-element-net-native.md - - name: Directives element - href: ../dotnet-native/directives-element-net-native.md - - name: Event element - href: ../dotnet-native/event-element-net-native.md - - name: Field element - href: ../dotnet-native/field-element-net-native.md - - name: GenericParameter element - href: ../dotnet-native/genericparameter-element-net-native.md - - name: ImpliesType element - href: ../dotnet-native/impliestype-element-net-native.md - - name: Library element - href: ../dotnet-native/library-element-net-native.md - - name: Method element - href: ../dotnet-native/method-element-net-native.md - - name: MethodInstantiation element - href: ../dotnet-native/methodinstantiation-element-net-native.md - - name: Namespace element - href: ../dotnet-native/namespace-element-net-native.md - - name: Parameter element - href: ../dotnet-native/parameter-element-net-native.md - - name: Property element - href: ../dotnet-native/property-element-net-native.md - - name: Subtypes element - href: ../dotnet-native/subtypes-element-net-native.md - - name: Type element - href: ../dotnet-native/type-element-net-native.md - - name: TypeInstantiation element - href: ../dotnet-native/typeinstantiation-element-net-native.md - - name: TypeParameter element - href: ../dotnet-native/typeparameter-element-net-native.md - - name: Policy settings - href: ../dotnet-native/runtime-directive-policy-settings.md - - name: Serialization and metadata - href: ../dotnet-native/serialization-and-metadata.md - - name: Migrate a Windows 8.x App to .NET Native - href: ../dotnet-native/migrating-your-windows-store-app-to-net-native.md - - name: Troubleshoot - href: ../dotnet-native/net-native-general-troubleshooting.md - - name: Security - href: ../security/index.md - items: - - name: Intro to secure Windows app development - href: ../security/intro-to-secure-windows-app-development.md - - name: Authentication and user identity - href: ../security/authentication-and-user-identity.md - items: - - name: Credential locker - href: ../security/credential-locker.md - - name: Fingerprint biometrics - href: ../security/fingerprint-biometrics.md - - name: Windows Hello - href: ../security/microsoft-passport.md - items: - - name: Create a Windows Hello login app - href: ../security/microsoft-passport-login.md - - name: Create a Windows Hello login service - href: ../security/microsoft-passport-login-auth-service.md - - name: Smart cards - href: ../security/smart-cards.md - - name: Shared certificates - href: ../security/share-certificates.md - - name: Web Account Manager - href: ../security/web-account-manager.md - - name: Unlock with companion IoT devices - href: ../security/companion-device-unlock.md - - name: Web authentication broker - href: ../security/web-authentication-broker.md - - name: Cryptography - href: ../security/cryptography.md - items: - - name: Certificates - href: ../security/certificates.md - - name: Cryptographic keys - href: ../security/cryptographic-keys.md - - name: Data protection - href: ../security/data-protection.md - - name: MACs, hashes, and signatures - href: ../security/macs-hashes-and-signatures.md - - name: Export restrictions on cryptography - href: ../security/export-restrictions-on-cryptography.md - - name: Common cryptography tasks - href: ../security/common-cryptography-tasks.md - items: - - name: Create random numbers - href: ../security/create-random-numbers.md - - name: Compare buffers - href: ../security/compare-buffers.md - - name: Convert between strings and binary data - href: ../security/convert-between-strings-and-binary-data.md - - name: Copy to and from byte arrays - href: ../security/copy-to-and-from-byte-arrays.md - - name: Encode and decode data - href: ../security/encode-and-decode-data.md - - name: Visual layer - href: ../composition/visual-layer.md - items: - - name: Composition visual - href: ../composition/composition-visual-tree.md - - name: Composition animations - href: ../composition/composition-animation.md - items: - - name: Time animations - href: ../composition/time-animations.md - - name: Relation animations - href: ../composition/relation-animations.md - - name: Natural animations - href: ../composition/natural-animations.md - items: - - name: Spring animations - href: ../composition/spring-animations.md - - name: Input-driven animations - href: ../composition/input-driven-animations.md - items: - - name: Scroll-based animations - href: ../composition/scroll-input-animations.md - - name: Pointer-based animations - href: ../composition/pointer-input-animations.md - - name: Custom manipulations - href: ../composition/interaction-tracker-manipulations.md - items: - - name: Snap points - href: ../composition/inertia-modifiers.md - - name: Pull-to-refresh - href: ../composition/source-modifiers.md - - name: Composition effects - href: ../composition/composition-effects.md - items: - - name: Composition shadows - href: ../composition/composition-shadows.md - - name: Composition lighting - href: ../composition/composition-lighting.md - - name: Composition brushes - href: ../composition/composition-brushes.md - - name: Composition native interoperation - href: ../composition/composition-native-interop.md - - name: Tailoring your UI - href: ../composition/composition-tailoring.md - - name: Using UWP XAML - href: ../composition/using-the-visual-layer-with-xaml.md - items: - - name: XAML lighting - href: ../composition/xaml-lighting.md - - name: Windows as a service - href: ../updates-and-versions/application-development-for-windows-as-a-service.md - - name: Windows Runtime components - href: ../winrt-components/index.md - items: - - name: Windows Runtime components with C++/WinRT - href: ../winrt-components/create-a-windows-runtime-component-in-cppwinrt.md - - name: Windows Runtime components with C++/CX - href: ../winrt-components/creating-windows-runtime-components-in-cpp.md - - name: Walkthrough of a C++/CX Windows Runtime component - href: ../winrt-components/walkthrough-creating-a-basic-windows-runtime-component-in-cpp-and-calling-it-from-javascript-or-csharp.md - - name: Windows Runtime components with C# and Visual Basic - href: ../winrt-components/creating-windows-runtime-components-in-csharp-and-visual-basic.md - items: - - name: Custom events and event accessors in Windows Runtime components - href: ../winrt-components/custom-events-and-event-accessors-in-windows-runtime-components.md - - name: Passing arrays to a Windows Runtime component - href: ../winrt-components/passing-arrays-to-a-windows-runtime-component.md - - name: Diagnosing Windows Runtime component error conditions - href: ../winrt-components/diagnosing-windows-runtime-component-error-conditions.md - - name: Distributing a managed Windows Runtime component - href: ../winrt-components/distributing-a-managed-windows-runtime-component.md - - name: .NET mappings of Windows Runtime types - href: ../winrt-components/net-framework-mappings-of-windows-runtime-types.md - - name: Walkthrough of a C# or Visual Basic Windows Runtime component - href: ../winrt-components/walkthrough-creating-a-simple-windows-runtime-component-and-calling-it-from-javascript.md - - name: Raising events in Windows Runtime components - href: ../winrt-components/raising-events-in-windows-runtime-components.md - - name: Brokered Windows Runtime components for side-loaded UWP apps - href: ../winrt-components/brokered-windows-runtime-components-for-side-loaded-windows-store-apps.md - - name: XAML platform - href: ../xaml-platform/index.md - items: - - name: XAML overview - href: ../xaml-platform/xaml-overview.md - items: - - name: XAML syntax guide - href: ../xaml-platform/xaml-syntax-guide.md - items: - - name: Property-path syntax - href: ../xaml-platform/property-path-syntax.md - - name: Move and draw commands syntax - href: ../xaml-platform/move-draw-commands-syntax.md - - name: XAML and whitespace - href: ../xaml-platform/xaml-and-whitespace.md - - name: XAML namescopes - href: ../xaml-platform/xaml-namescopes.md - - name: XAML namespaces and namespace mapping - href: ../xaml-platform/xaml-namespaces-and-namespace-mapping.md - - name: Template settings classes - href: ../xaml-platform/template-settings-classes.md - - name: "x:Class attribute" - href: ../xaml-platform/x-class-attribute.md - - name: "x:DefaultBindMode attribute" - href: ../xaml-platform/x-defaultbindmode-attribute.md - - name: "x:DeferLoadStrategy attribute" - href: ../xaml-platform/x-deferloadstrategy-attribute.md - - name: "x:FieldModifier attribute" - href: ../xaml-platform/x-fieldmodifier-attribute.md - - name: "x:Key attribute" - href: ../xaml-platform/x-key-attribute.md - - name: "x:Load attribute" - href: ../xaml-platform/x-load-attribute.md - - name: "x:Name attribute" - href: ../xaml-platform/x-name-attribute.md - - name: "x:Phase attribute" - href: ../xaml-platform/x-phase-attribute.md - - name: "x:Uid directive" - href: ../xaml-platform/x-uid-directive.md - - name: "{x:Bind} markup extension" - href: ../xaml-platform/x-bind-markup-extension.md - - name: "{Binding} markup extension" - href: ../xaml-platform/binding-markup-extension.md - - name: "{x:Null} markup extension" - href: ../xaml-platform/x-null-markup-extension.md - - name: XAML intrinsic data types - href: ../xaml-platform/xaml-intrinsic-data-types.md - - name: "{CustomResource} markup extension" - href: ../xaml-platform/customresource-markup-extension.md - - name: "{RelativeSource} markup extension" - href: ../xaml-platform/relativesource-markup-extension.md - - name: "{StaticResource} markup extension" - href: ../xaml-platform/staticresource-markup-extension.md - - name: "{TemplateBinding} markup extension" - href: ../xaml-platform/templatebinding-markup-extension.md - - name: "{ThemeResource} markup extension" - href: ../xaml-platform/themeresource-markup-extension.md - - name: Dependency properties overview - href: ../xaml-platform/dependency-properties-overview.md - - name: Custom dependency properties - href: ../xaml-platform/custom-dependency-properties.md - - name: Attached properties overview - href: ../xaml-platform/attached-properties-overview.md - - name: Custom attached properties - href: ../xaml-platform/custom-attached-properties.md - - name: Events and routed events overview - href: ../xaml-platform/events-and-routed-events-overview.md -- name: People and places - items: - - name: Contacts, My People, and calendar - href: ../contacts-and-calendar/index.md - items: - - name: My People - href: ../contacts-and-calendar/my-people-support.md - items: - - name: My People sharing - href: ../contacts-and-calendar/my-people-sharing.md - - name: My People notifications - href: ../contacts-and-calendar/my-people-notifications.md - - name: Select contacts - href: ../contacts-and-calendar/selecting-contacts.md - - name: Send email - href: ../contacts-and-calendar/sending-email.md - - name: Send an SMS message - href: ../contacts-and-calendar/sending-an-sms-message.md - - name: Manage appointments - href: ../contacts-and-calendar/managing-appointments.md - - name: Connect your app to actions on a contact card - href: ../contacts-and-calendar/integrating-with-contacts.md - - name: Maps and location - href: ../maps-and-location/index.md - items: - - name: Request authentication key - href: ../maps-and-location/authentication-key.md - - name: Display maps - href: ../maps-and-location/display-maps.md - - name: Display points of interest - href: ../maps-and-location/display-poi.md - - name: Display routes and directions - href: ../maps-and-location/routes-and-directions.md - - name: Overlay tiled images - href: ../maps-and-location/overlay-tiled-images.md - - name: Perform geocoding - href: ../maps-and-location/geocoding.md - - name: Get current location - href: ../maps-and-location/get-location.md - - name: Design guidance for location-aware apps - href: ../maps-and-location/guidelines-and-checklist-for-detecting-location.md - - name: Guidelines for using Visits tracking - href: ../maps-and-location/guidelines-for-visits.md - - name: Set up a geofence - href: ../maps-and-location/set-up-a-geofence.md - - name: Design guidance for geofencing - href: ../maps-and-location/guidelines-for-geofencing.md - - name: Map style sheet reference - href: ../maps-and-location/elements-of-map-style-sheet.md -- name: Peripherals, sensors, and power - href: ../devices-sensors/index.md - items: - - name: Enable device capabilities - href: ../devices-sensors/enable-device-capabilities.md - - name: Enable usermode access - href: ../devices-sensors/enable-usermode-access.md - - name: Enumerate devices - href: ../devices-sensors/enumerate-devices.md - items: - - name: Build a device selector - href: ../devices-sensors/build-a-device-selector.md - - name: Enumerate devices over a network - href: ../devices-sensors/enumerate-devices-over-a-network.md - - name: Device information properties - href: ../devices-sensors/device-information-properties.md - - name: AEP service class IDs - href: ../devices-sensors/aep-service-class-ids.md - - name: Pair devices - href: ../devices-sensors/pair-devices.md - - name: Point of Service - href: ../devices-sensors/point-of-service.md - items: - - name: Basics - href: ../devices-sensors/pos-basics.md - items: - - name: Capability declaration - href: ../devices-sensors/pos-basics-capability.md - - name: Enumerating devices - href: ../devices-sensors/pos-basics-enumerating.md - - name: Creating a device object - href: ../devices-sensors/pos-basics-deviceobject.md - - name: Claiming and enable - href: ../devices-sensors/pos-basics-claim.md - - name: Sharing peripherals with others - href: ../devices-sensors/pos-basics-sharing.md - - name: Getting started - href: ../devices-sensors/pos-get-started.md - - name: Hardware support - href: ../devices-sensors/pos-device-support.md - - name: Barcode scanner - href: ../devices-sensors/pos-barcodescanner.md - items: - - name: Configure a barcode scanner - href: ../devices-sensors/pos-barcodescanner-configure.md - - name: Use a software trigger - href: ../devices-sensors/pos-barcodescanner-software-trigger.md - - name: Working with symbologies - href: ../devices-sensors/pos-barcodescanner-symbologies.md - - name: Obtain and understand barcode data - href: ../devices-sensors/pos-barcodescanner-scan-data.md - - name: Camera barcode scanner - href: ../devices-sensors/pos-camerabarcode.md - items: - - name: System requirements - href: ../devices-sensors/pos-camerabarcode-system-requirements.md - - name: Getting started - href: ../devices-sensors/pos-camerabarcode-get-started.md - - name: Hosting a camera preview - href: ../devices-sensors/pos-camerabarcode-hosting-preview.md - - name: Enable/disable camera barcode scanner - href: ../devices-sensors/pos-camerabarcode-enable-disable.md - - name: Supported symbologies - href: ../devices-sensors/pos-camerabarcode-symbologies.md - - name: Magnetic stripe reader - href: ../devices-sensors/pos-magnetic-stripe-reader.md - items: - - name: Obtain and understand magnetic stripe data - href: ../devices-sensors/pos-magnetic-stripe-reader-data.md - - name: POSPrinter - href: ../devices-sensors/pos-printer.md - items: - - name: Epson ESC/POS with formatting - href: ../devices-sensors/epson-esc-pos-with-formatting.md - - name: Sensors - href: ../devices-sensors/sensors.md - items: - - name: Calibrate sensors - href: ../devices-sensors/calibrate-sensors.md - - name: Sensor orientation - href: ../devices-sensors/sensor-orientation.md - - name: Use the accelerometer - href: ../devices-sensors/use-the-accelerometer.md - - name: Use the compass - href: ../devices-sensors/use-the-compass.md - - name: Use the gyrometer - href: ../devices-sensors/use-the-gyrometer.md - - name: Use the inclinometer - href: ../devices-sensors/use-the-inclinometer.md - - name: Use the light sensor - href: ../devices-sensors/use-the-light-sensor.md - - name: Use the orientation sensor - href: ../devices-sensors/use-the-orientation-sensor.md - - name: Bluetooth - href: ../devices-sensors/bluetooth.md - items: - - name: RFCOMM - href: ../devices-sensors/send-or-receive-files-with-rfcomm.md - - name: Bluetooth Low Energy - href: ../devices-sensors/bluetooth-low-energy-overview.md - items: - - name: GATT client - href: ../devices-sensors/gatt-client.md - - name: GATT server - href: ../devices-sensors//gatt-server.md - - name: Advertisements - href: ../devices-sensors/ble-beacon.md - - name: Bluetooth developer FAQ - href: ../devices-sensors/bluetooth-dev-faq.yml - - name: Printing and scanning - href: ../devices-sensors/printing-and-scanning.md - items: - - name: Print from your app - href: ../devices-sensors/print-from-your-app.md - - name: Customize the print preview UI - href: ../devices-sensors/customize-the-print-preview-ui.md - - name: Customize the print workflow - href: ../devices-sensors/print-workflow-customize.md - - name: Scan from your app - href: ../devices-sensors/scan-from-your-app.md - - name: 3D printing - href: ../devices-sensors/3d-printing.md - items: - - name: 3D printing from your app - href: ../devices-sensors/3d-print-from-app.md - - name: Generate a 3MF package - href: ../devices-sensors/generate-3mf.md - - name: NFC - href: ../devices-sensors/nfc.md - items: - - name: Create an NFC Smart Card app - href: ../devices-sensors/host-card-emulation.md - - name: Get battery information - href: ../devices-sensors/get-battery-info.md -- name: Porting apps - items: - - name: Overview - href: ../porting/index.md - - name: Move from desktop to UWP - href: ../porting/desktop-to-uwp-migrate.md - - name: Move from Windows Runtime 8.x to UWP - href: ../porting/w8x-to-uwp-root.md - items: - - name: Porting the project - href: ../porting/w8x-to-uwp-porting-to-a-uwp-project.md - - name: Troubleshooting - href: ../porting/w8x-to-uwp-troubleshooting.md - - name: Porting XAML and UI - href: ../porting/w8x-to-uwp-porting-xaml-and-ui.md - - name: Porting for I/O, device, and app model - href: ../porting/w8x-to-uwp-input-and-sensors.md - - name: "Case study: Bookstore1" - href: ../porting/w8x-to-uwp-case-study-bookstore1.md - - name: "Case study: Bookstore2" - href: ../porting/w8x-to-uwp-case-study-bookstore2.md - - name: "Case study: QuizGame" - href: ../porting/w8x-to-uwp-case-study-quizgame.md - - name: Windows apps concept mapping for Android and iOS developers - href: ../porting/android-ios-uwp-map.md - - name: Move from iOS to UWP - href: ../porting/ios-to-uwp-root.md - items: - - name: Selecting an approach to iOS and UWP app development - href: ../porting/selecting-an-approach-to-ios-and-uwp-app-development.md - - name: Getting started with UWP for iOS developers - href: ../porting/getting-started-with-uwp-for-ios-developers.md - items: - - name: "Getting started: Creating a project" - href: ../porting/getting-started-creating-a-project.md - - name: "Getting started: Choosing a programming language" - href: ../porting/getting-started-choosing-a-programming-language.md - - name: "Getting started: Getting around in Visual Studio" - href: ../porting/getting-started-getting-around-in-visual-studio.md - - name: "Getting started: Common controls" - href: ../porting/getting-started-common-controls.md - - name: "Getting started: Navigation" - href: ../porting/getting-started-navigation.md - - name: "Getting started: Animation" - href: ../porting/getting-started-animation.md - - name: "Getting started: What next?" - href: ../porting/getting-started-what-next.md - - name: Setting up your Mac with Windows - href: ../porting/setting-up-your-mac-with-windows-10.md - - name: Move from Windows Phone Silverlight to UWP - href: ../porting/wpsl-to-uwp-root.md - items: - - name: Namespace and class mappings - href: ../porting/wpsl-to-uwp-namespace-and-class-mappings.md - - name: Porting the project - href: ../porting/wpsl-to-uwp-porting-to-a-uwp-project.md - - name: Troubleshooting - href: ../porting/wpsl-to-uwp-troubleshooting.md - - name: Porting XAML and UI - href: ../porting/wpsl-to-uwp-porting-xaml-and-ui.md - - name: Porting for I/O, device, and app model - href: ../porting/wpsl-to-uwp-input-and-sensors.md - - name: Porting business and data layers - href: ../porting/wpsl-to-uwp-business-and-data.md - - name: Porting for form factor and UX - href: ../porting/wpsl-to-uwp-form-factors-and-ux.md - - name: "Case study: Bookstore1" - href: ../porting/wpsl-to-uwp-case-study-bookstore1.md - - name: "Case study: Bookstore2" - href: ../porting/wpsl-to-uwp-case-study-bookstore2.md - - name: Convert your web app to a PWA on Windows - href: /microsoft-edge/progressive-web-apps - items: - - name: Package Windows 7 app as a PWA - href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-windows7.html - - name: Package iOS app as a PWA - href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-ios.html - - name: Package Android app as a PWA - href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-android.html - - name: Package MacOS app as a PWA - href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-mac.html - - name: Windows on ARM - href: ../porting/apps-on-arm.md - items: - - name: ARM64EC for Windows 11 apps on ARM - href: ../porting/arm64ec.md - - name: How x86 emulation works on ARM - href: ../porting/apps-on-arm-x86-emulation.md - - name: Troubleshooting desktop x86 apps - href: ../porting/apps-on-arm-troubleshooting-x86.md - - name: Troubleshooting UWP ARM apps - href: ../porting/apps-on-arm-troubleshooting-arm32.md - - name: Program Compatibility Troubleshooter on ARM - href: ../porting/apps-on-arm-program-compat-troubleshooter.md -- name: Processes and threading - items: - - name: Launching, resuming, and background tasks - href: ../launch-resume/index.md - items: - - name: Create a Universal Windows Platform console app - href: ../launch-resume/console-uwp.md - - name: Create a Multi-instance UWP app - href: ../launch-resume/multi-instance-uwp.md - - name: App lifecycle - href: ../launch-resume/app-lifecycle.md - items: - - name: Handle app prelaunch - href: ../launch-resume/handle-app-prelaunch.md - - name: Handle app activation - href: ../launch-resume/activate-an-app.md - - name: Handle app suspend - href: ../launch-resume/suspend-an-app.md - - name: Handle app resume - href: ../launch-resume/resume-an-app.md - - name: Free memory when your app moves to the background - href: ../launch-resume/reduce-memory-usage.md - - name: Postpone app suspension with extended execution - href: ../launch-resume/run-minimized-with-extended-execution.md - - name: Launch an app with a URI - href: ../launch-resume/launch-app-with-uri.md - items: - - name: Launch the default app for a URI - href: ../launch-resume/launch-default-app.md - - name: Handle URI activation - href: ../launch-resume/handle-uri-activation.md - - name: Launch an app for results - href: ../launch-resume/how-to-launch-an-app-for-results.md - - name: Choose and save tones using the ms-tonepicker URI scheme - href: ../launch-resume/launch-ringtone-picker.md - - name: Launch the Windows Settings app - href: ../launch-resume/launch-settings-app.md - - name: Launch the Microsoft Store app - href: ../launch-resume/launch-store-app.md - - name: Launch the Windows Maps app - href: ../launch-resume/launch-maps-app.md - - name: Launch the People app - href: ../launch-resume/launch-people-apps.md - - name: Launch screen snipping - href: ../launch-resume/launch-screen-snipping.md - - name: Support web-to-app linking with app URI handlers - href: ../launch-resume/web-to-app-linking.md - - name: Launch an app through file activation - href: ../launch-resume/launch-app-from-file.md - items: - - name: Launch the default app for a file - href: ../launch-resume/launch-the-default-app-for-a-file.md - - name: Handle file activation - href: ../launch-resume/handle-file-activation.md - - name: Auto-launching with AutoPlay - href: ../launch-resume/auto-launching-with-autoplay.md - - name: Reserved file and URI scheme names - href: ../launch-resume/reserved-uri-scheme-names.md - - name: Use app services and extensions - href: ../launch-resume/app-services.md - items: - - name: Create and consume an app service - href: ../launch-resume/how-to-create-and-consume-an-app-service.md - - name: Convert an app service to run in the same process as its host app - href: ../launch-resume/convert-app-service-in-process.md - - name: Extend your app with services, extensions, and packages - href: ../launch-resume/extend-your-app-with-services-extensions-packages.md - - name: Create and host an app extension - href: ../launch-resume/how-to-create-an-extension.md - - name: Create hosted apps - href: ../launch-resume/hosted-apps.md - - name: Support your app with background tasks - href: ../launch-resume/support-your-app-with-background-tasks.md - items: - - name: Guidelines for background tasks - href: ../launch-resume/guidelines-for-background-tasks.md - - name: Access sensors and devices from a background task - href: ../launch-resume/access-sensors-and-devices-from-a-background-task.md - - name: Create and register an in-process background task - href: ../launch-resume/create-and-register-an-inproc-background-task.md - - name: Create and register an out-of-process background task - href: ../launch-resume/create-and-register-a-background-task.md - - name: Create and register a winmain COM background task - href: ../launch-resume/create-and-register-a-winmain-background-task.md - - name: Port an out-of-process background task to an in-process background task - href: ../launch-resume/convert-out-of-process-background-task.md - - name: Debug a background task - href: ../launch-resume/debug-a-background-task.md - - name: Declare background tasks in the application manifest - href: ../launch-resume/declare-background-tasks-in-the-application-manifest.md - - name: Group background task registration - href: ../launch-resume/group-background-tasks.md - - name: Handle a cancelled background task - href: ../launch-resume/handle-a-cancelled-background-task.md - - name: Monitor background task progress and completion - href: ../launch-resume/monitor-background-task-progress-and-completion.md - - name: Register a background task - href: ../launch-resume/register-a-background-task.md - - name: Respond to system events with background tasks - href: ../launch-resume/respond-to-system-events-with-background-tasks.md - - name: Run a background task on a timer - href: ../launch-resume/run-a-background-task-on-a-timer-.md - - name: Run a background task when your UWP app is updated - href: ../launch-resume/run-a-background-task-during-updatetask.md - - name: Run in the background indefinitely - href: ../launch-resume/run-in-the-background-indefinetly.md - - name: Set conditions for running a background task - href: ../launch-resume/set-conditions-for-running-a-background-task.md - - name: Trigger a background task from your app - href: ../launch-resume/trigger-background-task-from-app.md - - name: Update a live tile from a background task - href: ../launch-resume/update-a-live-tile-from-a-background-task.md - - name: Use a maintenance trigger - href: ../launch-resume/use-a-maintenance-trigger.md - - name: Connected apps and devices (Project Rome) - href: ../launch-resume/connected-apps-and-devices.md - items: - - name: Discover remote devices - href: ../launch-resume/discover-remote-devices.md - - name: Launch an app on a remote device - href: ../launch-resume/launch-a-remote-app.md - - name: Communicate with a remote app service - href: ../launch-resume/communicate-with-a-remote-app-service.md - - name: Connect devices through remote sessions - href: ../launch-resume/remote-sessions.md - - name: Continue user activity, even across devices - href: ../launch-resume/useractivities.md - - name: User Activities best practices - href: ../launch-resume/useractivities-best-practices.md - - name: Splash screens - href: ../launch-resume/splash-screens.md - items: - - name: Add a splash screen - href: ../launch-resume/add-a-splash-screen.md - - name: Display a splash screen for more time - href: ../launch-resume/create-a-customized-splash-screen.md - - name: Threading and async programming - href: ../threading-async/index.md - items: - - name: Asynchronous programming (UWP apps) - href: ../threading-async/asynchronous-programming-universal-windows-platform-apps.md - - name: Asynchronous programming in C++/CX (UWP apps) - href: ../threading-async/asynchronous-programming-in-cpp-universal-windows-platform-apps.md - - name: Best practices for using the thread pool - href: ../threading-async/best-practices-for-using-the-thread-pool.md - - name: Call asynchronous APIs in C# or Visual Basic - href: ../threading-async/call-asynchronous-apis-in-csharp-or-visual-basic.md - - name: Create a periodic work item - href: ../threading-async/create-a-periodic-work-item.md - - name: Submit a work item to the thread pool - href: ../threading-async/submit-a-work-item-to-the-thread-pool.md - - name: Use a timer to submit a work item - href: ../threading-async/use-a-timer-to-submit-a-work-item.md - - name: Using Windows Runtime objects in a multithreaded environment - href: ../threading-async/using-windows-runtime-objects-in-a-multithreaded-environment.md +- name: Overview + href: index.md +- name: App types + items: + - name: Education apps + href: ../apps-for-education/index.md + items: + - name: Take a Test API + href: ../apps-for-education/take-a-test-api.md + - name: Enterprise apps + href: ../enterprise/index.md + items: + - name: Windows Information Protection (WIP) + href: ../enterprise/wip-hub.md + items: + - name: WIP developer guide + href: ../enterprise/wip-dev-guide.md + - name: Enterprise shared storage + href: ../enterprise/enterprise-shared-storage.md + - name: "Tutorial: Create a customer database application" + href: ../enterprise/customer-database-tutorial.md + items: + - name: Customer database tutorial app structure + href: ../enterprise/customer-database-app-structure.md + - name: Progressive Web Apps + href: /microsoft-edge/progressive-web-apps +- name: Audio, video, and camera + href: ../audio-video-camera/index.md + items: + - name: Camera + href: ../audio-video-camera/camera.md + items: + - name: Capture photos and video with Windows built-in camera UI + href: ../audio-video-camera/capture-photos-and-video-with-cameracaptureui.md + - name: Display the camera preview + href: ../audio-video-camera/simple-camera-preview-access.md + - name: Basic photo, video, and audio capture with MediaCapture + href: ../audio-video-camera/basic-photo-video-and-audio-capture-with-MediaCapture.md + - name: Camera UI features for mobile devices + href: ../audio-video-camera/camera-ui-features-for-mobile-devices.md + - name: Handle device and screen orientation with MediaCapture + href: ../audio-video-camera/handle-device-orientation-with-mediacapture.md + - name: Discover and select camera capabilities with camera profiles + href: ../audio-video-camera/camera-profiles.md + - name: Set format, resolution, and frame rate for MediaCapture + href: ../audio-video-camera/set-media-encoding-properties.md + - name: HDR and low-light photo capture + href: ../audio-video-camera/high-dynamic-range-hdr-photo-capture.md + - name: Manual camera controls for photo and video capture + href: ../audio-video-camera/capture-device-controls-for-photo-and-video-capture.md + - name: Manual camera controls for video capture + href: ../audio-video-camera/capture-device-controls-for-video-capture.md + - name: Video stabilization effect for video capture + href: ../audio-video-camera/effects-for-video-capture.md + - name: Scene analysis for MediaCapture + href: ../audio-video-camera/scene-analysis-for-media-capture.md + - name: Capture a photo sequence with VariablePhotoSequence + href: ../audio-video-camera/variable-photo-sequence.md + - name: Process media frames with MediaFrameReader + href: ../audio-video-camera/process-media-frames-with-mediaframereader.md + items: + - name: Process audio frames with MediaFrameReader + href: ../audio-video-camera/process-audio-frames-with-mediaframereader.md + - name: Use OpenCV with MediaFrameReader + href: ../audio-video-camera/use-opencv-with-mediaframereader.md + - name: Capture from multiple sources using MediaFrameSourceGroup + href: ../audio-video-camera/capture-from-multiple-sources-simultaneously.md + - name: Connect to remote cameras + href: ../audio-video-camera/connect-to-remote-cameras.md + - name: Get a preview frame + href: ../audio-video-camera/get-a-preview-frame.md + - name: Media playback + href: ../audio-video-camera/media-playback.md + items: + - name: Play audio and video with MediaPlayer + href: ../audio-video-camera/play-audio-and-video-with-mediaplayer.md + - name: Media items, playlists, and tracks + href: ../audio-video-camera/media-playback-with-mediasource.md + - name: Integrate with the System Media Transport Controls + href: ../audio-video-camera/integrate-with-systemmediatransportcontrols.md + items: + - name: Manual control of the System Media Transport Controls + href: ../audio-video-camera/system-media-transport-controls.md + - name: System-supported timed metadata cues + href: ../audio-video-camera/system-supported-metadata-cues.md + - name: Create, schedule, and manage media breaks + href: ../audio-video-camera/create-schedule-and-manage-media-breaks.md + - name: Play media in the background + href: ../audio-video-camera/background-audio.md + items: + - name: Legacy background media playback + href: ../audio-video-camera/legacy-background-media-playback.md + - name: Adaptive streaming + href: ../audio-video-camera/adaptive-streaming.md + items: + - name: HLS tag support + href: ../audio-video-camera/hls-tag-support.md + - name: DASH profile support + href: ../audio-video-camera/dash-profile-support.md + - name: Media casting + href: ../audio-video-camera/media-casting.md + - name: Enable audio playback from remote Bluetooth-connected devices + href: ../audio-video-camera/enable-remote-audio-playback.md + - name: PlayReady DRM + href: ../audio-video-camera/playready-client-sdk.md + items: + - name: Hardware DRM + href: ../audio-video-camera/hardware-drm.md + - name: Adaptive streaming with PlayReady + href: ../audio-video-camera/adaptive-streaming-with-playready.md + - name: PlayReady Encrypted Media Extension + href: ../audio-video-camera/playready-encrypted-media-extension.md + - name: Detect faces in images or videos + href: ../audio-video-camera/detect-and-track-faces-in-an-image.md + - name: Custom video effects + href: ../audio-video-camera/custom-video-effects.md + - name: Custom audio effects + href: ../audio-video-camera/custom-audio-effects.md + - name: Media compositions and editing + href: ../audio-video-camera/media-compositions-and-editing.md + - name: Audio device information properties + href: ../audio-video-camera/audio-device-information-properties.md + - name: Detect and respond to audio state changes + href: ../audio-video-camera/detect-and-respond-to-audio-state-changes.md + - name: Create, edit, and save bitmap images + href: ../audio-video-camera/imaging.md + items: + - name: Process bitmaps with OpenCV + href: ../audio-video-camera/process-software-bitmaps-with-opencv.md + - name: Process bitmaps with the LowLightFusion API + href: ../audio-video-camera/process-bitmaps-low-light-fusion.md + - name: BitmapEncoder options reference + href: ../audio-video-camera/bitmapencoder-options-reference.md + - name: Image metadata + href: ../audio-video-camera/image-metadata.md + - name: Transcode media files + href: ../audio-video-camera/transcode-media-files.md + - name: Process media files in the background + href: ../audio-video-camera/process-media-files-in-the-background.md + - name: Audio graphs + href: ../audio-video-camera/audio-graphs.md + - name: MIDI + href: ../audio-video-camera/midi.md + - name: Import media from a device + href: ../audio-video-camera/import-media-from-a-device.md + - name: Camera-independent Flashlight + href: ../audio-video-camera/camera-independent-flashlight.md + - name: Supported codecs + href: ../audio-video-camera/supported-codecs.md + - name: Query for installed codecs + href: ../audio-video-camera/codec-query.md + - name: Screen capture + href: ../audio-video-camera/screen-capture.md + - name: Screen capture to video + href: ../audio-video-camera/screen-capture-video.md +- name: Communication + items: + - name: App-to-app communication + href: ../app-to-app/index.md + items: + - name: Share data + href: ../app-to-app/share-data.md + - name: Receive data + href: ../app-to-app/receive-data.md + - name: Copy and paste + href: ../app-to-app/copy-and-paste.md + - name: Interprocess communication (IPC) + href: ../communication/interprocess-communication.md + - name: Networking and web services + href: ../networking/index.md + items: + - name: Networking basics + href: ../networking/networking-basics.md + - name: Which networking technology? + href: ../networking/which-networking-technology.md + - name: Network communications in the background + href: ../networking/network-communications-in-the-background.md + - name: Sockets + href: ../networking/sockets.md + - name: WebSockets + href: ../networking/websockets.md + - name: HttpClient + href: ../networking/httpclient.md + - name: RSS/Atom feeds + href: ../networking/web-feeds.md + - name: Background transfers + href: ../networking/background-transfers.md + - name: Sharing named objects + href: ../communication/sharing-named-objects.md +- name: Data and files + items: + - name: App resources + href: ../app-resources/index.md + items: + - name: Resource Management System + href: ../app-resources/resource-management-system.md + - name: How the RMS matches and chooses resources + href: ../app-resources/how-rms-matches-and-chooses-resources.md + - name: How the RMS matches language tags + href: ../app-resources/how-rms-matches-lang-tags.md + - name: Tailor your resources for language, scale, contrast, others + href: ../app-resources/tailor-resources-lang-scale-contrast.md + - name: Localize strings in your UI and app package manifest + href: ../app-resources/localize-strings-ui-manifest.md + - name: Load images, assets tailored for scale, theme, contrast, others + href: ../app-resources/images-tailored-for-scale-theme-contrast.md + - name: URI schemes + href: ../app-resources/uri-schemes.md + - name: Specify the default resources that your app uses + href: ../app-resources/specify-default-resources-installed.md + - name: Build resources into your app package, instead of into a resource pack + href: ../app-resources/build-resources-into-app-package.md + - name: PRI APIs and custom build systems + href: ../app-resources/pri-apis-custom-build-systems.md + items: + - name: Scenario 1 (PRI APIs) + href: ../app-resources/pri-apis-scenario-1.md + - name: Compile resources manually with MakePri.exe + href: ../app-resources/compile-resources-manually-with-makepri.md + - name: MakePri.exe command-line options + href: ../app-resources/makepri-exe-command-options.md + - name: MakePri.exe configuration file + href: ../app-resources/makepri-exe-configuration.md + - name: MakePri.exe format-specific indexers + href: ../app-resources/makepri-exe-format-specific-indexers.md + - name: Migrate legacy resources + href: ../app-resources/using-mrt-for-converted-desktop-apps-and-games.md + - name: Data access + href: ../data-access/index.md + items: + - name: Use a SQLite database + href: ../data-access/sqlite-databases.md + - name: Use a SQL Server database + href: ../data-access/sql-server-databases.md + - name: Use a MongoDB database + href: ../data-access/mongo-db-databases.md + - name: Use a MySQL database + href: ../data-access/mysql-databases.md + - name: Data binding + href: ../data-binding/index.md + items: + - name: Data binding overview + href: ../data-binding/data-binding-quickstart.md + - name: Data binding in depth + href: ../data-binding/data-binding-in-depth.md + - name: "Functions in x:Bind" + href: ../data-binding/function-bindings.md + - name: "Tutorial: Create data bindings" + href: ../data-binding/xaml-basics-data-binding.md + - name: Sample data on the design surface, and for prototyping + href: ../data-binding/displaying-data-in-the-designer.md + - name: Bind hierarchical data and create a master/details view + href: ../data-binding/how-to-bind-to-hierarchical-data-and-create-a-master-details-view.md + - name: Data binding and MVVM + href: ../data-binding/data-binding-and-mvvm.md + - name: Files, folders, and libraries + href: ../files/index.md + items: + - name: Enumerate and query files and folders + href: ../files/quickstart-listing-files-and-folders.md + - name: Create, write, and read a file + href: ../files/quickstart-reading-and-writing-files.md + - name: Best practices for writing to files + href: ../files/best-practices-for-writing-to-files.md + - name: Get file properties + href: ../files/quickstart-getting-file-properties.md + - name: Open files and folders with a picker + href: ../files/quickstart-using-file-and-folder-pickers.md + - name: Save a file with a picker + href: ../files/quickstart-save-a-file-with-a-picker.md + - name: Accessing HomeGroup content + href: ../files/quickstart-accessing-homegroup-content.md + - name: Determining availability of Microsoft OneDrive files + href: ../files/quickstart-determining-availability-of-microsoft-onedrive-files.md + - name: Files and folders in the Music, Pictures, and Videos libraries + href: ../files/quickstart-managing-folders-in-the-music-pictures-and-videos-libraries.md + - name: Thumbnail images + href: ../files/thumbnails.md + - name: Track recently used files and folders + href: ../files/how-to-track-recently-used-files-and-folders.md + - name: Track file system changes in the background + href: ../files/change-tracking-filesystem.md + - name: Access the SD card + href: ../files/access-the-sd-card.md + - name: File access permissions + href: ../files/file-access-permissions.md + - name: Fast access to file properties in UWP + href: ../files/fast-file-properties.md + - name: Machine Learning + href: /windows/ai/ +- name: Deployment + items: + - name: Choose a UWP version + href: ../updates-and-versions/choose-a-uwp-version.md + - name: Debugging, testing, and performance + href: ../debug-test-perf/index.md + items: + - name: Deploying and debugging UWP apps + href: ../debug-test-perf/deploying-and-debugging-uwp-apps.md + - name: Testing and debugging tools for PLM + href: ../debug-test-perf/testing-debugging-plm.md + - name: Test with the Microsoft Emulator for Windows + href: ../debug-test-perf/test-with-the-emulator.md + - name: Test Surface Hub apps using Visual Studio + href: ../debug-test-perf/test-surface-hub-apps-using-visual-studio.md + - name: Deploy an app through loose file registration + href: ../debug-test-perf/loose-file-registration.md + - name: Beta testing + href: ../debug-test-perf/beta-testing.md + - name: Windows Device Portal + href: ../debug-test-perf/device-portal.md + items: + - name: Windows Device Portal for Desktop + href: ../debug-test-perf/device-portal-desktop.md + - name: Windows Device Portal for Mobile + href: ../debug-test-perf/device-portal-mobile.md + - name: Windows Device Portal core REST APIs + href: ../debug-test-perf/device-portal-api-core.md + - name: Write a custom plugin for Windows Device Portal + href: ../debug-test-perf/device-portal-plugin.md + - name: Provision Windows Device Portal with a custom SSL certificate + href: ../debug-test-perf/device-portal-ssl.md + - name: Windows App Certification Kit + href: ../debug-test-perf/windows-app-certification-kit.md + items: + - name: Windows App Certification Kit tests + href: ../debug-test-perf/windows-app-certification-kit-tests.md + items: + - name: Windows Desktop Bridge app tests + href: ../debug-test-perf/windows-desktop-bridge-app-tests.md + - name: Performance + href: ../debug-test-perf/performance-and-xaml-ui.md + items: + - name: Planning for performance + href: ../debug-test-perf/planning-and-measuring-performance.md + - name: Optimize background activity + href: ../debug-test-perf/optimize-background-activity.md + - name: ListView and GridView UI optimization + href: ../debug-test-perf/optimize-gridview-and-listview.md + - name: ListView and GridView data virtualization + href: ../debug-test-perf/listview-and-gridview-data-optimization.md + - name: Improve garbage collection performance + href: ../debug-test-perf/improve-garbage-collection-performance.md + - name: Keep the UI thread responsive + href: ../debug-test-perf/keep-the-ui-thread-responsive.md + - name: Optimize your XAML markup + href: ../debug-test-perf/optimize-xaml-loading.md + - name: Optimize your XAML layout + href: ../debug-test-perf/optimize-your-xaml-layout.md + - name: MVVM and language performance tips + href: ../debug-test-perf/mvvm-performance-tips.md + - name: Best practices for your app's startup performance + href: ../debug-test-perf/best-practices-for-your-app-s-startup-performance.md + - name: Optimize animations, media, and images + href: ../debug-test-perf/optimize-animations-and-media.md + - name: Optimize suspend/resume + href: ../debug-test-perf/optimize-suspend-resume.md + - name: Optimize file access + href: ../debug-test-perf/optimize-file-access.md + - name: Windows Runtime components and optimizing interop + href: ../debug-test-perf/windows-runtime-components-and-optimizing-interop.md + - name: Tools for profiling and performance + href: ../debug-test-perf/tools-for-profiling-and-performance.md + - name: Version adaptive apps + href: ../debug-test-perf/version-adaptive-apps.md + items: + - name: Version adaptive code + href: ../debug-test-perf/version-adaptive-code.md + - name: Conditional XAML + href: ../debug-test-perf/conditional-xaml.md + - name: Monetization, engagement, and Store services + href: ../monetize/index.md + items: + - name: In-app purchases and trials + href: ../monetize/in-app-purchases-and-trials.md + items: + - name: Get product info for apps and add-ons + href: ../monetize/get-product-info-for-apps-and-add-ons.md + - name: Get license info for apps and add-ons + href: ../monetize/get-license-info-for-apps-and-add-ons.md + - name: Enable in-app purchases of apps and add-ons + href: ../monetize/enable-in-app-purchases-of-apps-and-add-ons.md + - name: Enable consumable add-on purchases + href: ../monetize/enable-consumable-add-on-purchases.md + - name: Enable subscription add-ons for your app + href: ../monetize/enable-subscription-add-ons-for-your-app.md + - name: Implement a trial version of your app + href: ../monetize/implement-a-trial-version-of-your-app.md + - name: Data schemas for Store products + href: ../monetize/data-schemas-for-store-products.md + - name: Error codes for Store operations + href: ../monetize/error-codes-for-store-operations.md + - name: Using the Windows.ApplicationModel.Store namespace + href: ../monetize/in-app-purchases-and-trials-using-the-windows-applicationmodel-store-namespace.md + items: + - name: Exclude or limit features in a trial version + href: ../monetize/exclude-or-limit-features-in-a-trial-version-of-your-app.md + - name: Enable in-app product purchases + href: ../monetize/enable-in-app-product-purchases.md + - name: Enable consumable in-app product purchases + href: ../monetize/enable-consumable-in-app-product-purchases.md + - name: Manage a large catalog of in-app products + href: ../monetize/manage-a-large-catalog-of-in-app-products.md + - name: Use receipts to verify product purchases + href: ../monetize/use-receipts-to-verify-product-purchases.md + - name: Display ads in your app with the Microsoft Advertising SDK + href: ../monetize/display-ads-in-your-app.md + items: + - name: Install the Microsoft Advertising SDK + href: ../monetize/install-the-microsoft-advertising-libraries.md + items: + - name: Update your app to the latest libraries for banner ads + href: ../monetize/update-your-app-to-the-latest-advertising-libraries.md + - name: Implement ads in your app + href: ../monetize/developer-walkthroughs.md + items: + - name: Banner ads + href: ../monetize/banner-ads.md + items: + - name: AdControl in XAML and .NET + href: ../monetize/adcontrol-in-xaml-and--net.md + - name: AdControl in HTML 5 and JavaScript + href: ../monetize/adcontrol-in-html-5-and-javascript.md + - name: Supported banner ad sizes + href: ../monetize/supported-ad-sizes-for-banner-ads.md + - name: Interstitial ads + href: ../monetize/interstitial-ads.md + items: + - name: Interstitial ad sample code in C# + href: ../monetize/interstitial-ad-sample-code-in-c.md + - name: Interstitial ad sample code in JavaScript + href: ../monetize/interstitial-ad-sample-code-in-javascript.md + - name: Native ads + href: ../monetize/native-ads.md + - name: Show ads in video content + href: ../monetize/add-advertisements-to-video-content.md + - name: Set up ad units in your app + href: ../monetize/set-up-ad-units-in-your-app.md + - name: Microsoft ad mediation service + href: ../monetize/ad-mediation-service.md + - name: Best practices + href: ../monetize/best-practices-for-ads-in-apps.md + items: + - name: UI and user experience guidelines + href: ../monetize/ui-and-user-experience-guidelines.md + - name: Optimize the viewability of your ad units + href: ../monetize/optimize-ad-unit-viewability.md + - name: Handle ad errors + href: ../monetize/error-handling-with-advertising-libraries.md + items: + - name: Error handling in XAML/C# walkthrough + href: ../monetize/error-handling-in-xamlc-walkthrough.md + - name: Error handling in JavaScript walkthrough + href: ../monetize/error-handling-in-javascript-walkthrough.md + - name: Known issues and troubleshooting + href: ../monetize/known-issues-for-the-advertising-libraries.md + items: + - name: HTML and JavaScript troubleshooting guide + href: ../monetize/html-and-javascript-troubleshooting-guide.md + - name: XAML and C# troubleshooting guide + href: ../monetize/xaml-and-c-troubleshooting-guide.md + - name: Release notes + href: ../monetize/release-notes-for-the-advertising-libraries.md + - name: Windows Premium Ads Publishers Program + href: ../monetize/windows-premium-ads-publishers-program.md + - name: Engage customers with the Microsoft Store Services SDK + href: ../monetize/microsoft-store-services-sdk.md + items: + - name: Run app experiments with A/B testing + href: ../monetize/run-app-experiments-with-a-b-testing.md + items: + - name: Create an experiment project in Partner Center + href: ../monetize/create-a-project-and-define-remote-variables-in-the-dev-center-dashboard.md + - name: Code your app for experimentation + href: ../monetize/code-your-experiment-in-your-app.md + - name: Define your experiment in Partner Center + href: ../monetize/define-your-experiment-in-the-dev-center-dashboard.md + - name: Manage your experiment in Partner Center + href: ../monetize/manage-your-experiment.md + - name: Create and run your first experiment + href: ../monetize/create-and-run-your-first-experiment-with-a-b-testing.md + - name: Launch Feedback Hub from your app + href: ../monetize/launch-feedback-hub-from-your-app.md + - name: Configure your app for targeted push notifications + href: ../monetize/configure-your-app-to-receive-dev-center-notifications.md + - name: Log custom events for Partner Center + href: ../monetize/log-custom-events-for-dev-center.md + - name: Request ratings and reviews + href: ../monetize/request-ratings-and-reviews.md + - name: Microsoft Store services + href: ../monetize/using-windows-store-services.md + items: + - name: Access analytics data + href: ../monetize/access-analytics-data-using-windows-store-services.md + items: + - name: Get acquisitions data for your games and apps + href: ../monetize/acquisitions-data.md + - name: Get add-on acquisitions data for your games and apps + href: ../monetize/add-on-acquisitions-data.md + - name: UWP apps + items: + - name: Get acquisitions and installs data + items: + - name: Get app acquisitions (legacy) + href: ../monetize/get-app-acquisitions.md + - name: Get app installs + href: ../monetize/get-app-installs.md + - name: Get app acquisition funnel data (legacy) + href: ../monetize/get-acquisition-funnel-data.md + - name: Get app conversions by channel + href: ../monetize/get-app-conversions-by-channel.md + - name: Get add-on acquisitions + href: ../monetize/get-in-app-acquisitions.md + - name: Get subscription add-on acquisitions + href: ../monetize/get-subscription-acquisitions.md + - name: Get add-on conversions by channel + href: ../monetize/get-add-on-conversions-by-channel.md + - name: Get insights data for your app + href: ../monetize/get-insights-data-for-your-app.md + - name: Get app ratings + href: ../monetize/get-app-ratings.md + - name: Get app reviews + href: ../monetize/get-app-reviews.md + - name: Get daily app usage + href: ../monetize/get-app-usage-daily.md + - name: Get monthly app usage + href: ../monetize/get-app-usage-monthly.md + - name: Get error reporting data + href: ../monetize/get-error-reporting-data.md + items: + - name: Get details for an error in your app + href: ../monetize/get-details-for-an-error-in-your-app.md + - name: Get the stack trace for an error in your app + href: ../monetize/get-the-stack-trace-for-an-error-in-your-app.md + - name: Download the CAB file for an error in your app + href: ../monetize/download-the-cab-file-for-an-error-in-your-app.md + - name: Get ad performance data + href: ../monetize/get-ad-performance-data.md + - name: Get ad campaign performance data + href: ../monetize/get-ad-campaign-performance-data.md + - name: Desktop apps + items: + - name: Get desktop application installs + href: ../monetize/get-desktop-app-installs.md + - name: Get insights data for your desktop application + href: ../monetize/get-insights-data-for-your-desktop-app.md + - name: Get upgrade blocks for your desktop application + href: ../monetize/get-desktop-block-data.md + - name: Get upgrade block details for your desktop application + href: ../monetize/get-desktop-block-data-details.md + - name: Get error reporting data for your desktop application + href: ../monetize/get-desktop-application-error-reporting-data.md + items: + - name: Get details for an error in your desktop application + href: ../monetize/get-details-for-an-error-in-your-desktop-application.md + - name: Get the stack trace for an error in your desktop application + href: ../monetize/get-the-stack-trace-for-an-error-in-your-desktop-application.md + - name: Download the CAB file for an error in your desktop application + href: ../monetize/download-the-cab-file-for-an-error-in-your-desktop-application.md + - name: Xbox One games and Xbox Live + items: + - name: Get Xbox Live analytics data + href: ../monetize/get-xbox-live-analytics.md + items: + - name: Get Xbox Live achievements data + href: ../monetize/get-xbox-live-achievements-data.md + - name: Get Xbox Live health data + href: ../monetize/get-xbox-live-health-data.md + - name: Get Xbox Live Game Hub data + href: ../monetize/get-xbox-live-game-hub-data.md + - name: Get Xbox Live club data + href: ../monetize/get-xbox-live-club-data.md + - name: Get Xbox Live multiplayer data + href: ../monetize/get-xbox-live-multiplayer-data.md + - name: Get Xbox Live concurrent usage data + href: ../monetize/get-xbox-live-concurrent-usage-data.md + - name: Respond to reviews + href: ../monetize/respond-to-reviews-using-windows-store-services.md + items: + - name: Get response info for reviews + href: ../monetize/get-response-info-for-app-reviews.md + - name: Submit responses to reviews + href: ../monetize/submit-responses-to-app-reviews.md + - name: Run ad campaigns + href: ../monetize/run-ad-campaigns-using-windows-store-services.md + items: + - name: Manage ad campaigns + href: ../monetize/manage-ad-campaigns.md + - name: Manage delivery lines + href: ../monetize/manage-delivery-lines-for-ad-campaigns.md + - name: Manage targeting profiles + href: ../monetize/manage-targeting-profiles-for-ad-campaigns.md + - name: Manage creatives + href: ../monetize/manage-creatives-for-ad-campaigns.md + - name: Create and manage submissions + href: ../monetize/create-and-manage-submissions-using-windows-store-services.md + items: + - name: Get app data + href: ../monetize/get-app-data.md + items: + - name: Get all apps + href: ../monetize/get-all-apps.md + - name: Get an app + href: ../monetize/get-an-app.md + - name: Get add-ons for an app + href: ../monetize/get-add-ons-for-an-app.md + - name: Get package flights for an app + href: ../monetize/get-flights-for-an-app.md + - name: Manage app submissions + href: ../monetize/manage-app-submissions.md + items: + - name: Get an app submission + href: ../monetize/get-an-app-submission.md + - name: Get the status of an app submission + href: ../monetize/get-status-for-an-app-submission.md + - name: Create an app submission + href: ../monetize/create-an-app-submission.md + - name: Commit an app submission + href: ../monetize/commit-an-app-submission.md + - name: Update an app submission + href: ../monetize/update-an-app-submission.md + - name: Delete an app submission + href: ../monetize/delete-an-app-submission.md + - name: Get rollout info for an app submission + href: ../monetize/get-package-rollout-info-for-an-app-submission.md + - name: Update the rollout percentage for an app submission + href: ../monetize/update-the-package-rollout-percentage-for-an-app-submission.md + - name: Halt the rollout for an app submission + href: ../monetize/halt-the-package-rollout-for-an-app-submission.md + - name: Finalize the rollout for an app submission + href: ../monetize/finalize-the-package-rollout-for-an-app-submission.md + - name: Manage add-ons + href: ../monetize/manage-add-ons.md + items: + - name: Get all add-ons + href: ../monetize/get-all-add-ons.md + - name: Get an add-on + href: ../monetize/get-an-add-on.md + - name: Create an add-on + href: ../monetize/create-an-add-on.md + - name: Delete an add-on + href: ../monetize/delete-an-add-on.md + - name: Manage add-on submissions + href: ../monetize/manage-add-on-submissions.md + items: + - name: Get an add-on submission + href: ../monetize/get-an-add-on-submission.md + - name: Get the status of an add-on submission + href: ../monetize/get-status-for-an-add-on-submission.md + - name: Create an add-on submission + href: ../monetize/create-an-add-on-submission.md + - name: Commit an add-on submission + href: ../monetize/commit-an-add-on-submission.md + - name: Update an add-on submission + href: ../monetize/update-an-add-on-submission.md + - name: Delete an add-on submission + href: ../monetize/delete-an-add-on-submission.md + - name: Manage package flights + href: ../monetize/manage-flights.md + items: + - name: Get a package flight + href: ../monetize/get-a-flight.md + - name: Create a package flight + href: ../monetize/create-a-flight.md + - name: Delete a package flight + href: ../monetize/delete-a-flight.md + - name: Manage package flight submissions + href: ../monetize/manage-flight-submissions.md + items: + - name: Get a package flight submission + href: ../monetize/get-a-flight-submission.md + - name: Get the status of a package flight submission + href: ../monetize/get-status-for-a-flight-submission.md + - name: Create a package flight submission + href: ../monetize/create-a-flight-submission.md + - name: Commit a package flight submission + href: ../monetize/commit-a-flight-submission.md + - name: Update a package flight submission + href: ../monetize/update-a-flight-submission.md + - name: Delete a package flight submission + href: ../monetize/delete-a-flight-submission.md + - name: Get rollout info for a flight submission + href: ../monetize/get-package-rollout-info-for-a-flight-submission.md + - name: Update the rollout percentage for a flight submission + href: ../monetize/update-the-package-rollout-percentage-for-a-flight-submission.md + - name: Halt the rollout for a flight submission + href: ../monetize/halt-the-package-rollout-for-a-flight-submission.md + - name: Finalize the rollout for a flight submission + href: ../monetize/finalize-the-package-rollout-for-a-flight-submission.md + - name: Code examples for the submission API + href: ../monetize/code-examples-for-the-windows-store-submission-api.md + items: + - name: "C# sample: submissions for apps, add-ons, and flights" + href: ../monetize/csharp-code-examples-for-the-windows-store-submission-api.md + - name: "C# sample: app submission with game options and trailers" + href: ../monetize/csharp-code-examples-for-submissions-game-options-and-trailers.md + - name: "Java sample: submissions for apps, add-ons, and flights" + href: ../monetize/java-code-examples-for-the-windows-store-submission-api.md + - name: "Java sample: app submission with game options and trailers" + href: ../monetize/java-code-examples-for-submissions-game-options-and-trailers.md + - name: "Python sample: submissions for apps, add-ons, and flights" + href: ../monetize/python-code-examples-for-the-windows-store-submission-api.md + - name: "Python sample: app submission with game options and trailers" + href: ../monetize/python-code-examples-for-submissions-game-options-and-trailers.md + - name: Manage targeted offers + href: ../monetize/manage-targeted-offers-using-windows-store-services.md + items: + - name: Get targeted offers + href: ../monetize/get-targeted-offers.md + - name: Manage product entitlements from a service + href: ../monetize/view-and-grant-products-from-a-service.md + items: + - name: Query for products + href: ../monetize/query-for-products.md + - name: Report consumable products as fulfilled + href: ../monetize/report-consumable-products-as-fulfilled.md + - name: Grant free products + href: ../monetize/grant-free-products.md + - name: Get subscriptions for a user + href: ../monetize/get-subscriptions-for-a-user.md + - name: Change the billing state of a subscription for a user + href: ../monetize/change-the-billing-state-of-a-subscription-for-a-user.md + - name: Renew a Microsoft Store ID key + href: ../monetize/renew-a-windows-store-id-key.md + - name: Send requests to the Store + href: ../monetize/send-requests-to-the-store.md + - name: Add retail demo (RDX) features + href: ../monetize/retail-demo-experience.md + - name: Simplify payments with the Payment Request API + href: ../monetize/index.md + - name: Packaging apps + items: + - name: Overview + href: ../packaging/index.md + - name: App capability declarations + href: ../packaging/app-capability-declarations.md + - name: Set up automated builds for your UWP app + href: ../packaging/auto-build-package-uwp-apps.md + - name: Install apps with the WinAppDeployCmd.exe tool + href: ../packaging/install-universal-windows-apps-with-the-winappdeploycmd-tool.md + - name: Download and install package updates from the Store + href: ../packaging/self-install-package-updates.md +- name: Platform + items: + - name: C++/WinRT + href: ../cpp-and-winrt-apis/index.md + items: + - name: Introduction + href: ../cpp-and-winrt-apis/intro-to-using-cpp-with-winrt.md + - name: Get started + href: ../cpp-and-winrt-apis/get-started.md + - name: What's new + href: ../cpp-and-winrt-apis/news.md + - name: Frequently-asked questions + href: ../cpp-and-winrt-apis/faq.yml + - name: Troubleshooting + href: ../cpp-and-winrt-apis/troubleshooting.md + - name: Photo Editor sample application + href: ../cpp-and-winrt-apis/photo-editor-sample.md + - name: String handling + href: ../cpp-and-winrt-apis/strings.md + - name: Standard C++ data types + href: ../cpp-and-winrt-apis/std-cpp-data-types.md + - name: Boxing and unboxing values to IInspectable + href: ../cpp-and-winrt-apis/boxing.md + - name: Consume APIs + href: ../cpp-and-winrt-apis/consume-apis.md + - name: Author APIs + href: ../cpp-and-winrt-apis/author-apis.md + - name: Error handling + href: ../cpp-and-winrt-apis/error-handling.md + - name: Handle events by using delegates + href: ../cpp-and-winrt-apis/handle-events.md + - name: Author events + href: ../cpp-and-winrt-apis/author-events.md + - name: Collections + href: ../cpp-and-winrt-apis/collections.md + - name: Concurrency and asynchronous operations + href: ../cpp-and-winrt-apis/concurrency.md + - name: Advanced concurrency and asynchrony + href: ../cpp-and-winrt-apis/concurrency-2.md + - name: A completion source sample + href: ../cpp-and-winrt-apis/concurrency-3.md + - name: XAML controls; bind to a property + href: ../cpp-and-winrt-apis/binding-property.md + - name: XAML items controls; bind to a collection + href: ../cpp-and-winrt-apis/binding-collection.md + - name: XAML custom (templated) controls + href: ../cpp-and-winrt-apis/xaml-cust-ctrl.md + - name: Passing parameters into the ABI boundary + href: ../cpp-and-winrt-apis/pass-parms-to-abi.md + - name: Consume COM components + href: ../cpp-and-winrt-apis/consume-com.md + - name: Author COM components + href: ../cpp-and-winrt-apis/author-coclasses.md + - name: Move to C++/WinRT from C++/CX + href: ../cpp-and-winrt-apis/move-to-winrt-from-cx.md + - name: Interop with C++/CX + href: ../cpp-and-winrt-apis/interop-winrt-cx.md + - name: Asynchrony, and interop with C++/CX + href: ../cpp-and-winrt-apis/interop-winrt-cx-async.md + - name: Move to C++/WinRT from WRL + href: ../cpp-and-winrt-apis/move-to-winrt-from-wrl.md + - name: Porting a sample app from C# + href: ../cpp-and-winrt-apis/clipboard-to-winrt-from-csharp.md + - name: Move to C++/WinRT from C# + href: ../cpp-and-winrt-apis/move-to-winrt-from-csharp.md + - name: Interop with the ABI + href: ../cpp-and-winrt-apis/interop-winrt-abi.md + - name: Strong and weak references + href: ../cpp-and-winrt-apis/weak-references.md + - name: Agile objects + href: ../cpp-and-winrt-apis/agile-objects.md + - name: Diagnosing direct allocations + href: ../cpp-and-winrt-apis/diag-direct-alloc.md + - name: Extension points for implementation types + href: ../cpp-and-winrt-apis/details-about-destructors.md + - name: A simple C++/WinRT WinUI example + href: ../cpp-and-winrt-apis/simple-winui-example.md + - name: Windows Runtime components (C++/WinRT) + href: ../winrt-components/create-a-windows-runtime-component-in-cppwinrt.md + - name: Use a C# component in a C++/WinRT app + href: ../cpp-and-winrt-apis/use-csharp-component-from-cpp-winrt.md + - name: Native debug visualization + href: ../cpp-and-winrt-apis/natvis.md + - name: Naming conventions + href: ../cpp-and-winrt-apis/naming.md + - name: C++ language + items: + - name: Value categories, and references + href: ../cpp-and-winrt-apis/cpp-value-categories.md + - name: .NET Native + items: + - name: Overview + href: ../dotnet-native/index.md + - name: .NET Native and compilation + href: ../dotnet-native/net-native-and-compilation.md + - name: Get started + href: ../dotnet-native/getting-started-with-net-native.md + items: + - name: "Example: Troubleshoot dynamic programming" + href: ../dotnet-native/example-troubleshooting-dynamic-programming.md + - name: "Example: Handle exceptions when binding data" + href: ../dotnet-native/example-handling-exceptions-when-binding-data.md + - name: Runtime exceptions + href: ../dotnet-native/runtime-exceptions-in-net-native-apps.md + - name: Measure startup improvement + href: ../dotnet-native/measuring-startup-improvement-with-net-native.md + - name: Reflection + items: + - name: Overview + href: ../dotnet-native/reflection-and-net-native.md + - name: APIs that rely on reflection + href: ../dotnet-native/apis-that-rely-on-reflection.md + - name: Reflection API reference + href: ../dotnet-native/net-native-reflection-api-reference.md + items: + - name: MissingInteropDataException class + href: ../dotnet-native/missinginteropdataexception-class-net-native.md + - name: MissingMetadataException class + href: ../dotnet-native/missingmetadataexception-class-net-native.md + - name: MissingRuntimeArtifactException class + href: ../dotnet-native/missingruntimeartifactexception-class-net-native.md + - name: Runtime directives config file reference + href: ../dotnet-native/runtime-directives-rd-xml-configuration-file-reference.md + items: + - name: Runtime directive elements + href: ../dotnet-native/runtime-directive-elements.md + items: + - name: Application element + href: ../dotnet-native/application-element-net-native.md + - name: Assembly element + href: ../dotnet-native/assembly-element-net-native.md + - name: AttributeImplies element + href: ../dotnet-native/attributeimplies-element-net-native.md + - name: Directives element + href: ../dotnet-native/directives-element-net-native.md + - name: Event element + href: ../dotnet-native/event-element-net-native.md + - name: Field element + href: ../dotnet-native/field-element-net-native.md + - name: GenericParameter element + href: ../dotnet-native/genericparameter-element-net-native.md + - name: ImpliesType element + href: ../dotnet-native/impliestype-element-net-native.md + - name: Library element + href: ../dotnet-native/library-element-net-native.md + - name: Method element + href: ../dotnet-native/method-element-net-native.md + - name: MethodInstantiation element + href: ../dotnet-native/methodinstantiation-element-net-native.md + - name: Namespace element + href: ../dotnet-native/namespace-element-net-native.md + - name: Parameter element + href: ../dotnet-native/parameter-element-net-native.md + - name: Property element + href: ../dotnet-native/property-element-net-native.md + - name: Subtypes element + href: ../dotnet-native/subtypes-element-net-native.md + - name: Type element + href: ../dotnet-native/type-element-net-native.md + - name: TypeInstantiation element + href: ../dotnet-native/typeinstantiation-element-net-native.md + - name: TypeParameter element + href: ../dotnet-native/typeparameter-element-net-native.md + - name: Policy settings + href: ../dotnet-native/runtime-directive-policy-settings.md + - name: Serialization and metadata + href: ../dotnet-native/serialization-and-metadata.md + - name: Migrate a Windows 8.x App to .NET Native + href: ../dotnet-native/migrating-your-windows-store-app-to-net-native.md + - name: Troubleshoot + href: ../dotnet-native/net-native-general-troubleshooting.md + - name: Security + href: ../security/index.md + items: + - name: Intro to secure Windows app development + href: ../security/intro-to-secure-windows-app-development.md + - name: Authentication and user identity + href: ../security/authentication-and-user-identity.md + items: + - name: Credential locker + href: ../security/credential-locker.md + - name: Fingerprint biometrics + href: ../security/fingerprint-biometrics.md + - name: Windows Hello + href: ../security/microsoft-passport.md + items: + - name: Create a Windows Hello login app + href: ../security/microsoft-passport-login.md + - name: Create a Windows Hello login service + href: ../security/microsoft-passport-login-auth-service.md + - name: Smart cards + href: ../security/smart-cards.md + - name: Shared certificates + href: ../security/share-certificates.md + - name: Web Account Manager + href: ../security/web-account-manager.md + - name: Unlock with companion IoT devices + href: ../security/companion-device-unlock.md + - name: Web authentication broker + href: ../security/web-authentication-broker.md + - name: Cryptography + href: ../security/cryptography.md + items: + - name: Certificates + href: ../security/certificates.md + - name: Cryptographic keys + href: ../security/cryptographic-keys.md + - name: Data protection + href: ../security/data-protection.md + - name: MACs, hashes, and signatures + href: ../security/macs-hashes-and-signatures.md + - name: Export restrictions on cryptography + href: ../security/export-restrictions-on-cryptography.md + - name: Common cryptography tasks + href: ../security/common-cryptography-tasks.md + items: + - name: Create random numbers + href: ../security/create-random-numbers.md + - name: Compare buffers + href: ../security/compare-buffers.md + - name: Convert between strings and binary data + href: ../security/convert-between-strings-and-binary-data.md + - name: Copy to and from byte arrays + href: ../security/copy-to-and-from-byte-arrays.md + - name: Encode and decode data + href: ../security/encode-and-decode-data.md + - name: Visual layer + href: ../composition/visual-layer.md + items: + - name: Composition visual + href: ../composition/composition-visual-tree.md + - name: Composition animations + href: ../composition/composition-animation.md + items: + - name: Time animations + href: ../composition/time-animations.md + - name: Relation animations + href: ../composition/relation-animations.md + - name: Natural animations + href: ../composition/natural-animations.md + items: + - name: Spring animations + href: ../composition/spring-animations.md + - name: Input-driven animations + href: ../composition/input-driven-animations.md + items: + - name: Scroll-based animations + href: ../composition/scroll-input-animations.md + - name: Pointer-based animations + href: ../composition/pointer-input-animations.md + - name: Custom manipulations + href: ../composition/interaction-tracker-manipulations.md + items: + - name: Snap points + href: ../composition/inertia-modifiers.md + - name: Pull-to-refresh + href: ../composition/source-modifiers.md + - name: Composition effects + href: ../composition/composition-effects.md + items: + - name: Composition shadows + href: ../composition/composition-shadows.md + - name: Composition lighting + href: ../composition/composition-lighting.md + - name: Composition brushes + href: ../composition/composition-brushes.md + - name: Composition native interoperation + href: ../composition/composition-native-interop.md + - name: Tailoring your UI + href: ../composition/composition-tailoring.md + - name: Using UWP XAML + href: ../composition/using-the-visual-layer-with-xaml.md + items: + - name: XAML lighting + href: ../composition/xaml-lighting.md + - name: Windows as a service + href: ../updates-and-versions/application-development-for-windows-as-a-service.md + - name: Windows Runtime components + href: ../winrt-components/index.md + items: + - name: Windows Runtime components with C++/WinRT + href: ../winrt-components/create-a-windows-runtime-component-in-cppwinrt.md + - name: Windows Runtime components with C++/CX + href: ../winrt-components/creating-windows-runtime-components-in-cpp.md + - name: Walkthrough of a C++/CX Windows Runtime component + href: ../winrt-components/walkthrough-creating-a-basic-windows-runtime-component-in-cpp-and-calling-it-from-javascript-or-csharp.md + - name: Windows Runtime components with C# and Visual Basic + href: ../winrt-components/creating-windows-runtime-components-in-csharp-and-visual-basic.md + items: + - name: Custom events and event accessors in Windows Runtime components + href: ../winrt-components/custom-events-and-event-accessors-in-windows-runtime-components.md + - name: Passing arrays to a Windows Runtime component + href: ../winrt-components/passing-arrays-to-a-windows-runtime-component.md + - name: Diagnosing Windows Runtime component error conditions + href: ../winrt-components/diagnosing-windows-runtime-component-error-conditions.md + - name: Distributing a managed Windows Runtime component + href: ../winrt-components/distributing-a-managed-windows-runtime-component.md + - name: .NET mappings of Windows Runtime types + href: ../winrt-components/net-framework-mappings-of-windows-runtime-types.md + - name: Walkthrough of a C# or Visual Basic Windows Runtime component + href: ../winrt-components/walkthrough-creating-a-simple-windows-runtime-component-and-calling-it-from-javascript.md + - name: Raising events in Windows Runtime components + href: ../winrt-components/raising-events-in-windows-runtime-components.md + - name: Brokered Windows Runtime components for side-loaded UWP apps + href: ../winrt-components/brokered-windows-runtime-components-for-side-loaded-windows-store-apps.md + - name: XAML platform + href: ../xaml-platform/index.md + items: + - name: XAML overview + href: ../xaml-platform/xaml-overview.md + items: + - name: XAML syntax guide + href: ../xaml-platform/xaml-syntax-guide.md + items: + - name: Property-path syntax + href: ../xaml-platform/property-path-syntax.md + - name: Move and draw commands syntax + href: ../xaml-platform/move-draw-commands-syntax.md + - name: XAML and whitespace + href: ../xaml-platform/xaml-and-whitespace.md + - name: XAML namescopes + href: ../xaml-platform/xaml-namescopes.md + - name: XAML namespaces and namespace mapping + href: ../xaml-platform/xaml-namespaces-and-namespace-mapping.md + - name: Template settings classes + href: ../xaml-platform/template-settings-classes.md + - name: "x:Class attribute" + href: ../xaml-platform/x-class-attribute.md + - name: "x:DefaultBindMode attribute" + href: ../xaml-platform/x-defaultbindmode-attribute.md + - name: "x:DeferLoadStrategy attribute" + href: ../xaml-platform/x-deferloadstrategy-attribute.md + - name: "x:FieldModifier attribute" + href: ../xaml-platform/x-fieldmodifier-attribute.md + - name: "x:Key attribute" + href: ../xaml-platform/x-key-attribute.md + - name: "x:Load attribute" + href: ../xaml-platform/x-load-attribute.md + - name: "x:Name attribute" + href: ../xaml-platform/x-name-attribute.md + - name: "x:Phase attribute" + href: ../xaml-platform/x-phase-attribute.md + - name: "x:Uid directive" + href: ../xaml-platform/x-uid-directive.md + - name: "{x:Bind} markup extension" + href: ../xaml-platform/x-bind-markup-extension.md + - name: "{Binding} markup extension" + href: ../xaml-platform/binding-markup-extension.md + - name: "{x:Null} markup extension" + href: ../xaml-platform/x-null-markup-extension.md + - name: XAML intrinsic data types + href: ../xaml-platform/xaml-intrinsic-data-types.md + - name: "{CustomResource} markup extension" + href: ../xaml-platform/customresource-markup-extension.md + - name: "{RelativeSource} markup extension" + href: ../xaml-platform/relativesource-markup-extension.md + - name: "{StaticResource} markup extension" + href: ../xaml-platform/staticresource-markup-extension.md + - name: "{TemplateBinding} markup extension" + href: ../xaml-platform/templatebinding-markup-extension.md + - name: "{ThemeResource} markup extension" + href: ../xaml-platform/themeresource-markup-extension.md + - name: Dependency properties overview + href: ../xaml-platform/dependency-properties-overview.md + - name: Custom dependency properties + href: ../xaml-platform/custom-dependency-properties.md + - name: Attached properties overview + href: ../xaml-platform/attached-properties-overview.md + - name: Custom attached properties + href: ../xaml-platform/custom-attached-properties.md + - name: Events and routed events overview + href: ../xaml-platform/events-and-routed-events-overview.md +- name: People and places + items: + - name: Contacts, My People, and calendar + href: ../contacts-and-calendar/index.md + items: + - name: My People + href: ../contacts-and-calendar/my-people-support.md + items: + - name: My People sharing + href: ../contacts-and-calendar/my-people-sharing.md + - name: My People notifications + href: ../contacts-and-calendar/my-people-notifications.md + - name: Select contacts + href: ../contacts-and-calendar/selecting-contacts.md + - name: Send email + href: ../contacts-and-calendar/sending-email.md + - name: Send an SMS message + href: ../contacts-and-calendar/sending-an-sms-message.md + - name: Manage appointments + href: ../contacts-and-calendar/managing-appointments.md + - name: Connect your app to actions on a contact card + href: ../contacts-and-calendar/integrating-with-contacts.md + - name: Maps and location + href: ../maps-and-location/index.md + items: + - name: Request authentication key + href: ../maps-and-location/authentication-key.md + - name: Display maps + href: ../maps-and-location/display-maps.md + - name: Display points of interest + href: ../maps-and-location/display-poi.md + - name: Display routes and directions + href: ../maps-and-location/routes-and-directions.md + - name: Overlay tiled images + href: ../maps-and-location/overlay-tiled-images.md + - name: Perform geocoding + href: ../maps-and-location/geocoding.md + - name: Get current location + href: ../maps-and-location/get-location.md + - name: Design guidance for location-aware apps + href: ../maps-and-location/guidelines-and-checklist-for-detecting-location.md + - name: Guidelines for using Visits tracking + href: ../maps-and-location/guidelines-for-visits.md + - name: Set up a geofence + href: ../maps-and-location/set-up-a-geofence.md + - name: Design guidance for geofencing + href: ../maps-and-location/guidelines-for-geofencing.md + - name: Map style sheet reference + href: ../maps-and-location/elements-of-map-style-sheet.md +- name: Peripherals, sensors, and power + href: ../devices-sensors/index.md + items: + - name: Enable device capabilities + href: ../devices-sensors/enable-device-capabilities.md + - name: Enable usermode access + href: ../devices-sensors/enable-usermode-access.md + - name: Enumerate devices + href: ../devices-sensors/enumerate-devices.md + items: + - name: Build a device selector + href: ../devices-sensors/build-a-device-selector.md + - name: Enumerate devices over a network + href: ../devices-sensors/enumerate-devices-over-a-network.md + - name: Device information properties + href: ../devices-sensors/device-information-properties.md + - name: AEP service class IDs + href: ../devices-sensors/aep-service-class-ids.md + - name: Pair devices + href: ../devices-sensors/pair-devices.md + - name: Point of Service + href: ../devices-sensors/point-of-service.md + items: + - name: Basics + href: ../devices-sensors/pos-basics.md + items: + - name: Capability declaration + href: ../devices-sensors/pos-basics-capability.md + - name: Enumerating devices + href: ../devices-sensors/pos-basics-enumerating.md + - name: Creating a device object + href: ../devices-sensors/pos-basics-deviceobject.md + - name: Claiming and enable + href: ../devices-sensors/pos-basics-claim.md + - name: Sharing peripherals with others + href: ../devices-sensors/pos-basics-sharing.md + - name: Getting started + href: ../devices-sensors/pos-get-started.md + - name: Hardware support + href: ../devices-sensors/pos-device-support.md + - name: Barcode scanner + href: ../devices-sensors/pos-barcodescanner.md + items: + - name: Configure a barcode scanner + href: ../devices-sensors/pos-barcodescanner-configure.md + - name: Use a software trigger + href: ../devices-sensors/pos-barcodescanner-software-trigger.md + - name: Working with symbologies + href: ../devices-sensors/pos-barcodescanner-symbologies.md + - name: Obtain and understand barcode data + href: ../devices-sensors/pos-barcodescanner-scan-data.md + - name: Camera barcode scanner + href: ../devices-sensors/pos-camerabarcode.md + items: + - name: System requirements + href: ../devices-sensors/pos-camerabarcode-system-requirements.md + - name: Getting started + href: ../devices-sensors/pos-camerabarcode-get-started.md + - name: Hosting a camera preview + href: ../devices-sensors/pos-camerabarcode-hosting-preview.md + - name: Enable/disable camera barcode scanner + href: ../devices-sensors/pos-camerabarcode-enable-disable.md + - name: Supported symbologies + href: ../devices-sensors/pos-camerabarcode-symbologies.md + - name: Magnetic stripe reader + href: ../devices-sensors/pos-magnetic-stripe-reader.md + items: + - name: Obtain and understand magnetic stripe data + href: ../devices-sensors/pos-magnetic-stripe-reader-data.md + - name: POSPrinter + href: ../devices-sensors/pos-printer.md + items: + - name: Epson ESC/POS with formatting + href: ../devices-sensors/epson-esc-pos-with-formatting.md + - name: Sensors + href: ../devices-sensors/sensors.md + items: + - name: Calibrate sensors + href: ../devices-sensors/calibrate-sensors.md + - name: Sensor orientation + href: ../devices-sensors/sensor-orientation.md + - name: Use the accelerometer + href: ../devices-sensors/use-the-accelerometer.md + - name: Use the compass + href: ../devices-sensors/use-the-compass.md + - name: Use the gyrometer + href: ../devices-sensors/use-the-gyrometer.md + - name: Use the inclinometer + href: ../devices-sensors/use-the-inclinometer.md + - name: Use the light sensor + href: ../devices-sensors/use-the-light-sensor.md + - name: Use the orientation sensor + href: ../devices-sensors/use-the-orientation-sensor.md + - name: Bluetooth + href: ../devices-sensors/bluetooth.md + items: + - name: RFCOMM + href: ../devices-sensors/send-or-receive-files-with-rfcomm.md + - name: Bluetooth Low Energy + href: ../devices-sensors/bluetooth-low-energy-overview.md + items: + - name: GATT client + href: ../devices-sensors/gatt-client.md + - name: GATT server + href: ../devices-sensors//gatt-server.md + - name: Advertisements + href: ../devices-sensors/ble-beacon.md + - name: Bluetooth developer FAQ + href: ../devices-sensors/bluetooth-dev-faq.yml + - name: Printing and scanning + href: ../devices-sensors/printing-and-scanning.md + items: + - name: Print from your app + href: ../devices-sensors/print-from-your-app.md + - name: Customize the print preview UI + href: ../devices-sensors/customize-the-print-preview-ui.md + - name: Customize the print workflow + href: ../devices-sensors/print-workflow-customize.md + - name: Scan from your app + href: ../devices-sensors/scan-from-your-app.md + - name: 3D printing + href: ../devices-sensors/3d-printing.md + items: + - name: 3D printing from your app + href: ../devices-sensors/3d-print-from-app.md + - name: Generate a 3MF package + href: ../devices-sensors/generate-3mf.md + - name: NFC + href: ../devices-sensors/nfc.md + items: + - name: Create an NFC Smart Card app + href: ../devices-sensors/host-card-emulation.md + - name: Get battery information + href: ../devices-sensors/get-battery-info.md +- name: Porting apps + items: + - name: Overview + href: ../porting/index.md + - name: Move from desktop to UWP + href: ../porting/desktop-to-uwp-migrate.md + - name: Move from Windows Runtime 8.x to UWP + href: ../porting/w8x-to-uwp-root.md + items: + - name: Porting the project + href: ../porting/w8x-to-uwp-porting-to-a-uwp-project.md + - name: Troubleshooting + href: ../porting/w8x-to-uwp-troubleshooting.md + - name: Porting XAML and UI + href: ../porting/w8x-to-uwp-porting-xaml-and-ui.md + - name: Porting for I/O, device, and app model + href: ../porting/w8x-to-uwp-input-and-sensors.md + - name: "Case study: Bookstore1" + href: ../porting/w8x-to-uwp-case-study-bookstore1.md + - name: "Case study: Bookstore2" + href: ../porting/w8x-to-uwp-case-study-bookstore2.md + - name: "Case study: QuizGame" + href: ../porting/w8x-to-uwp-case-study-quizgame.md + - name: Windows apps concept mapping for Android and iOS developers + href: ../porting/android-ios-uwp-map.md + - name: Move from iOS to UWP + href: ../porting/ios-to-uwp-root.md + items: + - name: Selecting an approach to iOS and UWP app development + href: ../porting/selecting-an-approach-to-ios-and-uwp-app-development.md + - name: Getting started with UWP for iOS developers + href: ../porting/getting-started-with-uwp-for-ios-developers.md + items: + - name: "Getting started: Creating a project" + href: ../porting/getting-started-creating-a-project.md + - name: "Getting started: Choosing a programming language" + href: ../porting/getting-started-choosing-a-programming-language.md + - name: "Getting started: Getting around in Visual Studio" + href: ../porting/getting-started-getting-around-in-visual-studio.md + - name: "Getting started: Common controls" + href: ../porting/getting-started-common-controls.md + - name: "Getting started: Navigation" + href: ../porting/getting-started-navigation.md + - name: "Getting started: Animation" + href: ../porting/getting-started-animation.md + - name: "Getting started: What next?" + href: ../porting/getting-started-what-next.md + - name: Setting up your Mac with Windows + href: ../porting/setting-up-your-mac-with-windows-10.md + - name: Move from Windows Phone Silverlight to UWP + href: ../porting/wpsl-to-uwp-root.md + items: + - name: Namespace and class mappings + href: ../porting/wpsl-to-uwp-namespace-and-class-mappings.md + - name: Porting the project + href: ../porting/wpsl-to-uwp-porting-to-a-uwp-project.md + - name: Troubleshooting + href: ../porting/wpsl-to-uwp-troubleshooting.md + - name: Porting XAML and UI + href: ../porting/wpsl-to-uwp-porting-xaml-and-ui.md + - name: Porting for I/O, device, and app model + href: ../porting/wpsl-to-uwp-input-and-sensors.md + - name: Porting business and data layers + href: ../porting/wpsl-to-uwp-business-and-data.md + - name: Porting for form factor and UX + href: ../porting/wpsl-to-uwp-form-factors-and-ux.md + - name: "Case study: Bookstore1" + href: ../porting/wpsl-to-uwp-case-study-bookstore1.md + - name: "Case study: Bookstore2" + href: ../porting/wpsl-to-uwp-case-study-bookstore2.md + - name: Convert your web app to a PWA on Windows + href: /microsoft-edge/progressive-web-apps + items: + - name: Package Windows 7 app as a PWA + href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-windows7.html + - name: Package iOS app as a PWA + href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-ios.html + - name: Package Android app as a PWA + href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-android.html + - name: Package MacOS app as a PWA + href: https://docs.pwabuilder.com/jekyll/update/2018/02/03/how-to-package-mac.html + - name: Windows on ARM + href: ../porting/apps-on-arm.md + items: + - name: Arm64EC for Windows 11 apps on Arm + href: ../porting/arm64ec.md + - name: Understanding Arm64EC ABI + href: ../porting/arm64ec-abi.md + - name: How x86 emulation works on ARM + href: ../porting/apps-on-arm-x86-emulation.md + - name: Troubleshooting desktop x86 apps + href: ../porting/apps-on-arm-troubleshooting-x86.md + - name: Troubleshooting UWP ARM apps + href: ../porting/apps-on-arm-troubleshooting-arm32.md + - name: Program Compatibility Troubleshooter on ARM + href: ../porting/apps-on-arm-program-compat-troubleshooter.md +- name: Processes and threading + items: + - name: Launching, resuming, and background tasks + href: ../launch-resume/index.md + items: + - name: Create a Universal Windows Platform console app + href: ../launch-resume/console-uwp.md + - name: Create a Multi-instance UWP app + href: ../launch-resume/multi-instance-uwp.md + - name: App lifecycle + href: ../launch-resume/app-lifecycle.md + items: + - name: Handle app prelaunch + href: ../launch-resume/handle-app-prelaunch.md + - name: Handle app activation + href: ../launch-resume/activate-an-app.md + - name: Handle app suspend + href: ../launch-resume/suspend-an-app.md + - name: Handle app resume + href: ../launch-resume/resume-an-app.md + - name: Free memory when your app moves to the background + href: ../launch-resume/reduce-memory-usage.md + - name: Postpone app suspension with extended execution + href: ../launch-resume/run-minimized-with-extended-execution.md + - name: Launch an app with a URI + href: ../launch-resume/launch-app-with-uri.md + items: + - name: Launch the default app for a URI + href: ../launch-resume/launch-default-app.md + - name: Handle URI activation + href: ../launch-resume/handle-uri-activation.md + - name: Launch an app for results + href: ../launch-resume/how-to-launch-an-app-for-results.md + - name: Choose and save tones using the ms-tonepicker URI scheme + href: ../launch-resume/launch-ringtone-picker.md + - name: Launch the Windows Settings app + href: ../launch-resume/launch-settings-app.md + - name: Launch the Microsoft Store app + href: ../launch-resume/launch-store-app.md + - name: Launch the Windows Maps app + href: ../launch-resume/launch-maps-app.md + - name: Launch the People app + href: ../launch-resume/launch-people-apps.md + - name: Launch screen snipping + href: ../launch-resume/launch-screen-snipping.md + - name: Support web-to-app linking with app URI handlers + href: ../launch-resume/web-to-app-linking.md + - name: Launch an app through file activation + href: ../launch-resume/launch-app-from-file.md + items: + - name: Launch the default app for a file + href: ../launch-resume/launch-the-default-app-for-a-file.md + - name: Handle file activation + href: ../launch-resume/handle-file-activation.md + - name: Auto-launching with AutoPlay + href: ../launch-resume/auto-launching-with-autoplay.md + - name: Reserved file and URI scheme names + href: ../launch-resume/reserved-uri-scheme-names.md + - name: Use app services and extensions + href: ../launch-resume/app-services.md + items: + - name: Create and consume an app service + href: ../launch-resume/how-to-create-and-consume-an-app-service.md + - name: Convert an app service to run in the same process as its host app + href: ../launch-resume/convert-app-service-in-process.md + - name: Extend your app with services, extensions, and packages + href: ../launch-resume/extend-your-app-with-services-extensions-packages.md + - name: Create and host an app extension + href: ../launch-resume/how-to-create-an-extension.md + - name: Create hosted apps + href: ../launch-resume/hosted-apps.md + - name: Support your app with background tasks + href: ../launch-resume/support-your-app-with-background-tasks.md + items: + - name: Guidelines for background tasks + href: ../launch-resume/guidelines-for-background-tasks.md + - name: Access sensors and devices from a background task + href: ../launch-resume/access-sensors-and-devices-from-a-background-task.md + - name: Create and register an in-process background task + href: ../launch-resume/create-and-register-an-inproc-background-task.md + - name: Create and register an out-of-process background task + href: ../launch-resume/create-and-register-a-background-task.md + - name: Create and register a winmain COM background task + href: ../launch-resume/create-and-register-a-winmain-background-task.md + - name: Port an out-of-process background task to an in-process background task + href: ../launch-resume/convert-out-of-process-background-task.md + - name: Debug a background task + href: ../launch-resume/debug-a-background-task.md + - name: Declare background tasks in the application manifest + href: ../launch-resume/declare-background-tasks-in-the-application-manifest.md + - name: Group background task registration + href: ../launch-resume/group-background-tasks.md + - name: Handle a cancelled background task + href: ../launch-resume/handle-a-cancelled-background-task.md + - name: Monitor background task progress and completion + href: ../launch-resume/monitor-background-task-progress-and-completion.md + - name: Register a background task + href: ../launch-resume/register-a-background-task.md + - name: Respond to system events with background tasks + href: ../launch-resume/respond-to-system-events-with-background-tasks.md + - name: Run a background task on a timer + href: ../launch-resume/run-a-background-task-on-a-timer-.md + - name: Run a background task when your UWP app is updated + href: ../launch-resume/run-a-background-task-during-updatetask.md + - name: Run in the background indefinitely + href: ../launch-resume/run-in-the-background-indefinetly.md + - name: Set conditions for running a background task + href: ../launch-resume/set-conditions-for-running-a-background-task.md + - name: Trigger a background task from your app + href: ../launch-resume/trigger-background-task-from-app.md + - name: Update a live tile from a background task + href: ../launch-resume/update-a-live-tile-from-a-background-task.md + - name: Use a maintenance trigger + href: ../launch-resume/use-a-maintenance-trigger.md + - name: Connected apps and devices (Project Rome) + href: ../launch-resume/connected-apps-and-devices.md + items: + - name: Discover remote devices + href: ../launch-resume/discover-remote-devices.md + - name: Launch an app on a remote device + href: ../launch-resume/launch-a-remote-app.md + - name: Communicate with a remote app service + href: ../launch-resume/communicate-with-a-remote-app-service.md + - name: Connect devices through remote sessions + href: ../launch-resume/remote-sessions.md + - name: Continue user activity, even across devices + href: ../launch-resume/useractivities.md + - name: User Activities best practices + href: ../launch-resume/useractivities-best-practices.md + - name: Splash screens + href: ../launch-resume/splash-screens.md + items: + - name: Add a splash screen + href: ../launch-resume/add-a-splash-screen.md + - name: Display a splash screen for more time + href: ../launch-resume/create-a-customized-splash-screen.md + - name: Threading and async programming + href: ../threading-async/index.md + items: + - name: Asynchronous programming (UWP apps) + href: ../threading-async/asynchronous-programming-universal-windows-platform-apps.md + - name: Asynchronous programming in C++/CX (UWP apps) + href: ../threading-async/asynchronous-programming-in-cpp-universal-windows-platform-apps.md + - name: Best practices for using the thread pool + href: ../threading-async/best-practices-for-using-the-thread-pool.md + - name: Call asynchronous APIs in C# or Visual Basic + href: ../threading-async/call-asynchronous-apis-in-csharp-or-visual-basic.md + - name: Create a periodic work item + href: ../threading-async/create-a-periodic-work-item.md + - name: Submit a work item to the thread pool + href: ../threading-async/submit-a-work-item-to-the-thread-pool.md + - name: Use a timer to submit a work item + href: ../threading-async/use-a-timer-to-submit-a-work-item.md + - name: Using Windows Runtime objects in a multithreaded environment + href: ../threading-async/using-windows-runtime-objects-in-a-multithreaded-environment.md diff --git a/windows-apps-src/porting/arm64ec-abi.md b/windows-apps-src/porting/arm64ec-abi.md new file mode 100644 index 0000000000..ed3704e15c --- /dev/null +++ b/windows-apps-src/porting/arm64ec-abi.md @@ -0,0 +1,768 @@ +--- +title: Understanding Arm64EC ABI and assembly code +description: An in-depth look at Arm64EC ABI, register mapping, call checkers, stack checkers, variadic calling, entry thunks, exit thunks, and adjuster thunks, fast-forward sequences, authoring Arm64EC in Assembly, and dynamically generating (JIT Compiling) Arm64EC code. +ms.date: 03/18/2022 +ms.topic: article +author: pmsjt +ms.author: pedrot +ms.reviewer: mattwoj +--- + +# Understanding Arm64EC ABI and assembly code + +Arm64EC (“Emulation Compatible”) is a new application binary interface (ABI) for building apps for Windows 11 on Arm. For an overview of Arm64EC and how to start building Win32 apps as Arm64EC, see [Using ARM64EC to build apps for Windows 11 on ARM devices](./arm64ec.md). + +The purpose of this document is to provide a detailed view of the Arm64EC ABI with enough information for an application developer to write and debug code compiled for Arm64EC, including low-level/assembler debugging and writing assembly code targeting the Arm64EC ABI. + +## Design of Arm64EC + +Arm64EC was designed to deliver native-level functionality and performance, while providing transparent and direct interoperability with x64 code running under emulation. + +Arm64EC is mostly additive to the Classic Arm64 ABI. Very little of the Classic ABI was changed, but portions were added to enable x64 interoperability. + +In this document, the original, standard Arm64 ABI shall be referred to as “Classic ABI”. This avoids the ambiguity inherent to overloaded terms like “Native”. Arm64EC, to be clear, is every bit as native as the original ABI. + +## Arm64EC vs Arm64 Classic ABI + +The following list points out where Arm64EC has diverged from Arm64 Classic ABI. + +- [Register mapping and blocked registers](#register-mapping-and-blocked-registers) +- [Call checkers](#call-checkers) +- [Stack checkers](#stack-checkers) +- [Variadic calling convention](#variadic-calling-convention) + +These are small changes when seen in perspective of how much the entire ABI defines. + +### Register mapping and blocked registers + +For there to be type-level interoperability with x64 code, Arm64EC code is compiled with the same pre-processor architecture definitions as x64 code. + +In other words, `_M_AMD64` and `_AMD64_` are defined. One of the types affected by this rule is the `CONTEXT` structure. The `CONTEXT` structure defines the state of the CPU at a given point. It is used for things like `Exception Handling` and `GetThreadContext` APIs. Existing x64 code expects the CPU context to be represented as an x64 `CONTEXT` structure or, in other words, the `CONTEXT` structure as it is defined during x64 compilation. + +This structure must be used to represent the CPU context while executing x64 code, as well as Arm64EC code. Existing code would not understand a novel concept, such as the CPU register set changing from function to function. If the x64 `CONTEXT` structure is used to represent Arm64 execution states, this implies Arm64 registers are effectively mapped into x64 registers. + +It also implies that any Arm64 registers which cannot be fitted into the x64 `CONTEXT` must not be used, as their values can be lost anytime an operation using `CONTEXT` occurs (and some can be asynchronous and unexpected, such as the Garbage Collection operation of a Managed Language Runtime, or an APC). + +The mapping rules between Arm64EC and x64 registers are represented by the `ARM64EC_NT_CONTEXT` structure in the Windows headers, present in the SDK. This structure is essentially a union of the `CONTEXT` structure, exactly as it is defined for x64, but with an extra Arm64 register overlay. + +For example, `RCX` maps to `X0`, `RDX` to `X1`, `RSP` to `SP`, `RIP` to `PC`, etc. We can also see how the registers `x13`, `x14`, `x23`, `x24`, `x28`, `v16`-`v31` have no representation and, thus, cannot be used in Arm64EC. + +This register usage restriction is the first difference between the Arm64 Classic and EC ABIs. + +### Call checkers + +Call checkers have been a part of Windows ever since [Control Flow Guard (CFG)](/windows/win32/secbp/control-flow-guard) was introduced in Windows 8.1. Call checkers are address sanitizers for function pointers (before these things were called address sanitizers). Every time code is compiled with the option `/guard:cf` the compiler will generate an extra call to the checker function just before every indirect call/jump. The checker function itself is provided by Windows and, for CFG, it performs a validity check against the known-to-be-good call targets. This information is also included in binaries compiled with `/guard:cf`. + +This is an example of a call checker use in Classic Arm64: + +``` +mov x15, +adrp x16, __guard_check_icall_fptr +ldr x16, [x16, __guard_check_icall_fptr] +blr x16 ; check target function +blr x15 ; call function +``` + +In the CFG case, the call checker will simply return if the target is valid, or fast-fail the process if it is not. Call checkers have custom calling conventions. They take the function pointer in a register not used by the normal calling convention and preserving all normal calling-convention registers. This way, they don’t introduce register spillage around them. + +Call checkers are optional on all other Windows ABIs, but mandatory on Arm64EC. On Arm64EC, call checkers accumulate the task of verifying the architecture of the function being called. They verify whether the call is another EC (“Emulation Compatible”) function or an x64 function that must be executed under emulation. In many cases, this can only be verified at runtime. + +Arm64EC call checkers build on top of the existing Arm64 checkers, but they have a slightly different custom calling convention. They take an extra parameter and they may modify the register containing the target address. For example, if the target is x64 code, control must be transferred to the emulation scaffolding logic first. + +In Arm64EC, the same call checker use would become: + +``` +mov x11, +adrp x9, __os_arm64x_check_icall_cfg +ldr x9, [x9, __os_arm64x_check_icall_cfg] +adrp x10, +add x10, x10, +blr x9 ; check target function +blr x11 ; call function +``` + +Slight differences from Classic Arm64 include: + +- Symbol name for the call checker is different. +- The target address is supplied in `x11` instead of `x15`. +- The target address (`x11`) is `[in, out]` instead of `[in]`. +- There is an extra parameter, provided through `x10`, called an “Exit Thunk”. + +An [Exit Thunk](#exit-thunks) is a funclet which transforms function parameters from Arm64EC calling convention to x64 calling convention. + +The Arm64EC call checker is located through a different symbol than is used for the other ABIs in Windows. On the Classic Arm64 ABI, the symbol for the call checker is `__guard_check_icall_fptr`. This symbol will be present in Arm64EC, but it is there for x64 statically linked code to use, not Arm64EC code itself. Arm64EC code will use either `__os_arm64x_check_icall` or `__os_arm64x_check_icall_cfg`. + +On Arm64EC, call checkers are not optional. However, CFG is still optional, as is the case for other ABIs. CFG may be disabled at compile-time, or there may be a legitimate reason to not perform a CFG check even when CFG is enabled (e.g. the function pointer never resides in RW memory). For an indirect call with CFG check, the `__os_arm64x_check_icall_cfg` checker should be used. If CFG is disabled or unnecessary, `__os_arm64x_check_icall` should be used instead. + +Below is a summary table of the call checker usage on Classic Arm64, x64 and Arm64EC noting the fact that an Arm64EC binary can have two options depending on the architecture of the code. + +|Binary |Code |Uprotected indirect call |CFG protected indirect call| +|--------------|---------|---------------|------------------------------------------------------------| +|x64 |x64 |no call checker| `__guard_check_icall_fptr` or `__guard_dispatch_icall_fptr`| +|Arm64 Classic |Arm64 |no call checker| `__guard_check_icall_fptr`| +|Arm64EC |x64 |no call checker| `__guard_check_icall_fptr` or `__guard_dispatch_icall_fptr`| +| |Arm64EC |`__os_arm64x_check_icall`| `__os_arm64x_check_icall_cfg`| + +Independently of the ABI, having CFG enabled code (code with reference to the CFG call-checkers), does not imply CFG protection at runtime. CFG protected binaries can run down-level, on systems not supporting CFG: the call-checker is initialized with a no-op helper at compile time. A process may also have CFG disabled by configuration. When CFG is disabled (or OS support is not present) on previous ABIs the OS will simply not update the call-checker when the binary is loaded. On Arm64EC, if CFG protection is disabled, the OS will set `__os_arm64x_check_icall_cfg` the same as `__os_arm64x_check_icall`, which will still provide the needed target architecture check in all cases, but not CFG protection. + +### Stack Checkers + +`__chkstk` is used automatically by the compiler every time a function allocates an area on the stack larger than a page. To avoid skipping over the stack guard page protecting the end of the stack, `__chkstk` is called to make sure all pages in the allocated area are probed. + +`__chkstk` is usually called from the prolog of the function. For that reason, and for optimal code generation, it uses a custom calling convention. + +This implies that x64 code and Arm64EC code need their own, distinct, `__chkstk` functions, as Entry and Exit thunks assume standard calling conventions. + +x64 and Arm64EC share the same symbol namespace so there can’t be two functions named `__chkstk`. To accommodate compatibility with pre-existing x64 code, `__chkstk` name will be associated with the x64 stack checker. Arm64EC code will use `__chkstk_arm64ec` instead. + +The custom calling convention for `__chkstk_arm64ec` is the same as for Classic Arm64 `__chkstk`: `x15` provides the size of the allocation in bytes, divided by 16. All non-volatile registers, as well as all volatile registers involved in the standard calling convention are preserved. + +Everything said above about `__chkstk` applies equally to `__security_check_cookie` and its Arm64EC counterpart: `__security_check_cookie_arm64ec`. + +### Variadic calling convention + +Arm64EC follows the Classic Arm64 ABI calling convention, except for Variadic functions (aka varargs, aka functions with the ellipsis (. . .) parameter keyword). + +For the variadic specific case, Arm64EC follows a calling convention very similar to x64 variadic, with only a few differences. Below are the major rules for Arm64EC variadic: + +- Only the first 4 registers are used for parameter passing: `x0`, `x1`, `x2`, `x3`. Remaining parameters are spilled onto the stack. This follows the x64 variadic calling convention exactly, and differs from Arm64 Classic, where registers `x0`->`x7` are used. +- Floating Point / SIMD parameters being passed by register will use a General-Purpose register, not a SIMD one. This is similar to Arm64 Classic, and differs from x64, where FP/SIMD parameters are passed in both a General-Purpose and SIMD register. For example, for a function `f1(int, …)` being called as `f1(int, double)`, on x64, the second parameter will be assigned to both `RDX` and `XMM1`. On Arm64EC, the second parameter will be assigned to just `x1`. +- When passing structures by value through a register, x64 size rules apply: Structures with sizes exactly 1, 2, 4 and 8 will be loaded directly into the General-Purpose register. Structures with other sizes are spilled onto the stack, and a pointer to the spilled location is assigned to the register. This essentially demotes by-value into by-reference, at the low-level. On the Classic Arm64 ABI, structures of any size up to 16 bytes are assigned directly to General-Purposed registers. +- X4 register is loaded with a pointer to the first parameter passed via stack (the 5th parameter). This does not include structures spilled due to the size restrictions outlined above. +- X5 register is loaded with the size, in bytes, of all parameters passed by stack (size of all parameters, starting with the 5th). This does not include structures passed by value spilled due to the size restrictions outlined above. + +In the following example: `pt_nova_function` below takes parameters in a non-variadic form, therefore following the Classic Arm64 calling convention. It then calls `pt_va_function` with the exact same parameters but in a variadic call instead. + +``` +struct three_char { + char a; + char b; + char c; +}; + +void +pt_va_function ( + double f, + ... +); + +void +pt_nova_function ( + double f, + struct three_char tc, + __int64 ull1, + __int64 ull2, + __int64 ull3 +) +{ + pt_va_function(f, tc, ull1, ull2, ull3); +} +``` + +`pt_nova_function` takes 5 parameters which will be assigned following the Classic Arm64 calling convention rules: + +- ‘f ‘ is a double. It will be assigned to d0. +- ‘tc’ is a struct, with a size of 3 bytes. It will be assigned to x0. +- ull1 is an 8-byte integer. It will be assigned to x1. +- ull2 is an 8-byte integer. It will be assigned to x2. +- ull3 is an 8-byte integer. It will be assigned to x3. + +`pt_va_function` is a variadic function, so it will follow the Arm64EC variadic rules outlined above: + +- ‘f ‘ is a double. It will be assigned to x0. +- ‘tc’ is a struct, with a size of 3 bytes. It will be spilled onto the stack and its location loaded into x1. +- ull1 is an 8-byte integer. It will be assigned to x2. +- ull2 is an 8-byte integer. It will be assigned to x3. +- ull3 is an 8-byte integer. It will be assigned directly to the stack. +- x4 is loaded with the location of ull3 in the stack. +- x5 is loaded with the size of ull3. + +The following shows a possible compilation output for `pt_nova_function`, which illustrates the parameter assignment differences outlined above. + +``` +stp fp,lr,[sp,#-0x30]! +mov fp,sp +sub sp,sp,#0x10 + +str x3,[sp] ; Spill 5th parameter +mov x3,x2 ; 4th parameter to x3 (from x2) +mov x2,x1 ; 3rd parameter to x2 (from x1) +str w0,[sp,#0x20] ; Spill 2nd parameter +add x1,sp,#0x20 ; Address of 2nd parameter to x1 +fmov x0,d0 ; 1st parameter to x0 (from d0) +mov x4,sp ; Address of the 1st in-stack parameter to x4 +mov x5,#8 ; Size of the in-stack parameter area + +bl pt_va_function + +add sp,sp,#0x10 +ldp fp,lr,[sp],#0x30 +ret +``` + +## ABI additions + +To achieve transparent interoperability with x64 code, many additions have been made to the Classic Arm64 ABI. They handle the calling conventions differences between Arm64EC and x64. + +The following list includes these additions: + +- [Entry and Exit Thunks](#entry-and-exit-thunks) +- [Exit Thunks](#exit-thunks) +- [Entry Thunks](#entry-thunks) +- [Adjustor Thunks](#adjustor-thunks) +- [Fast-Forward Sequences](#fast-forward-sequences) + +## Entry and Exit Thunks + +Entry and Exit Thunks take care of translating the Arm64EC calling convention (mostly the same as Classic Arm64) into the x64 calling convention, and vice-versa. + +A common misconception is that calling conventions can be converted by following a single rule applied to all function signatures. The reality is that calling conventions have parameter assignment rules. These rules depend on the parameter type and are different from ABI to ABI. A consequence is that translation between ABIs will be specific to each function signature, varying with the type of each parameter. + +Consider the following function: + +``` +int fJ(int a, int b, int c, int d); +``` + +Parameter assignment will occur as follows: + +- Arm64: a -> x0, b -> x1, c -> x2, d -> x3 +- x64: a -> RCX, b -> RDX, c -> R8, d -> r9 +- Arm64 -> x64 translation: x0 -> RCX, x1 -> RDX, x2 -> R8, x3 -> R9 + +Now consider a different function: + +``` +int fK(int a, double b, int c, double d); +``` + +Parameter assignment will occur as follows: + +- Arm64: a -> x0, b -> d0, c -> x1, d -> d1 +- x64: a -> RCX, b -> XMM1, c -> R8, d -> XMM3 +- Arm64 -> x64 translation: x0 -> RCX, d0 -> XMM1, x1 -> R8, d1 -> XMM3 + +These examples demonstrate that parameter assignment and translation vary by type, but also the types of the preceding parameters in the list are depended upon. This detail is illustrated by the 3rd parameter. In both functions, the parameter’s type is “int”, but the resulting translation is different. + +Entry and Exit Thunks exist for this reason and are specifically tailored for each individual function signature. + +Both types of thunks are, themselves, functions. Entry Thunks are automatically invoked by the emulator when x64 functions call into Arm64EC functions (execution *Enters* Arm64EC). Exit Thunks are automatically invoked by the call checkers when Arm64EC functions call into x64 functions (execution *Exits* Arm64EC). + +When compiling Arm64EC code, the compiler will generate an Entry Thunk for each Arm64EC function, matching its signature. The compiler will also generate an Exit Thunk for every function an Arm64EC function calls. + +Consider the following example: + +``` +struct SC { + char a; + char b; + char c; +}; + +int fB(int a, double b, int i1, int i2, int i3); + +int fC(int a, struct SC c, int i1, int i2, int i3); + +int fA(int a, double b, struct SC c, int i1, int i2, int i3) { + return fB(a, b, i1, i2, i3) + fC(a, c, i1, i2, i3); +} +``` + +When compiling the code above targeting Arm64EC, the compiler will generate: + +- Code for ‘fA’. +- Entry Thunk for ‘fA’ +- Exit Thunk for ‘fB’ +- Exit Thunk for ‘fC’ + +The `fA` Entry Thunk is generated in case `fA` and called from x64 code. Exit Thunks for `fB` and `fC` are generated in case `fB` and/or `fC` and turn out to be x64 code. + +The same Exit Thunk may be generated multiple times, given the compiler will generate them at the call site rather than the function itself. This may result in a considerable amount of redundant thunks so, in reality, the compiler will apply trivial optimization rules to make sure only the required thunks make it into the final binary. + +For example, in a binary where Arm64EC function `A` calls Arm64EC function `B`, `B` is not exported and its address is never known outside of `A`. It is safe to eliminate the Exit Thunk from `A` to `B`, along with the Entry Thunk for `B`. It is also safe to alias together all Exit and Entry thunks which contain the same code, even if they were generated for distinct functions. + +#### Exit Thunks + +Using the example functions `fA`, `fB` and `fC` above, this is how the compiler would generate both `fB` and `fC` Exit Thunks: + +Exit Thunk to `int fB(int a, double b, int i1, int i2, int i3);` + +``` +$iexit_thunk$cdecl$i8$i8di8i8i8: + stp fp,lr,[sp,#-0x10]! + mov fp,sp + sub sp,sp,#0x30 + adrp x8,__os_arm64x_dispatch_call_no_redirect + ldr xip0,[x8] + str x3,[sp,#0x20] ; Spill 5th param (i3) into the stack + fmov d1,d0 ; Move 2nd param (b) from d0 to XMM1 (x1) + mov x3,x2 ; Move 4th param (i2) from x2 to R9 (x3) + mov x2,x1 ; Move 3rd param (i1) from x1 to R8 (x2) + blr xip0 ; Call the emulator + mov x0,x8 ; Move return from RAX (x8) to x0 + add sp,sp,#0x30 + ldp fp,lr,[sp],#0x10 + ret +``` + +Exit Thunk to `int fC(int a, struct SC c, int i1, int i2, int i3);` + +``` +$iexit_thunk$cdecl$i8$i8m3i8i8i8: + stp fp,lr,[sp,#-0x20]! + mov fp,sp + sub sp,sp,#0x30 + adrp x8,__os_arm64x_dispatch_call_no_redirect + ldr xip0,[x8] + str w1,[sp,#0x40] ; Spill 2nd param (c) onto the stack + add x1,sp,#0x40 ; Make RDX (x1) point to the spilled 2nd param + str x4,[sp,#0x20] ; Spill 5th param (i3) into the stack + blr xip0 ; Call the emulator + mov x0,x8 ; Move return from RAX (x8) to x0 + add sp,sp,#0x30 + ldp fp,lr,[sp],#0x20 + ret +``` + +In the `fB` case, we can see how the presence of a ‘double’ parameter will cause the remaining GP register assignment to reshuffle, a result of Arm64 and x64’s different assignment rules. We can also see x64 only assigns 4 parameters to registers, so the 5th parameter must be spilled onto the stack. + +In the `fC` case, the second parameter is a structure of 3-byte length. Arm64 will allow any size structure to be assigned to a register directly. x64 only allows sizes 1, 2, 4 and 8. This Exit Thunk must then transfer this `struct` from the register onto the stack and assign a pointer to the register instead. This still consumes one register (to carry the pointer) so it does not change assignments for the remaining registers: no register reshuffling happens for the 3rd and 4th parameter. Just as for the `fB` case, the 5th parameter must be spilled onto the stack. + +Additional considerations for Exit Thunks: + +- The compiler will name them not by the function name they translate from->to, but rather the signature they address. This makes it easier to find redundancies. +- The Exit Thunk is called with the register `x9` carrying the address of the target (x64) function. This is set by the call checker and passes through the Exit Thunk, undisturbed, into the emulator. + +It is worth, at this point, reviewing the function of the call checker, and detail about its own custom ABI. This is what an indirect call to `fB` would look like: + +``` +mov x11, +adrp x9, __os_arm64x_check_icall_cfg +ldr x9, [x9, __os_arm64x_check_icall_cfg] +adrp x10, $iexit_thunk$cdecl$i8$i8di8i8i8 ; fB function’s exit thunk +add x10, x10, $iexit_thunk$cdecl$i8$i8di8i8i8 +blr x9 ; check target function +blr x11 ; call function +``` + +When calling the call checker: + +- `x11` supplies the address of the target function to call (`fB` in this case). It may not be known, at this point, if the target function is Arm64EC or x64. +- `x10` supplies an Exit Thunk matching the signature of the function being called (`fB` in this case). + +The data returned by the call checker will depend on the target function being Arm64EC or x64. + +If the target is Arm64EC: + +- `x11` will return the address of the Arm64EC code to call. This may or may not be the same value that was provided in. + +If the target is x64 code: + +- `x11` will return the address of the Exit Thunk. This is copied from input provided in `x10`. +- `x10` will return the address of the Exit Thunk, undisturbed from input. +- `x9` will return the target x64 function. This may or may not be the same value it was provided in via `x11`. + +Call checkers will always leave calling convention parameter registers undisturbed, so the calling code should follow the call to the call checker immediately with `blr x11` (or `br x11` in case of a tail-call). These are the registers call checkers. They will always preserve above and beyond standard non-volatile registers: `x0`-`x8`, `x15`(`chkstk`) and `q0`-`q7`. + +#### Entry Thunks + +Entry Thunks take care of the transformations required from the x64 to the Arm64 calling conventions. This is, essentially, the reverse of Exit Thunks but there are a few more aspects to consider. + +Consider the previous example of compiling `fA`, an Entry Thunk is generated so that `fA` can be called by x64 code. + +Entry Thunk for `int fA(int a, double b, struct SC c, int i1, int i2, int i3)` + +``` +$ientry_thunk$cdecl$i8$i8dm3i8i8i8: + stp q6,q7,[sp,#-0xA0]! ; Spill full non-volatile XMM registers + stp q8,q9,[sp,#0x20] + stp q10,q11,[sp,#0x40] + stp q12,q13,[sp,#0x60] + stp q14,q15,[sp,#0x80] + stp fp,lr,[sp,#-0x10]! + mov fp,sp + ldrh w1,[x2] ; Load 3rd param (c) bits [15..0] directly into x1 + ldrb w8,[x2,#2] ; Load 3rd param (c) bits [16..23] into temp w8 + bfi w1,w8,#0x10,#8 ; Merge 3rd param (c) bits [16..23] into x1 + mov x2,x3 ; Move the 4th param (i1) from R9 (x3) to x2 + fmov d0,d1 ; Move the 2nd param (b) from XMM1 (d1) to d0 + ldp x3,x4,[x4,#0x20] ; Load the 5th (i2) and 6th (i3) params + ; from the stack into x3 and x4 (using x4) + blr x9 ; Call the function (fA) + mov x8,x0 ; Move the return from x0 to x8 (RAX) + ldp fp,lr,[sp],#0x10 + ldp q14,q15,[sp,#0x80] ; Restore full non-volatile XMM registers + ldp q12,q13,[sp,#0x60] + ldp q10,q11,[sp,#0x40] + ldp q8,q9,[sp,#0x20] + ldp q6,q7,[sp],#0xA0 + adrp xip0,__os_arm64x_dispatch_ret + ldr xip0,[xip0,__os_arm64x_dispatch_ret] + br xip0 +``` + +The address of the target function is provided by the emulator in `x9`. + +Before calling the Entry Thunk, the x64 emulator will pop the return address from the stack into the `LR` register. It is then expected that `LR` will be pointing at x64 code when control is transferred to the Entry Thunk. + +The emulator may also perform another adjustment to the stack, depending on the following: Both Arm64 and x64 ABIs define a stack alignment requirement where the stack must be aligned to 16-bytes at the point a function is called. When running Arm64 code, hardware enforces this rule, but there is no hardware enforcement for x64. While running x64 code, erroneously calling functions with an unaligned stack may go unnoticed indefinitely, until some 16-byte alignment instruction is used (some SSE instructions do) or Arm64EC code is called. + +To address this potential compatibility problem, before calling the Entry Thunk, the emulator will always align-down the Stack Pointer to 16-bytes and store its original value in the `x4` register. This way Entry Thunks always start executing with an aligned stack but can still correctly reference the parameters passed on the stack, via `x4`. + +When it comes to non-volatile SIMD registers, there is a significant difference between the Arm64 and x64 calling conventions. On Arm64, the low 8 bytes (64 bits) of the register are considered non-volatile. In other words, only the `Dn` part of the `Qn` registers is non-volatile. On x64, the entire 16 bytes of the `XMMn` register is considered non-volatile. Furthermore, on x64, `XMM6` and `XMM7` are non-volatile registers whereas D6 and D7 (the corresponding Arm64 registers) are volatile. + +To address these SIMD register manipulation asymmetries, Entry Thunks must explicitly save all SIMD registers which are considered non-volatile in x64. This is only needed on Entry Thunks (not Exit Thunks) because x64 is stricter than Arm64. In other words, register saving/preservation rules in x64 exceed the Arm64 requirements in all cases. + +To address the correct recovery of these register values when unwinding the stack (e.g. setjmp + longjmp, or throw + catch), a new unwind opcode was introduced: `save_any_reg (0xE7)`. This new 3-byte unwind opcode enables saving any General Purpose or SIMD register (including the ones considered volatile) and including full-sized `Qn` registers. This new opcode is used for the `Qn` register spills/fill operations above. `save_any_reg` is compatible with `save_next_pair (0xE6)`. + +For reference, below is the corresponding unwind information belonging to the Entry Thunk presented above: + +``` + Prolog unwind: + 06: E76689.. +0004 stp q6,q7,[sp,#-0xA0]! ; Actual=stp q6,q7,[sp,#-0xA0]! + 05: E6...... +0008 stp q8,q9,[sp,#0x20] ; Actual=stp q8,q9,[sp,#0x20] + 04: E6...... +000C stp q10,q11,[sp,#0x40] ; Actual=stp q10,q11,[sp,#0x40] + 03: E6...... +0010 stp q12,q13,[sp,#0x60] ; Actual=stp q12,q13,[sp,#0x60] + 02: E6...... +0014 stp q14,q15,[sp,#0x80] ; Actual=stp q14,q15,[sp,#0x80] + 01: 81...... +0018 stp fp,lr,[sp,#-0x10]! ; Actual=stp fp,lr,[sp,#-0x10]! + 00: E1...... +001C mov fp,sp ; Actual=mov fp,sp + +0020 (end sequence) + Epilog #1 unwind: + 0B: 81...... +0044 ldp fp,lr,[sp],#0x10 ; Actual=ldp fp,lr,[sp],#0x10 + 0C: E74E88.. +0048 ldp q14,q15,[sp,#0x80] ; Actual=ldp q14,q15,[sp,#0x80] + 0F: E74C86.. +004C ldp q12,q13,[sp,#0x60] ; Actual=ldp q12,q13,[sp,#0x60] + 12: E74A84.. +0050 ldp q10,q11,[sp,#0x40] ; Actual=ldp q10,q11,[sp,#0x40] + 15: E74882.. +0054 ldp q8,q9,[sp,#0x20] ; Actual=ldp q8,q9,[sp,#0x20] + 18: E76689.. +0058 ldp q6,q7,[sp],#0xA0 ; Actual=ldp q6,q7,[sp],#0xA0 + 1C: E3...... +0060 nop ; Actual=90000030 + 1D: E3...... +0064 nop ; Actual=ldr xip0,[xip0,#8] + 1E: E4...... +0068 end ; Actual=br xip0 + +0070 (end sequence) +``` + +After the Arm64EC function returns, the `__os_arm64x_dispatch_ret` routine is used to re-enter the emulator, back to x64 code (pointed to by `LR`). + +Arm64EC functions have the 4 bytes before the first instruction in the function reserved for storing information to be used at runtime. It is in these 4 bytes that the relative address of Entry Thunk for the function can be found. When performing a call from an x64 function to an Arm64EC function, the emulator will read the 4 bytes before the start of the function, mask-out the lower two bits and add that amount to the address of the function. This will produce the address of the Entry Thunk to call. + +### Adjustor Thunks + +Adjustor Thunks are signature-less functions which simply transfer control to (tail-call) another function, after performing some transformation to one of the parameters. The type of the parameter(s) being transformed is known, but all the remaining parameters can be anything and, in any number – Adjustor Thunks will not touch any register potentially holding a parameter and will not touch the stack. This is what makes Adjustor Thunks signature-less functions. + +Adjustor Thunks can be generated automatically by the compiler. This is common, for example, with C++ multiple-inheritance, where any virtual method may be delegated to the parent class, unmodified, aside from an adjustment to the `this` pointer. + +Below is a real-world example: + +``` +[thunk]:CObjectContext::Release`adjustor{8}': + sub x0,x0,#8 + b CObjectContext::Release +``` + +The thunk subtracts 8 bytes to the `this` pointer and forwards the call to the parent class. + +In summary, Arm64EC functions callable from x64 functions must have an associated Entry Thunk. The Entry Thunk is signature specific. Arm64 signature-less functions, such as Adjustor Thunks need a different mechanism which can handle signature-less functions. + +The Entry Thunk of an Adjustor Thunk uses the `__os_arm64x_x64_jump` helper to defer the execution of the real Entry Thunk work (adjust the parameters from one convention to the other) to the next call. It is at this time that the signature becomes apparent. This includes the option of not doing calling convention adjustments at all, if the target of the Adjustor Thunk turns out to be an x64 function. Remember that by the time an Entry Thunk starts running, the parameters are in their x64 form. + +In the example above, consider how the code looks in Arm64EC. + +**Adjustor Thunk in Arm64EC** + +``` +[thunk]:CObjectContext::Release`adjustor{8}': + sub x0,x0,#8 + adrp x9,CObjectContext::Release + add x11,x9,CObjectContext::Release + stp fp,lr,[sp,#-0x10]! + mov fp,sp + adrp xip0, __os_arm64x_check_icall + ldr xip0,[xip0, __os_arm64x_check_icall] + blr xip0 + ldp fp,lr,[sp],#0x10 + br x11 +``` + +**Adjustor Thunk’s Entry Trunk** + +``` +[thunk]:CObjectContext::Release$entry_thunk`adjustor{8}': + sub x0,x0,#8 + adrp x9,CObjectContext::Release + add x9,x9,CObjectContext::Release + adrp xip0,__os_arm64x_x64_jump + ldr xip0,[xip0,__os_arm64x_x64_jump] + br xip0 +``` + +### Fast-Forward Sequences + +Some applications make run-time modifications to functions residing in binaries that they do not own but depend on – commonly operating system binaries – for the purpose of detouring execution when the function is called. This is also known as hooking. + +At the high-level, the hooking process is simple. In detail, however, hooking is architecture specific and quite complex given the potential variations the hooking logic must address. + +In general terms, the process involves the following: + +- Determine the address of the function to hook. +- Replace the first instruction of the function with a jump to the hook routine. +- When the hook is done, come back to the original logic, which includes running the displaced original instruction. + +The variations arise from things like: + +- The size of the 1st instruction: It is a good idea to replace it with a JMP which is the same size or smaller, to avoid replacing the top of the function while other thread may be running it in flight. +- The type of the first instruction: If the first instruction has some PC relative nature to it, relocating it may require changing things like the displacement fields. Since they are likely to overflow when an instruction is moved to a distant place, this may require providing equivalent logic with different instructions altogether. + +Due to all of this complexity, robust and generic hooking logic is rare to find. Frequently the logic present in applications can only cope with a limited set of cases that the application is expecting to encounter in the specific APIs it is interested in. It is not hard to imagine how much of an application compatibility problem this is. Even a simple change in the code or compiler optimizations may render applications unusable if the code no longer looks exactly as expected. + +What would happen to these applications if they were to encounter Arm64 code when setting up a hook? They would most certainly fail. + +Fast-Forward Sequence (FFS) functions address this compatibility requirement in Arm64EC. + +FFS are very small x64 functions which contain no real logic and tail-call to the real Arm64EC function. They are optional but enabled by default for all DLL exports and for any function decorated with `__declspec(hybrid_patchable)`. + +For these cases, when code obtains a pointer to a given function, either by `GetProcAddress` in the export case, or by `&function` in the `__declspec(hybrid_patchable)` case, the resulting address will contain x64 code. That x64 code will pass for a legitimate x64 function, satisfying most of the hooking logic currently available. + +Consider the following example (error handling omitted for brevity): + +``` +auto module_handle = + GetModuleHandleW(L"api-ms-win-core-processthreads-l1-1-7.dll"); + +auto pgma = + (decltype(&GetMachineTypeAttributes)) + GetProcAddress(module_handle, "GetMachineTypeAttributes"); + +hr = (*pgma)(IMAGE_FILE_MACHINE_ARM64, &MachineAttributes); +``` + +The function pointer value in the `pgma` variable will contain the address of `GetMachineTypeAttributes`’s FFS. + +This is an example of a Fast-Forward Sequence: + +``` +kernelbase!EXP+#GetMachineTypeAttributes: +00000001`800034e0 488bc4 mov rax,rsp +00000001`800034e3 48895820 mov qword ptr [rax+20h],rbx +00000001`800034e7 55 push rbp +00000001`800034e8 5d pop rbp +00000001`800034e9 e922032400 jmp 00000001`80243810 +``` + +The FFS x64 function has a canonical prolog and epilog, ending with a tail-call (jump) to the real `GetMachineTypeAttributes` function in Arm64EC code: + +``` +kernelbase!GetMachineTypeAttributes: +00000001`80243810 d503237f pacibsp +00000001`80243814 a9bc7bfd stp fp,lr,[sp,#-0x40]! +00000001`80243818 a90153f3 stp x19,x20,[sp,#0x10] +00000001`8024381c a9025bf5 stp x21,x22,[sp,#0x20] +00000001`80243820 f9001bf9 str x25,[sp,#0x30] +00000001`80243824 910003fd mov fp,sp +00000001`80243828 97fbe65e bl kernelbase!#__security_push_cookie +00000001`8024382c d10083ff sub sp,sp,#0x20 + [...] +``` + +It would be quite inefficient if it was required to run 5 emulated x64 instructions between two Arm64EC functions. FFS functions are special. FFS functions don’t really run if they remain unaltered. The call-checker helper will efficiently check if the FFS hasn’t been changed. If that is the case, the call will be transferred directly to the real destination. If the FFS has been changed in any possible way, then it will no longer be an FFS. Execution will be transferred to the altered FFS and run whichever code may be there, emulating the detour and any hooking logic. + +When the hook transfers execution back to the end of the FFS, it will eventually reach the tail-call to the Arm64EC code, which will then execute after the hook, just as the application is expecting it would. + +## Authoring Arm64EC in Assembly + +Windows SDK headers and the C compiler can simplify the job of authoring Arm64EC assembly. For example, the C compiler can be used to generate Entry and Exit Thunks for functions not compiled from C code. + +Consider the example of an equivalent to the following function `fD` that must be authored in Assembly (ASM). This function can be called by both Arm64EC and x64 code and the `pfE` function pointer may point at either Arm64EC or x64 code as well. + +``` +typedef int (PF_E)(int, double); + +extern PF_E * pfE; + +int fD(int i, double d) { + return (*pfE)(i, d); +} +``` + +Writing `fD` in ASM would look something like: + +``` +#include "ksarm64.h" + + IMPORT __os_arm64x_check_icall_cfg + IMPORT |$iexit_thunk$cdecl$i8$i8d| + IMPORT pfE + + NESTED_ENTRY_COMDAT A64NAME(fD) + PROLOG_SAVE_REG_PAIR fp, lr, #-16! + + adrp x11, pfE ; Get the global function + ldr x11, [x11, pfE] ; pointer pfE + + adrp x9, __os_arm64x_check_icall_cfg ; Get the EC call checker + ldr x9, [x9, __os_arm64x_check_icall_cfg] ; with CFG + adrp x10, |$iexit_thunk$cdecl$i8$i8d| ; Get the Exit Thunk for + add x10, x10, |$iexit_thunk$cdecl$i8$i8d| ; int f(int, double); + blr x9 ; Invoke the call checker + + blr x11 ; Invoke the function + + EPILOG_RESTORE_REG_PAIR fp, lr, #16! + EPILOG_RETURN + + NESTED_END + + end +``` + +In the example above: + +- Arm64EC uses the same procedure declaration and prolog/epilog macros as Arm64. +- Function names should be wrapped by the `A64NAME` macro. When compiling C/C++ code as Arm64EC, the compiler marks the `OBJ` as `Arm64EC` containing Arm64EC code. This does not happen with `ARMASM`. When compiling ASM code there is an alternate way to inform the linker that the produced code is Arm64EC. This is by prefixing the function name with `#`. The `A64NAME` macro performs this operation when `_ARM64EC_` is defined and leaves the name unchanged when `_ARM64EC_` is not defined. This makes it possible to share source code between Arm64 and Arm64EC. +- The `pfE` function pointer must first be run through the EC call checker, together with the appropriate Exit Thunk, in case the target function is x64. + +## Generating Entry and Exit Thunks + +The next step is to generate the Entry Thunk for `fD` and the Exit Thunk for `pfE`. The C compiler can perform this task with minimal effort, using the `_Arm64XGenerateThunk` compiler keyword. + +``` +void _Arm64XGenerateThunk(int); + +int fD2(int i, double d) { + UNREFERENCED_PARAMETER(i); + UNREFERENCED_PARAMETER(d); + _Arm64XGenerateThunk(2); + return 0; +} + +int fE(int i, double d) { + UNREFERENCED_PARAMETER(i); + UNREFERENCED_PARAMETER(d); + _Arm64XGenerateThunk(1); + return 0; +} +``` + +The `_Arm64XGenerateThunk` keyword tells the C compiler to use the function signature, ignore the body, and generate either an Exit Thunk (when the parameter is 1) or an Entry Thunk (when the parameter is 2). + +It is recommended to place thunk generation in its own C file. Being in isolated files makes it simpler to confirm the symbol names by dumping the corresponding `OBJ` symbols or even disassembly. + +## Custom Entry Thunks + +Macros have been added to the SDK to help authoring custom, hand-coded, Entry Thunks. One case where this can be used is when authoring custom Adjustor Thunks. + +Most Adjustor Thunks are generated by the C++ compiler, but they can also be generated manually. This can be found in cases where a generic callback transfers control to the real callback, identified by one of the parameters. + +Below is an example in Arm64 Classic code: + +``` + NESTED_ENTRY MyAdjustorThunk + PROLOG_SAVE_REG_PAIR fp, lr, #-16! + ldr x15, [x0, 0x18] + adrp x16, __guard_check_icall_fptr + ldr x16, [x16, __guard_check_icall_fptr] + blr xip0 + EPILOG_RESTORE_REG_PAIR fp, lr, #16 + EPILOG_END br x15 + NESTED_END +``` + +In this example, the target function address is retrieved from the element of a structure, provided by reference, through the 1st parameter. Because the structure is writable, the target address must be validated through Control Flow Guard (CFG). + +The below example demonstrates how the equivalent Adjustor Thunk would look when ported to Arm64EC: + +``` + NESTED_ENTRY_COMDAT A64NAME(MyAdjustorThunk) + PROLOG_SAVE_REG_PAIR fp, lr, #-16! + ldr x11, [x0, 0x18] + adrp xip0, __os_arm64x_check_icall_cfg + ldr xip0, [xip0, __os_arm64x_check_icall_cfg] + blr xip0 + EPILOG_RESTORE_REG_PAIR fp, lr, #16 + EPILOG_END br x11 + NESTED_END +``` + +The code above does not supply an Exit Thunk (in register x10). This is not possible since the code can be executed for many different signatures. This code is taking advantage of the caller having set x10 to the Exit Thunk. The caller would have made the call targeting an explicit signature. + +The above code does need an Entry Thunk to address the case when the caller is x64 code. This is how to author the corresponding Entry Thunk, using the macro for custom Entry Thunks: + +``` + ARM64EC_CUSTOM_ENTRY_THUNK A64NAME(MyAdjustorThunk) + ldr x9, [x0, 0x18] + adrp xip0, __os_arm64x_x64_jump + ldr xip0, [xip0, __os_arm64x_x64_jump] + br xip0 + LEAF_END +``` + +Unlike other functions, this Entry Thunk does not eventually transfer control to the associated function (the Adjustor Thunk). In this case, the functionality itself (performing the parameter adjustment) is embedded into the Entry Thunk and control is transferred directly to the end target, via the `__os_arm64x_x64_jump` helper. + +## Dynamically Generating (JIT Compiling) Arm64EC code + +In Arm64EC processes there are two types of executable memory: Arm64EC code and x64 code. + +The operating system extracts this information from the loaded binaries. x64 binaries are all x64 and Arm64EC contain a range-table for Arm64EC vs x64 code pages. + +What about Dynamically Generated code? Just-in-time (JIT) compilers generate code, at runtime, which is not backed by any binary file. + +Usually this implies: + +- Allocating writable memory (`VirtualAlloc`). +- Producing the code into the allocated memory. +- Re-protecting the memory from Read-Write to Read-Execute (`VirtualProtect`). +- Add unwind function entries for all non-trivial (non-leaf) generated functions (`RtlAddFunctionTable` or `RtlAddGrowableFunctionTable`). + +For trivial compatibility reasons, any application performing these steps in an Arm64EC process will result in the code being considered x64 code. This will happen for any process using the unmodified x64 Java Runtime, .NET runtime, JavaScript engine, etc. + +To generate Arm64EC dynamic code, the process is mostly the same with only two differences: + +- When allocating the memory, use newer `VirtualAlloc2` (instead of `VirtualAlloc` or `VirtualAllocEx`) and provide the `MEM_EXTENDED_PARAMETER_EC_CODE` attribute. +- When adding function entries: + - They must be in Arm64 format. When compiling Arm64EC code, the `RUNTIME_FUNCTION` type will match the x64 format. For Arm64 format when compiling Am64EC, use the `ARM64_RUNTIME_FUNCTION` type instead. + - Do not use the older `RtlAddFunctionTable` API. Always use the newer `RtlAddGrowableFunctionTable` API instead. + +Below is an example of memory allocation: + +``` + MEM_EXTENDED_PARAMETER Parameter = { 0 }; + Parameter.Type = MemExtendedParameterAttributeFlags; + Parameter.ULong64 = MEM_EXTENDED_PARAMETER_EC_CODE; + + HANDLE process = GetCurrentProcess(); + ULONG allocationType = MEM_RESERVE; + DWORD protection = PAGE_EXECUTE_READ | PAGE_TARGETS_INVALID; + + address = VirtualAlloc2 ( + process, + NULL, + numBytesToAllocate, + allocationType, + protection, + &Parameter, + 1); +``` + +And an example of adding one unwind function entry: + +``` +ARM64_RUNTIME_FUNCTION FunctionTable[1]; + +FunctionTable[0].BeginAddress = 0; +FunctionTable[0].Flags = PdataPackedUnwindFunction; +FunctionTable[0].FunctionLength = nSize / 4; +FunctionTable[0].RegF = 0; // no D regs saved +FunctionTable[0].RegI = 0; // no X regs saved beyond fp,lr +FunctionTable[0].H = 0; // no home for x0-x7 +FunctionTable[0].CR = PdataCrChained; // stp fp,lr,[sp,#-0x10]! + // mov fp,sp +FunctionTable[0].FrameSize = 1; // 16 / 16 = 1 + +this->DynamicTable = NULL; +Result == RtlAddGrowableFunctionTable( + &this->DynamicTable, + reinterpret_cast(FunctionTable), + 1, + 1, + reinterpret_cast(pBegin), + reinterpret_cast(reinterpret_cast(pBegin) + nSize) +); +```