diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6068c7a1ff9ef622f225b3e6fffca9472b0e240c..c5fed3fd046377bb5d29ca0c54dfa6949d235647 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -24,7 +24,7 @@ if (MSVC)
     # Ensure that projects build with Unicode support.
     add_definitions(-DUNICODE -D_UNICODE)
 
-    # /W3                 - Level 3 warnings
+    # /W4                 - Level 4 warnings
     # /MP                 - Multi-threaded compilation
     # /Zi                 - Output debugging information
     # /Zm                 - Specifies the precompiled header memory allocation limit
@@ -61,7 +61,7 @@ if (MSVC)
         /external:W0            # Sets the default warning level to 0 for external headers, effectively turning off warnings for external headers
 
         # Warnings
-        /W3
+        /W4
         /WX
 
         /we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
@@ -84,12 +84,16 @@ if (MSVC)
 
         /wd4100 # 'identifier': unreferenced formal parameter
         /wd4324 # 'struct_name': structure was padded due to __declspec(align())
+        /wd4201 # nonstandard extension used : nameless struct/union
     )
 
     if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS)
     # when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format
     # Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21
         add_compile_options(/Z7)
+        # Avoid D9025 warning
+        string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+        string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
     else()
         add_compile_options(/Zi)
     endif()
diff --git a/src/audio_core/audio_event.cpp b/src/audio_core/audio_event.cpp
index d15568e1f078529bc814b6b9b2b62b2eb654d511..c23ef09900beb93a076ee0c3aaa095314f9d4127 100644
--- a/src/audio_core/audio_event.cpp
+++ b/src/audio_core/audio_event.cpp
@@ -20,7 +20,6 @@ size_t Event::GetManagerIndex(const Type type) const {
     default:
         UNREACHABLE();
     }
-    return 3;
 }
 
 void Event::SetAudioEvent(const Type type, const bool signalled) {
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index bf97d9ba28ec7f223dbaa8741bdcca6689311055..6d2badf76fbb7b344245d0f78c8640e92e72e6a7 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -191,8 +191,6 @@ if (MSVC)
     _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
   )
   target_compile_options(common PRIVATE
-    /W4
-
     /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
     /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
     /we4800 # Implicit conversion from 'type' to bool. Possible information loss
diff --git a/src/core/hle/kernel/k_capabilities.cpp b/src/core/hle/kernel/k_capabilities.cpp
index 90e4e8fb087d8b733f1d2d76e3b3196697cbfc46..e7da7a21d403ea85b83d6627ca00abe033ff91d1 100644
--- a/src/core/hle/kernel/k_capabilities.cpp
+++ b/src/core/hle/kernel/k_capabilities.cpp
@@ -156,7 +156,6 @@ Result KCapabilities::MapIoPage_(const u32 cap, KPageTable* page_table) {
     const u64 phys_addr = MapIoPage{cap}.address.Value() * PageSize;
     const size_t num_pages = 1;
     const size_t size = num_pages * PageSize;
-    R_UNLESS(num_pages != 0, ResultInvalidSize);
     R_UNLESS(phys_addr < phys_addr + size, ResultInvalidAddress);
     R_UNLESS(((phys_addr + size - 1) & ~PhysicalMapAllowedMask) == 0, ResultInvalidAddress);
 
diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp
index a51ca54447dd3045151763c19d2ea4fd2bee37cd..0ca05257e75d4a701b797dc375067185c305f0d1 100644
--- a/src/core/hle/service/nvdrv/core/nvmap.cpp
+++ b/src/core/hle/service/nvdrv/core/nvmap.cpp
@@ -160,8 +160,8 @@ u32 NvMap::PinHandle(NvMap::Handle::Id handle) {
         u32 address{};
         auto& smmu_allocator = host1x.Allocator();
         auto& smmu_memory_manager = host1x.MemoryManager();
-        while (!(address =
-                     smmu_allocator.Allocate(static_cast<u32>(handle_description->aligned_size)))) {
+        while ((address = smmu_allocator.Allocate(
+                    static_cast<u32>(handle_description->aligned_size))) == 0) {
             // Free handles until the allocation succeeds
             std::scoped_lock queueLock(unmap_queue_lock);
             if (auto freeHandleDesc{unmap_queue.front()}) {
diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp
index d834a0c1f904329180fbfe02b403f8cdb5ad972c..212057cfc961de283ff690255e1544f28d9e465a 100644
--- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp
+++ b/src/core/hle/service/ssl/ssl_backend_schannel.cpp
@@ -477,7 +477,8 @@ public:
             return ResultInternalError;
         }
         PCCERT_CONTEXT some_cert = nullptr;
-        while ((some_cert = CertEnumCertificatesInStore(returned_cert->hCertStore, some_cert))) {
+        while ((some_cert = CertEnumCertificatesInStore(returned_cert->hCertStore, some_cert)) !=
+               nullptr) {
             out_certs->emplace_back(static_cast<u8*>(some_cert->pbCertEncoded),
                                     static_cast<u8*>(some_cert->pbCertEncoded) +
                                         some_cert->cbCertEncoded);
diff --git a/src/dedicated_room/yuzu_room.cpp b/src/dedicated_room/yuzu_room.cpp
index d707dabe281412527e3e5283d1fb0aa34dc045a1..93038f161b0226f41662abbb74d990b725dbb849 100644
--- a/src/dedicated_room/yuzu_room.cpp
+++ b/src/dedicated_room/yuzu_room.cpp
@@ -368,9 +368,9 @@ int main(int argc, char** argv) {
     if (auto room = network.GetRoom().lock()) {
         AnnounceMultiplayerRoom::GameInfo preferred_game_info{.name = preferred_game,
                                                               .id = preferred_game_id};
-        if (!room->Create(room_name, room_description, bind_address, port, password, max_members,
-                          username, preferred_game_info, std::move(verify_backend), ban_list,
-                          enable_yuzu_mods)) {
+        if (!room->Create(room_name, room_description, bind_address, static_cast<u16>(port),
+                          password, max_members, username, preferred_game_info,
+                          std::move(verify_backend), ban_list, enable_yuzu_mods)) {
             LOG_INFO(Network, "Failed to create room: ");
             return -1;
         }
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index 322c290655e4c59e375280af61ebe754de58fa57..5c127c8ef33dce53e27273d0fb1daad11d7cbf82 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -37,8 +37,6 @@ add_library(input_common STATIC
 
 if (MSVC)
     target_compile_options(input_common PRIVATE
-        /W4
-
         /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
         /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
         /we4800 # Implicit conversion from 'type' to bool. Possible information loss
diff --git a/src/network/room.cpp b/src/network/room.cpp
index e456ea09c610425c847df9be5fd950d8f58f5fac..d87db37de6794ebd21e0f7e521a7204b73f30e5b 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -805,7 +805,7 @@ IPv4Address Room::RoomImpl::GenerateFakeIPAddress() {
     std::uniform_int_distribution<> dis(0x01, 0xFE); // Random byte between 1 and 0xFE
     do {
         for (std::size_t i = 2; i < result_ip.size(); ++i) {
-            result_ip[i] = dis(random_gen);
+            result_ip[i] = static_cast<u8>(dis(random_gen));
         }
     } while (!IsValidFakeIPAddress(result_ip));
 
diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt
index 07e75f9d8db26a3bcde5e1274d1fe6545ef4ea09..83b763447e58d865be28c39750563f73acf7dc48 100644
--- a/src/shader_recompiler/CMakeLists.txt
+++ b/src/shader_recompiler/CMakeLists.txt
@@ -245,8 +245,6 @@ target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit)
 
 if (MSVC)
     target_compile_options(shader_recompiler PRIVATE
-        /W4
-
         /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
         /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
         /we4800 # Implicit conversion from 'type' to bool. Possible information loss
diff --git a/src/tests/common/ring_buffer.cpp b/src/tests/common/ring_buffer.cpp
index e85f9977b5905711f4272999506c624738d903b6..b6e3bc87515d68058d09af8b0df409d6125e2df9 100644
--- a/src/tests/common/ring_buffer.cpp
+++ b/src/tests/common/ring_buffer.cpp
@@ -55,7 +55,7 @@ TEST_CASE("RingBuffer: Basic Tests", "[common]") {
     // Pushing more values than space available should partially succeed.
     {
         std::vector<char> to_push(6);
-        std::iota(to_push.begin(), to_push.end(), 88);
+        std::iota(to_push.begin(), to_push.end(), static_cast<char>(88));
         const std::size_t count = buf.Push(to_push);
         REQUIRE(count == 3U);
     }
diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp
index 7721e58f9567df89d60a0fd0213574f3c26e0cf6..d63093985b387e3cbc0c72fd894ebe7aa2a0e8e7 100644
--- a/src/yuzu/configuration/shared_widget.cpp
+++ b/src/yuzu/configuration/shared_widget.cpp
@@ -194,7 +194,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,
         return group;
     }
 
-    const auto get_selected = [=]() -> u32 {
+    const auto get_selected = [=]() -> int {
         for (const auto& [id, button] : radio_buttons) {
             if (button->isChecked()) {
                 return id;
diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp
index d0433ffc650c753baadb3a9ba4b8cd6af2509525..c1695cc6e40beb6ee7cf17c41e71c10296fa929e 100644
--- a/src/yuzu_cmd/yuzu.cpp
+++ b/src/yuzu_cmd/yuzu.cpp
@@ -265,7 +265,7 @@ int main(int argc, char** argv) {
                 password = match[2];
                 address = match[3];
                 if (!match[4].str().empty())
-                    port = std::stoi(match[4]);
+                    port = static_cast<u16>(std::stoi(match[4]));
                 std::regex nickname_re("^[a-zA-Z0-9._\\- ]+$");
                 if (!std::regex_match(nickname, nickname_re)) {
                     std::cout