diff --git a/Cabal/src/Distribution/Compat/Environment.hs b/Cabal/src/Distribution/Compat/Environment.hs
index ffe278bcc54b6d2172c4e0281ad6755af75830b1..8cc9d582ad9c1b8484c0e3b7ee32b834020c987e 100644
--- a/Cabal/src/Distribution/Compat/Environment.hs
+++ b/Cabal/src/Distribution/Compat/Environment.hs
@@ -63,7 +63,7 @@ setEnv_ key value = withCWString key $ \k -> withCWString value $ \v -> do
 {- FOURMOLU_DISABLE -}
 # if defined(i386_HOST_ARCH)
 #  define WINDOWS_CCONV stdcall
-# elif defined(x86_64_HOST_ARCH)
+# elif defined(x86_64_HOST_ARCH) || defined(aarch64_HOST_ARCH)
 #  define WINDOWS_CCONV ccall
 # else
 #  error Unknown mingw32 arch
diff --git a/Cabal/src/Distribution/Simple/Build/PathsModule.hs b/Cabal/src/Distribution/Simple/Build/PathsModule.hs
index 892e5bd384fc4f7028814c5393502249a28db55b..dc8348f63961ab6294380b7c6310e498962f0c35 100644
--- a/Cabal/src/Distribution/Simple/Build/PathsModule.hs
+++ b/Cabal/src/Distribution/Simple/Build/PathsModule.hs
@@ -51,6 +51,7 @@ generatePathsModule pkg_descr lbi clbi =
       , Z.zIsWindows = isWindows
       , Z.zIsI386 = buildArch == I386
       , Z.zIsX8664 = buildArch == X86_64
+      , Z.zIsAarch64 = buildArch == AArch64
       , Z.zNot = not
       , Z.zManglePkgName = showPkgName
       , Z.zPrefix = show flat_prefix
diff --git a/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
index ad979c4295108e6af4ec4dfb75c07bbd7f27b8b1..7c36c4ce507e7a77215d1b3750c2381c3b606fe6 100644
--- a/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
+++ b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
@@ -12,6 +12,7 @@ data Z
          zIsWindows :: Bool,
          zIsI386 :: Bool,
          zIsX8664 :: Bool,
+         zIsAarch64 :: Bool,
          zPrefix :: FilePath,
          zBindir :: FilePath,
          zLibdir :: FilePath,
@@ -284,9 +285,16 @@ render z_root = execWriter $ do
             tell "  c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n"
             return ()
           else do
-            tell "-- win32 supported only with I386, X86_64\n"
-            tell "c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n"
-            tell "c_GetModuleFileName  = _\n"
+            if (zIsAarch64 z_root)
+            then do
+              tell "foreign import ccall unsafe \"windows.h GetModuleFileNameW\"\n"
+              tell "  c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n"
+              return ()
+            else do
+              tell "-- win32 supported only with I386, X86_64, Aarch64\n"
+              tell "c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n"
+              tell "c_GetModuleFileName  = _\n"
+              return ()
             return ()
           return ()
         tell "\n"
diff --git a/cabal-dev-scripts/src/GenPathsModule.hs b/cabal-dev-scripts/src/GenPathsModule.hs
index 46ef779e2aff9426dc289294206da9a2230aa3c4..ca7380c74df31167b5110256ebf984f5155d9f0c 100644
--- a/cabal-dev-scripts/src/GenPathsModule.hs
+++ b/cabal-dev-scripts/src/GenPathsModule.hs
@@ -32,6 +32,7 @@ $(capture "decls" [d|
         , zIsWindows                  :: Bool
         , zIsI386                     :: Bool
         , zIsX8664                    :: Bool
+        , zIsAarch64                  :: Bool
 
         , zPrefix     :: FilePath
         , zBindir     :: FilePath
diff --git a/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs b/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs
index e805c110d60a0299608a6c449446115c1a53751e..fa989a6bd0f34176cc3080f72e36cb9d58e205b0 100644
--- a/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs
+++ b/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs
@@ -123,7 +123,7 @@ getExecutablePath = readSymbolicLink $ "/proc/self/exe"
 
 # if defined(i386_HOST_ARCH)
 #  define WINDOWS_CCONV stdcall
-# elif defined(x86_64_HOST_ARCH)
+# elif defined(x86_64_HOST_ARCH) || defined(aarch64_HOST_ARCH)
 #  define WINDOWS_CCONV ccall
 # else
 #  error Unknown mingw32 arch
diff --git a/changelog.d/pr-10705 b/changelog.d/pr-10705
new file mode 100644
index 0000000000000000000000000000000000000000..e150428ca2798864872c99f3e14eaf39344807dc
--- /dev/null
+++ b/changelog.d/pr-10705
@@ -0,0 +1,8 @@
+---
+synopsis: 'Add support for Windows Aarch64'
+packages: [Cabal, cabal-install]
+prs: 10705
+---
+
+Adds to preprocessor branches the option to support `aarch64_HOST_ARCH` platform on Windows Aarch64 target.
+`ccall` convention is used at Aarch64, same as for `x86_64_HOST_ARCH`. Introduce `zIsAarch64` to make paths generation support Windows Aarch64 target.
diff --git a/templates/Paths_pkg.template.hs b/templates/Paths_pkg.template.hs
index bea7d6813e3c43bade1e210744f3e7131cd1fe5d..0f0017868ae3d035791206b6402707e36f7423f9 100644
--- a/templates/Paths_pkg.template.hs
+++ b/templates/Paths_pkg.template.hs
@@ -152,10 +152,13 @@ getPrefixDirRel dirRel = try_size 2048 -- plenty, PATH_MAX is 512 under Win32.
 foreign import stdcall unsafe "windows.h GetModuleFileNameW"
   c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32
 {% elif isX8664 %}
+foreign import ccall unsafe "windows.h GetModuleFileNameW"
+  c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32
+{% elif isAarch64 %}
 foreign import ccall unsafe "windows.h GetModuleFileNameW"
   c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32
 {% else %}
--- win32 supported only with I386, X86_64
+-- win32 supported only with I386, X86_64, Aarch64
 c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32
 c_GetModuleFileName  = _
 {% endif %}