diff --git a/build/win32/project/Makefile_agent b/build/win32/project/Makefile_agent
index 445e35f..14c477c 100644
--- a/build/win32/project/Makefile_agent
+++ b/build/win32/project/Makefile_agent
@@ -11,6 +11,10 @@ ADD_LFLAGS = /MACHINE:X86
 TARGETDIR = ..\..\..\bin\win64
 ADD_LFLAGS = /MACHINE:X64
 
+!ELSEIF "$(CPU)" == "ARM64"
+TARGETDIR = ..\..\..\bin\arm64
+ADD_LFLAGS = /MACHINE:ARM64
+
 !ELSE
 !ERROR Unsupported CPU architecture: $(CPU)
 !ENDIF
diff --git a/build/win32/project/Makefile_common.inc b/build/win32/project/Makefile_common.inc
index f4288b2..6cbd9de 100644
--- a/build/win32/project/Makefile_common.inc
+++ b/build/win32/project/Makefile_common.inc
@@ -14,10 +14,13 @@ INCS = /I $(PROJECTDIR) /I .\ /I ..\include  /I ..\include\common /I ..\..\..\in
 
 !IF "$(CPU)" == "i386" || "$(CPU)" == "x86"
 COMMON_FLAGS = /D _WIN32_WINNT=0x0502
-ADD_LFLAGS = $(ADD_LFLAGS) /SUBSYSTEM:"CONSOLE,5.01"
+ADD_LFLAGS = $(ADD_LFLAGS) /SUBSYSTEM:"CONSOLE,5.01" /DYNAMICBASE:NO
 !ELSEIF "$(CPU)" == "AMD64"
 COMMON_FLAGS = /D _WIN32_WINNT=0x0502
-ADD_LFLAGS = $(ADD_LFLAGS) /SUBSYSTEM:"CONSOLE,5.02"
+ADD_LFLAGS = $(ADD_LFLAGS) /SUBSYSTEM:"CONSOLE,5.02" /DYNAMICBASE:NO
+!ELSEIF "$(CPU)" == "ARM64"
+COMMON_FLAGS = /D _WIN32_WINNT=0x0A00
+ADD_LFLAGS = $(ADD_LFLAGS) /SUBSYSTEM:"CONSOLE,6.02" /DYNAMICBASE
 !ENDIF
 
 !IF "$(DEBUG)" != ""
@@ -34,6 +37,6 @@ CFLAGS = $(CFLAGS) $(INCS) $(ADD_CFLAGS) $(COMMON_FLAGS) /TC
 CPPFLAGS = $(INCS) $(ADD_CFLAGS) $(COMMON_FLAGS) /TP
 
 LFLAGS = /NOLOGO $(ADD_LFLAGS) /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"$(TARGETNAME).$(TARGETEXT).manifest" \
-	/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)\$(TARGETNAME).pdb
+	/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:$(TARGETDIR)\$(TARGETNAME).pdb
 
 RFLAGS = $(RFLAGS) $(ADD_RFLAGS) /d _WINDOWS
diff --git a/build/win32/project/Makefile_get b/build/win32/project/Makefile_get
index bd1a845..b98efeb 100644
--- a/build/win32/project/Makefile_get
+++ b/build/win32/project/Makefile_get
@@ -11,6 +11,10 @@ ADD_LFLAGS = /MACHINE:X86
 TARGETDIR = ..\..\..\bin\win64
 ADD_LFLAGS = /MACHINE:X64
 
+!ELSEIF "$(CPU)" == "ARM64"
+TARGETDIR = ..\..\..\bin\arm64
+ADD_LFLAGS = /MACHINE:ARM64
+
 !ELSE
 !ERROR Unsupported CPU architecture: $(CPU)
 !ENDIF
diff --git a/build/win32/project/Makefile_sender b/build/win32/project/Makefile_sender
index 85cd953..8237a41 100644
--- a/build/win32/project/Makefile_sender
+++ b/build/win32/project/Makefile_sender
@@ -11,6 +11,10 @@ ADD_LFLAGS = /MACHINE:X86
 TARGETDIR = ..\..\..\bin\win64
 ADD_LFLAGS = /MACHINE:X64
 
+!ELSEIF "$(CPU)" == "ARM64"
+TARGETDIR = ..\..\..\bin\arm64
+ADD_LFLAGS = /MACHINE:ARM64
+
 !ELSE
 !ERROR Unsupported CPU architecture: $(CPU)
 !ENDIF
diff --git a/build/win32/project/Makefile_sender_dll b/build/win32/project/Makefile_sender_dll
index 306150e..e2ef61e 100644
--- a/build/win32/project/Makefile_sender_dll
+++ b/build/win32/project/Makefile_sender_dll
@@ -11,6 +11,10 @@ ADD_LFLAGS = /MACHINE:X86
 TARGETDIR = ..\..\..\bin\win64\dev
 ADD_LFLAGS = /MACHINE:X64
 
+!ELSEIF "$(CPU)" == "ARM64"
+TARGETDIR = ..\..\..\bin\arm64\dev
+ADD_LFLAGS = /MACHINE:ARM64
+
 !ELSE
 !ERROR Unsupported CPU architecture: $(CPU)
 !ENDIF
diff --git a/include/zbxwin32.h b/include/zbxwin32.h
index cbc4313..f6392cb 100644
--- a/include/zbxwin32.h
+++ b/include/zbxwin32.h
@@ -103,7 +103,7 @@ DWORD		zbx_get_builtin_counter_index(zbx_builtin_counter_ref_t counter_ref);
 wchar_t		*zbx_get_all_counter_names(HKEY reg_key, wchar_t *reg_value_name);
 
 LONG		zbx_win_seh_handler(struct _EXCEPTION_POINTERS *ep);
-#ifdef _M_X64
+#if defined(_M_X64) || defined(_M_ARM64)
 LONG		zbx_win_veh_handler(struct _EXCEPTION_POINTERS *ep);
 #endif /* _M_X64 */
 
diff --git a/src/libs/zbxwin32/fatal.c b/src/libs/zbxwin32/fatal.c
index 5298938..6ae0cd7 100644
--- a/src/libs/zbxwin32/fatal.c
+++ b/src/libs/zbxwin32/fatal.c
@@ -25,7 +25,7 @@
 typedef BOOL (WINAPI *SymGetLineFromAddrW64_func_t)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64);
 typedef BOOL (WINAPI *SymFromAddr_func_t)(HANDLE a, DWORD64 b , PDWORD64 c, PSYMBOL_INFO d);
 
-#ifdef _M_X64
+#if defined(_M_X64) || defined(_M_ARM64)
 static void	print_register(const char *name, unsigned __int64 value)
 {
 	zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16I64x = %20I64u = %20I64d", name, value, value, value);
@@ -40,16 +40,18 @@ static void	print_register(const char *name, unsigned __int32 value)
 static void	print_fatal_info(CONTEXT *pctx)
 {
 	zabbix_log(LOG_LEVEL_CRIT, "====== Fatal information: ======");
-
+#ifndef _M_ARM64
 #ifdef _M_X64
 	zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%08lx", pctx->Rip);
 #else
 	zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%04x", pctx->Eip);
+#endif
 #endif
 	zabbix_log(LOG_LEVEL_CRIT, "=== Registers: ===");
 
 #define ZBX_LSHIFT(value, bits)	(((unsigned __int64)value) << bits)
 
+#ifndef _M_ARM64
 #ifdef _M_X64
 	print_register("r8", pctx->R8);
 	print_register("r9", pctx->R9);
@@ -86,6 +88,7 @@ static void	print_fatal_info(CONTEXT *pctx)
 	print_register("efl", pctx->EFlags);
 	print_register("csgsfs", ZBX_LSHIFT(pctx->SegCs, 24) | ZBX_LSHIFT(pctx->SegGs, 16) | ZBX_LSHIFT(pctx->SegFs, 8));
 #endif
+#endif
 
 #undef ZBX_LSHIFT
 }
@@ -124,7 +127,7 @@ static void	print_backtrace(CONTEXT *pctx)
 	s.AddrPC.Mode = AddrModeFlat;
 	s.AddrFrame.Mode = AddrModeFlat;
 	s.AddrStack.Mode = AddrModeFlat;
-
+#ifndef _M_ARM64
 #ifdef _M_X64
 	s.AddrPC.Offset = ctx.Rip;
 	s.AddrFrame.Offset = ctx.Rbp;
@@ -133,6 +136,7 @@ static void	print_backtrace(CONTEXT *pctx)
 	s.AddrPC.Offset = ctx.Eip;
 	s.AddrFrame.Offset = ctx.Ebp;
 	s.AddrStack.Offset = ctx.Esp;
+#endif
 #endif
 	hProcess = GetCurrentProcess();
 	hThread = GetCurrentThread();
@@ -173,6 +177,8 @@ static void	print_backtrace(CONTEXT *pctx)
 
 #ifdef _M_X64
 #define ZBX_IMAGE_FILE_MACHINE	IMAGE_FILE_MACHINE_AMD64
+#elif defined(_M_ARM64)
+#define ZBX_IMAGE_FILE_MACHINE	IMAGE_FILE_MACHINE_ARM64
 #else
 #define ZBX_IMAGE_FILE_MACHINE	IMAGE_FILE_MACHINE_I386
 #endif
@@ -201,7 +207,7 @@ static void	print_backtrace(CONTEXT *pctx)
 			if (NULL != zbx_SymFromAddr &&
 					TRUE == zbx_SymFromAddr(hProcess, s.AddrPC.Offset, &offset, pSym))
 			{
-#ifdef _M_X64
+#if defined(_M_X64) || defined(_M_ARM64)
 				zbx_uint64_t address = s.AddrPC.Offset;
 #else
 				zbx_uint32_t address = s.AddrPC.Offset;
@@ -267,7 +273,7 @@ LONG	zbx_win_seh_handler(struct _EXCEPTION_POINTERS *ep)
 	return EXCEPTION_CONTINUE_SEARCH;
 }
 
-#ifdef _M_X64
+#if defined(_M_X64) || defined(_M_ARM64)
 LONG	zbx_win_veh_handler(struct _EXCEPTION_POINTERS *ep)
 {
 	if (SUCCEED == ZBX_CHECK_LOG_LEVEL(LOG_LEVEL_TRACE))
diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c
index 2caf5d7..e5f6614 100644
--- a/src/zabbix_agent/zabbix_agentd.c
+++ b/src/zabbix_agent/zabbix_agentd.c
@@ -107,7 +107,9 @@ int	zbx_config_heartbeat_frequency	= 60;
 
 /* application TITLE */
 static const char	title_message[] = "zabbix_agentd"
-#if defined(_WIN64)
+#if defined(_M_ARM64)
+				" Win64arm"
+#elif defined(_WIN64)
 				" Win64"
 #elif defined(_WIN32)
 				" Win32"
@@ -1285,10 +1287,10 @@ int	MAIN_ZABBIX_ENTRY(int flags)
 #ifdef _WINDOWS
 	DWORD			res;
 
-#ifdef _M_X64
+#ifdef _M_X64 || defined(_M_ARM64)
 	if (NULL == AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)&zbx_win_veh_handler))
 		zabbix_log(LOG_LEVEL_TRACE, "failed to register vectored exception handler");
-#endif /* _M_X64 */
+#endif /* _M_X64 || defined(_M_ARM64) */
 #endif
 	if (0 != (flags & ZBX_TASK_FLAG_FOREGROUND))
 	{
