crosvm: Remove DataInit from windows components

TEST=CQ
TEST=turn on building for perfetto, and rust-analyzer doesn't
complain about things I changed.

BUG=b:204409584

Change-Id: I4c290304028ecd155069d6194f776360d48b4220
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4618952
Auto-Submit: Zihan Chen <zihanchen@google.com>
Reviewed-by: Noah Gold <nkgold@google.com>
Commit-Queue: Noah Gold <nkgold@google.com>
Reviewed-by: Dennis Kempin <denniskempin@google.com>
diff --git a/Cargo.lock b/Cargo.lock
index 8c00a5a..bd81047 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1946,6 +1946,7 @@
  "protobuf",
  "serde",
  "sync",
+ "zerocopy",
 ]
 
 [[package]]
diff --git a/base/src/sys/windows/tube.rs b/base/src/sys/windows/tube.rs
index db88100..a0c188b 100644
--- a/base/src/sys/windows/tube.rs
+++ b/base/src/sys/windows/tube.rs
@@ -11,7 +11,7 @@
 use std::os::windows::io::RawHandle;
 use std::time::Duration;
 
-use data_model::DataInit;
+use data_model::zerocopy_from_slice;
 use log::warn;
 use once_cell::sync::Lazy;
 use serde::de::DeserializeOwned;
@@ -19,6 +19,8 @@
 use serde::Serialize;
 use serde::Serializer;
 use winapi::shared::winerror::ERROR_MORE_DATA;
+use zerocopy::AsBytes;
+use zerocopy::FromBytes;
 
 use crate::descriptor::AsRawDescriptor;
 use crate::descriptor::FromRawDescriptor;
@@ -80,16 +82,13 @@
     }
 }
 
-#[derive(Copy, Clone, Debug)]
+#[derive(Copy, Clone, Debug, AsBytes, FromBytes)]
 #[repr(C)]
 struct MsgHeader {
     msg_json_size: usize,
     descriptor_json_size: usize,
 }
 
-// Safe because it only has data and has no implicit padding.
-unsafe impl DataInit for MsgHeader {}
-
 static DH_TUBE: Lazy<sync::Mutex<Option<DuplicateHandleTube>>> =
     Lazy::new(|| sync::Mutex::new(None));
 static ALIAS_PID: Lazy<sync::Mutex<Option<u32>>> = Lazy::new(|| sync::Mutex::new(None));
@@ -242,10 +241,10 @@
     };
 
     let mut data_packet = Cursor::new(Vec::with_capacity(
-        header.as_slice().len() + header.msg_json_size + header.descriptor_json_size,
+        header.as_bytes().len() + header.msg_json_size + header.descriptor_json_size,
     ));
     data_packet
-        .write(header.as_slice())
+        .write(header.as_bytes())
         .map_err(Error::SendIoBuf)?;
     data_packet
         .write(msg_json.as_slice())
@@ -315,8 +314,8 @@
 
     // Safe because the header is always written by the send function, and only that function
     // writes to this channel.
-    let header =
-        MsgHeader::from_slice(header_bytes.as_slice()).expect("Tube header failed to deserialize.");
+    let header: &MsgHeader =
+        zerocopy_from_slice(header_bytes.as_slice()).expect("Tube header failed to deserialize.");
 
     let mut msg_json = vec![0u8; header.msg_json_size];
     perform_read(&mut read_fn, msg_json.as_mut_slice()).map_err(Error::from_recv_io_error)?;
diff --git a/perfetto/Cargo.toml b/perfetto/Cargo.toml
index 92b4e8b..fcb6204 100644
--- a/perfetto/Cargo.toml
+++ b/perfetto/Cargo.toml
@@ -24,6 +24,7 @@
 serde = { version = "1", features = [ "derive" ] }
 sha2 = { version = "*", optional = true }
 sync = { path = "../common/sync" }
+zerocopy = "*"
 
 [build-dependencies]
 proto_build_tools = { path = "../proto_build_tools" }
diff --git a/perfetto/src/lib.rs b/perfetto/src/lib.rs
index 2f35aef..9882de4 100644
--- a/perfetto/src/lib.rs
+++ b/perfetto/src/lib.rs
@@ -19,8 +19,9 @@
 pub use bindings::*;
 pub use cros_tracing_types::static_strings::StaticString;
 use cros_tracing_types::TraceDuration;
-use data_model::DataInit;
 use protobuf::Message;
+use zerocopy::AsBytes;
+use zerocopy::FromBytes;
 
 use protos::perfetto_config::trace_config::BufferConfig;
 use protos::perfetto_config::trace_config::DataSource;
@@ -34,16 +35,13 @@
 
 /// The optional header written ahead of the trace data.
 #[repr(C)]
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, AsBytes, FromBytes)]
 struct TraceHeader {
     magic: [u8; 16],
     data_size: u64,
     data_checksum_sha256: [u8; 32],
 }
 
-// Safe because TraceHeader has no implicit padding.
-unsafe impl DataInit for TraceHeader {}
-
 #[macro_export]
 macro_rules! zero {
     ($x:ident) => {
@@ -564,7 +562,7 @@
         };
         let mut trace_vec: Vec<u8> =
             Vec::with_capacity(size_of::<TraceHeader>() + trace_data.size as usize);
-        trace_vec.extend_from_slice(header.as_slice());
+        trace_vec.extend_from_slice(header.as_bytes());
         trace_vec.extend_from_slice(trace_data_slice);
 
         // Safe because trace data is a valid buffer created by ctrace_stop_trace_to_buffer and