//******************************************************************************// // UnsafeNative.cs // 12/4/2023 // // RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION // PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS // AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO // UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO // RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS // CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS // OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON // COMPANY. // // THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT // // UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY. // // WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE // EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED // BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION // 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION // 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER // OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER // LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS // BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT // APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL // PENALTIES. // // DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 : // FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R, // INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS // DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR // RECONSTRUCTION OF THE DOCUMENT. // POC: Alex Kravchenko (1118268) //******************************************************************************// // Ignore Spelling: COPYDATA using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Text; namespace Raytheon.LogDashboard.Helpers { internal static class UnsafeNative { public const int WM_COPYDATA = 0x004A; public static string GetMessage(int message, IntPtr lParam) { if (message == WM_COPYDATA) { try { var data = Marshal.PtrToStructure(lParam); string result = string.Copy(data.lpData); return result; } catch { return null; } } return null; } public static void SendMessage(IntPtr hwnd, string message) { byte[] messageBytes = Encoding.Unicode.GetBytes(message); /* ANSII encoding */ CopyDataStruct data = new CopyDataStruct { dwData = IntPtr.Zero, lpData = message, cbData = messageBytes.Length + 1 /* +1 because of \0 string termination */ }; if (SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, ref data) != 0) { throw new Win32Exception(Marshal.GetLastWin32Error()); } } [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref CopyDataStruct lParam); [StructLayout(LayoutKind.Sequential)] private struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPWStr)] public string lpData; } } }