From f7f25b0e2f32a3c6eb778a229631a9a5c3979f92 Mon Sep 17 00:00:00 2001
From: bdbai <bdbaiapp@163.com>
Date: Sun, 11 Jun 2023 22:50:30 +0800
Subject: [PATCH 1/2] Add windows_sys typedef for Win ARM32

---
 library/std/src/sys/windows/c/windows_sys.rs   | 17 +++++++++++++++++
 src/tools/generate-windows-sys/src/arm_shim.rs | 17 +++++++++++++++++
 src/tools/generate-windows-sys/src/main.rs     |  4 ++++
 3 files changed, 38 insertions(+)
 create mode 100644 src/tools/generate-windows-sys/src/arm_shim.rs

diff --git a/library/std/src/sys/windows/c/windows_sys.rs b/library/std/src/sys/windows/c/windows_sys.rs
index 8c8b006a1d3d3..d3ecd70dc382b 100644
--- a/library/std/src/sys/windows/c/windows_sys.rs
+++ b/library/std/src/sys/windows/c/windows_sys.rs
@@ -4275,3 +4275,20 @@ impl ::core::clone::Clone for XSAVE_FORMAT {
         *self
     }
 }
+// Begin of ARM32 shim
+cfg_if::cfg_if! {
+if #[cfg(target_arch = "arm")] {
+#[repr(C)]
+pub struct WSADATA {
+    pub wVersion: u16,
+    pub wHighVersion: u16,
+    pub szDescription: [u8; 257],
+    pub szSystemStatus: [u8; 129],
+    pub iMaxSockets: u16,
+    pub iMaxUdpDg: u16,
+    pub lpVendorInfo: PSTR,
+}
+pub enum CONTEXT {}
+}
+}
+// End of ARM32 shim
diff --git a/src/tools/generate-windows-sys/src/arm_shim.rs b/src/tools/generate-windows-sys/src/arm_shim.rs
new file mode 100644
index 0000000000000..d70a214ebd7c6
--- /dev/null
+++ b/src/tools/generate-windows-sys/src/arm_shim.rs
@@ -0,0 +1,17 @@
+// Begin of ARM32 shim
+cfg_if::cfg_if! {
+if #[cfg(target_arch = "arm")] {
+#[repr(C)]
+pub struct WSADATA {
+    pub wVersion: u16,
+    pub wHighVersion: u16,
+    pub szDescription: [u8; 257],
+    pub szSystemStatus: [u8; 129],
+    pub iMaxSockets: u16,
+    pub iMaxUdpDg: u16,
+    pub lpVendorInfo: PSTR,
+}
+pub enum CONTEXT {}
+}
+}
+// End of ARM32 shim
diff --git a/src/tools/generate-windows-sys/src/main.rs b/src/tools/generate-windows-sys/src/main.rs
index 91d981462e816..65e480715ee20 100644
--- a/src/tools/generate-windows-sys/src/main.rs
+++ b/src/tools/generate-windows-sys/src/main.rs
@@ -11,6 +11,9 @@ const PRELUDE: &str = r#"// This file is autogenerated.
 // ignore-tidy-filelength
 "#;
 
+/// This is a shim for the ARM (32-bit) architecture, which is no longer supported by windows-rs.
+const ARM_SHIM: &str = include_str!("arm_shim.rs");
+
 fn main() -> io::Result<()> {
     let mut path: PathBuf =
         std::env::args_os().nth(1).expect("a path to the rust repository is required").into();
@@ -32,6 +35,7 @@ fn main() -> io::Result<()> {
     let mut f = std::fs::File::create(&path)?;
     f.write_all(PRELUDE.as_bytes())?;
     f.write_all(bindings.as_bytes())?;
+    f.write_all(ARM_SHIM.as_bytes())?;
 
     Ok(())
 }

From df08f56b089927fd5552b208d4c0a6cd3b8f12b0 Mon Sep 17 00:00:00 2001
From: bdbai <bdbaiapp@163.com>
Date: Mon, 12 Jun 2023 22:40:11 +0800
Subject: [PATCH 2/2] Add comment for arm_shim in generate-windows-sys

---
 library/std/src/sys/windows/c/windows_sys.rs   | 3 +++
 src/tools/generate-windows-sys/src/arm_shim.rs | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/library/std/src/sys/windows/c/windows_sys.rs b/library/std/src/sys/windows/c/windows_sys.rs
index d3ecd70dc382b..a4294f336feca 100644
--- a/library/std/src/sys/windows/c/windows_sys.rs
+++ b/library/std/src/sys/windows/c/windows_sys.rs
@@ -4276,6 +4276,9 @@ impl ::core::clone::Clone for XSAVE_FORMAT {
     }
 }
 // Begin of ARM32 shim
+// The raw content of this file should be processed by `generate-windows-sys`
+// to be merged with the generated binding. It is not supposed to be used as
+// a normal Rust module.
 cfg_if::cfg_if! {
 if #[cfg(target_arch = "arm")] {
 #[repr(C)]
diff --git a/src/tools/generate-windows-sys/src/arm_shim.rs b/src/tools/generate-windows-sys/src/arm_shim.rs
index d70a214ebd7c6..17c2ccb223cce 100644
--- a/src/tools/generate-windows-sys/src/arm_shim.rs
+++ b/src/tools/generate-windows-sys/src/arm_shim.rs
@@ -1,4 +1,7 @@
 // Begin of ARM32 shim
+// The raw content of this file should be processed by `generate-windows-sys`
+// to be merged with the generated binding. It is not supposed to be used as
+// a normal Rust module.
 cfg_if::cfg_if! {
 if #[cfg(target_arch = "arm")] {
 #[repr(C)]