use core::mem::size_of;
use crate::ntapi_base::CLIENT_ID32;
use crate::ntldr::{LDR_DDAG_STATE, LDR_DLL_LOAD_REASON};
use crate::ntpsapi::GDI_HANDLE_BUFFER32;
use crate::ntrtl::RTL_MAX_DRIVE_LETTERS;
use crate::string::{UTF16Const, UTF8Const};
use winapi::shared::guiddef::GUID;
use winapi::shared::ntdef::{
    BOOLEAN, CHAR, LARGE_INTEGER, LCID, LIST_ENTRY32, LONG, NTSTATUS, PROCESSOR_NUMBER,
    SINGLE_LIST_ENTRY32, STRING32, UCHAR, ULARGE_INTEGER, ULONG, ULONGLONG, UNICODE_STRING,
    UNICODE_STRING32, USHORT, WCHAR,
};
use winapi::um::winnt::{FLS_MAXIMUM_AVAILABLE, NT_TIB32};
pub const WOW64_SYSTEM_DIRECTORY: UTF8Const = UTF8Const("SysWOW64\0");
/// "SysWOW64"
pub const WOW64_SYSTEM_DIRECTORY_U: UTF16Const = UTF16Const(&[
    0x0053, 0x0079, 0x0073, 0x0057, 0x004F, 0x0057, 0x0036, 0x0034, 0u16,
]);
pub const WOW64_X86_TAG: UTF8Const = UTF8Const(" (x86)\0");
/// " (x86)"
pub const WOW64_X86_TAG_U: UTF16Const = UTF16Const(&[
    0x0020, 0x0028, 0x0078, 0x0038, 0x0036, 0x0029, 0u16,
]);
ENUM!{enum WOW64_SHARED_INFORMATION {
    SharedNtdll32LdrInitializeThunk = 0,
    SharedNtdll32KiUserExceptionDispatcher = 1,
    SharedNtdll32KiUserApcDispatcher = 2,
    SharedNtdll32KiUserCallbackDispatcher = 3,
    SharedNtdll32ExpInterlockedPopEntrySListFault = 4,
    SharedNtdll32ExpInterlockedPopEntrySListResume = 5,
    SharedNtdll32ExpInterlockedPopEntrySListEnd = 6,
    SharedNtdll32RtlUserThreadStart = 7,
    SharedNtdll32pQueryProcessDebugInformationRemote = 8,
    SharedNtdll32BaseAddress = 9,
    SharedNtdll32LdrSystemDllInitBlock = 10,
    Wow64SharedPageEntriesCount = 11,
}}
STRUCT!{struct RTL_BALANCED_NODE32_u_s {
    Left: ULONG, // WOW64_POINTER
    Right: ULONG, // WOW64_POINTER
}}
UNION!{union RTL_BALANCED_NODE32_u {
    Children: [ULONG; 2], // WOW64_POINTER
    s: RTL_BALANCED_NODE32_u_s,
}}
STRUCT!{struct RTL_BALANCED_NODE32 {
    u: RTL_BALANCED_NODE32_u,
    ParentValue: ULONG,
}}
pub type PRTL_BALANCED_NODE32 = *mut RTL_BALANCED_NODE32;
STRUCT!{struct RTL_RB_TREE32 {
    Root: ULONG, // WOW64_POINTER
    Min: ULONG, // WOW64_POINTER
}}
pub type PRTL_RB_TREE32 = *mut RTL_RB_TREE32;
STRUCT!{struct PEB_LDR_DATA32 {
    Length: ULONG,
    Initialized: BOOLEAN,
    SsHandle: ULONG,
    InLoadOrderModuleList: LIST_ENTRY32,
    InMemoryOrderModuleList: LIST_ENTRY32,
    InInitializationOrderModuleList: LIST_ENTRY32,
    EntryInProgress: ULONG,
    ShutdownInProgress: BOOLEAN,
    ShutdownThreadId: ULONG,
}}
pub type PPEB_LDR_DATA32 = *mut PEB_LDR_DATA32;
STRUCT!{struct LDR_SERVICE_TAG_RECORD32 {
    Next: ULONG,
    ServiceTag: ULONG,
}}
pub type PLDR_SERVICE_TAG_RECORD32 = *mut LDR_SERVICE_TAG_RECORD32;
STRUCT!{struct LDRP_CSLIST32 {
    Tail: ULONG, // WOW64_POINTER
}}
pub type PLDRP_CSLIST32 = *mut LDRP_CSLIST32;
UNION!{union LDR_DDAG_NODE32_u {
    Dependencies: LDRP_CSLIST32,
    RemovalLink: SINGLE_LIST_ENTRY32,
}}
STRUCT!{struct LDR_DDAG_NODE32 {
    Modules: LIST_ENTRY32,
    ServiceTagList: ULONG, // WOW64_POINTER
    LoadCount: ULONG,
    LoadWhileUnloadingCount: ULONG,
    LowestLink: ULONG,
    u: LDR_DDAG_NODE32_u,
    IncomingDependencies: LDRP_CSLIST32,
    State: LDR_DDAG_STATE,
    CondenseLink: SINGLE_LIST_ENTRY32,
    PreorderNumber: ULONG,
}}
pub type PLDR_DDAG_NODE32 = *mut LDR_DDAG_NODE32;
pub const LDR_DATA_TABLE_ENTRY_SIZE_WINXP_32: usize = 80;
pub const LDR_DATA_TABLE_ENTRY_SIZE_WIN7_32: usize = 144;
pub const LDR_DATA_TABLE_ENTRY_SIZE_WIN8_32: usize = 152;
UNION!{union LDR_DATA_TABLE_ENTRY32_u1 {
    InInitializationOrderLinks: LIST_ENTRY32,
    InProgressLinks: LIST_ENTRY32,
}}
UNION!{union LDR_DATA_TABLE_ENTRY32_u2 {
    FlagGroup: [UCHAR; 4],
    Flags: ULONG,
}}
STRUCT!{struct LDR_DATA_TABLE_ENTRY32 {
    InLoadOrderLinks: LIST_ENTRY32,
    InMemoryOrderLinks: LIST_ENTRY32,
    u1: LDR_DATA_TABLE_ENTRY32_u1,
    DllBase: ULONG, // WOW64_POINTER
    EntryPoint: ULONG, // WOW64_POINTER
    SizeOfImage: ULONG,
    FullDllName: UNICODE_STRING32,
    BaseDllName: UNICODE_STRING32,
    u2: LDR_DATA_TABLE_ENTRY32_u2,
    ObsoleteLoadCount: USHORT,
    TlsIndex: USHORT,
    HashLinks: LIST_ENTRY32,
    TimeDateStamp: ULONG,
    EntryPointActivationContext: ULONG, // WOW64_POINTER
    Lock: ULONG, // WOW64_POINTER
    DdagNode: ULONG, // WOW64_POINTER
    NodeModuleLink: LIST_ENTRY32,
    LoadContext: ULONG, // WOW64_POINTER
    ParentDllBase: ULONG, // WOW64_POINTER
    SwitchBackContext: ULONG, // WOW64_POINTER
    BaseAddressIndexNode: RTL_BALANCED_NODE32,
    MappingInfoIndexNode: RTL_BALANCED_NODE32,
    OriginalBase: ULONG,
    LoadTime: LARGE_INTEGER,
    BaseNameHashValue: ULONG,
    LoadReason: LDR_DLL_LOAD_REASON,
    ImplicitPathOptions: ULONG,
    ReferenceCount: ULONG,
    DependentLoadFlags: ULONG,
    SigningLevel: UCHAR,
}}
BITFIELD!{unsafe LDR_DATA_TABLE_ENTRY32_u2 Flags: ULONG [
    PackagedBinary set_PackagedBinary[0..1],
    MarkedForRemoval set_MarkedForRemoval[1..2],
    ImageDll set_ImageDll[2..3],
    LoadNotificationsSent set_LoadNotificationsSent[3..4],
    TelemetryEntryProcessed set_TelemetryEntryProcessed[4..5],
    ProcessStaticImport set_ProcessStaticImport[5..6],
    InLegacyLists set_InLegacyLists[6..7],
    InIndexes set_InIndexes[7..8],
    ShimDll set_ShimDll[8..9],
    InExceptionTable set_InExceptionTable[9..10],
    ReservedFlags1 set_ReservedFlags1[10..12],
    LoadInProgress set_LoadInProgress[12..13],
    LoadConfigProcessed set_LoadConfigProcessed[13..14],
    EntryProcessed set_EntryProcessed[14..15],
    ProtectDelayLoad set_ProtectDelayLoad[15..16],
    ReservedFlags3 set_ReservedFlags3[16..18],
    DontCallForThreads set_DontCallForThreads[18..19],
    ProcessAttachCalled set_ProcessAttachCalled[19..20],
    ProcessAttachFailed set_ProcessAttachFailed[20..21],
    CorDeferredValidate set_CorDeferredValidate[21..22],
    CorImage set_CorImage[22..23],
    DontRelocate set_DontRelocate[23..24],
    CorILOnly set_CorILOnly[24..25],
    ReservedFlags5 set_ReservedFlags5[25..28],
    Redirected set_Redirected[28..29],
    ReservedFlags6 set_ReservedFlags6[29..31],
    CompatDatabaseProcessed set_CompatDatabaseProcessed[31..32],
]}
pub type PLDR_DATA_TABLE_ENTRY32 = *mut LDR_DATA_TABLE_ENTRY32;
STRUCT!{struct CURDIR32 {
    DosPath: UNICODE_STRING32,
    Handle: ULONG, // WOW64_POINTER
}}
pub type PCURDIR32 = *mut CURDIR32;
STRUCT!{struct RTL_DRIVE_LETTER_CURDIR32 {
    Flags: USHORT,
    Length: USHORT,
    TimeStamp: ULONG,
    DosPath: STRING32,
}}
pub type PRTL_DRIVE_LETTER_CURDIR32 = *mut RTL_DRIVE_LETTER_CURDIR32;
STRUCT!{struct RTL_USER_PROCESS_PARAMETERS32 {
    MaximumLength: ULONG,
    Length: ULONG,
    Flags: ULONG,
    DebugFlags: ULONG,
    ConsoleHandle: ULONG, // WOW64_POINTER
    ConsoleFlags: ULONG,
    StandardInput: ULONG, // WOW64_POINTER
    StandardOutput: ULONG, // WOW64_POINTER
    StandardError: ULONG, // WOW64_POINTER
    CurrentDirectory: CURDIR32,
    DllPath: UNICODE_STRING32,
    ImagePathName: UNICODE_STRING32,
    CommandLine: UNICODE_STRING32,
    Environment: ULONG, // WOW64_POINTER
    StartingX: ULONG,
    StartingY: ULONG,
    CountX: ULONG,
    CountY: ULONG,
    CountCharsX: ULONG,
    CountCharsY: ULONG,
    FillAttribute: ULONG,
    WindowFlags: ULONG,
    ShowWindowFlags: ULONG,
    WindowTitle: UNICODE_STRING32,
    DesktopInfo: UNICODE_STRING32,
    ShellInfo: UNICODE_STRING32,
    RuntimeData: UNICODE_STRING32,
    CurrentDirectories: [RTL_DRIVE_LETTER_CURDIR32; RTL_MAX_DRIVE_LETTERS],
    EnvironmentSize: ULONG,
    EnvironmentVersion: ULONG,
    PackageDependencyData: ULONG, // WOW64_POINTER
    ProcessGroupId: ULONG,
    LoaderThreads: ULONG,
}}
pub type PRTL_USER_PROCESS_PARAMETERS32 = *mut RTL_USER_PROCESS_PARAMETERS32;
UNION!{union PEB32_u {
    KernelCallbackTable: ULONG, // WOW64_POINTER
    UserSharedInfoPtr: ULONG, // WOW64_POINTER
}}
STRUCT!{struct PEB32 {
    InheritedAddressSpace: BOOLEAN,
    ReadImageFileExecOptions: BOOLEAN,
    BeingDebugged: BOOLEAN,
    BitField: BOOLEAN,
    Mutant: ULONG, // WOW64_POINTER
    ImageBaseAddress: ULONG, // WOW64_POINTER
    Ldr: ULONG, // WOW64_POINTER
    ProcessParameters: ULONG, // WOW64_POINTER
    SubSystemData: ULONG, // WOW64_POINTER
    ProcessHeap: ULONG, // WOW64_POINTER
    FastPebLock: ULONG, // WOW64_POINTER
    AtlThunkSListPtr: ULONG, // WOW64_POINTER
    IFEOKey: ULONG, // WOW64_POINTER
    CrossProcessFlags: ULONG,
    u: PEB32_u,
    SystemReserved: [ULONG; 1],
    AtlThunkSListPtr32: ULONG,
    ApiSetMap: ULONG, // WOW64_POINTER
    TlsExpansionCounter: ULONG,
    TlsBitmap: ULONG, // WOW64_POINTER
    TlsBitmapBits: [ULONG; 2],
    ReadOnlySharedMemoryBase: ULONG, // WOW64_POINTER
    HotpatchInformation: ULONG, // WOW64_POINTER
    ReadOnlyStaticServerData: ULONG, // WOW64_POINTER
    AnsiCodePageData: ULONG, // WOW64_POINTER
    OemCodePageData: ULONG, // WOW64_POINTER
    UnicodeCaseTableData: ULONG, // WOW64_POINTER
    NumberOfProcessors: ULONG,
    NtGlobalFlag: ULONG,
    CriticalSectionTimeout: LARGE_INTEGER,
    HeapSegmentReserve: ULONG,
    HeapSegmentCommit: ULONG,
    HeapDeCommitTotalFreeThreshold: ULONG,
    HeapDeCommitFreeBlockThreshold: ULONG,
    NumberOfHeaps: ULONG,
    MaximumNumberOfHeaps: ULONG,
    ProcessHeaps: ULONG, // WOW64_POINTER
    GdiSharedHandleTable: ULONG, // WOW64_POINTER
    ProcessStarterHelper: ULONG, // WOW64_POINTER
    GdiDCAttributeList: ULONG,
    LoaderLock: ULONG, // WOW64_POINTER
    OSMajorVersion: ULONG,
    OSMinorVersion: ULONG,
    OSBuildNumber: USHORT,
    OSCSDVersion: USHORT,
    OSPlatformId: ULONG,
    ImageSubsystem: ULONG,
    ImageSubsystemMajorVersion: ULONG,
    ImageSubsystemMinorVersion: ULONG,
    ActiveProcessAffinityMask: ULONG,
    GdiHandleBuffer: GDI_HANDLE_BUFFER32,
    PostProcessInitRoutine: ULONG, // WOW64_POINTER
    TlsExpansionBitmap: ULONG, // WOW64_POINTER
    TlsExpansionBitmapBits: [ULONG; 32],
    SessionId: ULONG,
    AppCompatFlags: ULARGE_INTEGER,
    AppCompatFlagsUser: ULARGE_INTEGER,
    pShimData: ULONG, // WOW64_POINTER
    AppCompatInfo: ULONG, // WOW64_POINTER
    CSDVersion: UNICODE_STRING32,
    ActivationContextData: ULONG, // WOW64_POINTER
    ProcessAssemblyStorageMap: ULONG, // WOW64_POINTER
    SystemDefaultActivationContextData: ULONG, // WOW64_POINTER
    SystemAssemblyStorageMap: ULONG, // WOW64_POINTER
    MinimumStackCommit: ULONG,
    FlsCallback: ULONG, // WOW64_POINTER
    FlsListHead: LIST_ENTRY32,
    FlsBitmap: ULONG, // WOW64_POINTER
    FlsBitmapBits: [ULONG; FLS_MAXIMUM_AVAILABLE as usize / (size_of::<ULONG>() * 8)],
    FlsHighIndex: ULONG,
    WerRegistrationData: ULONG, // WOW64_POINTER
    WerShipAssertPtr: ULONG, // WOW64_POINTER
    pContextData: ULONG, // WOW64_POINTER
    pImageHeaderHash: ULONG, // WOW64_POINTER
    TracingFlags: ULONG,
    CsrServerReadOnlySharedMemoryBase: ULONGLONG,
    TppWorkerpListLock: ULONG, // WOW64_POINTER
    TppWorkerpList: LIST_ENTRY32,
    WaitOnAddressHashTable: [ULONG; 128], // WOW64_POINTER
    TelemetryCoverageHeader: ULONG, // WOW64_POINTER
    CloudFileFlags: ULONG,
    CloudFileDiagFlags: ULONG,
    PlaceholderCompatibilityMode: CHAR,
    PlaceholderCompatibilityModeReserved: [CHAR; 7],
}}
BITFIELD!{PEB32 BitField: BOOLEAN [
    ImageUsesLargePages set_ImageUsesLargePages[0..1],
    IsProtectedProcess set_IsProtectedProcess[1..2],
    IsImageDynamicallyRelocated set_IsImageDynamicallyRelocated[2..3],
    SkipPatchingUser32Forwarders set_SkipPatchingUser32Forwarders[3..4],
    IsPackagedProcess set_IsPackagedProcess[4..5],
    IsAppContainer set_IsAppContainer[5..6],
    IsProtectedProcessLight set_IsProtectedProcessLight[6..7],
    IsLongPathAwareProcess set_IsLongPathAwareProcess[7..8],
]}
BITFIELD!{PEB32 CrossProcessFlags: ULONG [
    ProcessInJob set_ProcessInJob[0..1],
    ProcessInitializing set_ProcessInitializing[1..2],
    ProcessUsingVEH set_ProcessUsingVEH[2..3],
    ProcessUsingVCH set_ProcessUsingVCH[3..4],
    ProcessUsingFTH set_ProcessUsingFTH[4..5],
    ReservedBits0 set_ReservedBits0[5..32],
]}
BITFIELD!{PEB32 TracingFlags: ULONG [
    HeapTracingEnabled set_HeapTracingEnabled[0..1],
    CritSecTracingEnabled set_CritSecTracingEnabled[1..2],
    LibLoaderTracingEnabled set_LibLoaderTracingEnabled[2..3],
    SpareTracingBits set_SpareTracingBits[3..32],
]}
pub type PPEB32 = *mut PEB32;
pub const GDI_BATCH_BUFFER_SIZE: usize = 310;
STRUCT!{struct GDI_TEB_BATCH32 {
    Offset: ULONG,
    HDC: ULONG,
    Buffer: [ULONG; GDI_BATCH_BUFFER_SIZE],
}}
pub type PGDI_TEB_BATCH32 = *mut GDI_TEB_BATCH32;
STRUCT!{struct TEB32_u_s {
    ReservedPad0: UCHAR,
    ReservedPad1: UCHAR,
    ReservedPad2: UCHAR,
    IdealProcessor: UCHAR,
}}
UNION!{union TEB32_u {
    CurrentIdealProcessor: PROCESSOR_NUMBER,
    IdealProcessorValue: ULONG,
    s: TEB32_u_s,
}}
STRUCT!{struct TEB32 {
    NtTib: NT_TIB32,
    EnvironmentPointer: ULONG, // WOW64_POINTER
    ClientId: CLIENT_ID32,
    ActiveRpcHandle: ULONG, // WOW64_POINTER
    ThreadLocalStoragePointer: ULONG, // WOW64_POINTER
    ProcessEnvironmentBlock: ULONG, // WOW64_POINTER
    LastErrorValue: ULONG,
    CountOfOwnedCriticalSections: ULONG,
    CsrClientThread: ULONG, // WOW64_POINTER
    Win32ThreadInfo: ULONG, // WOW64_POINTER
    User32Reserved: [ULONG; 26],
    UserReserved: [ULONG; 5],
    WOW32Reserved: ULONG, // WOW64_POINTER
    CurrentLocale: LCID,
    FpSoftwareStatusRegister: ULONG,
    ReservedForDebuggerInstrumentation: [ULONG; 16], // WOW64_POINTER
    SystemReserved1: [ULONG; 36], // WOW64_POINTER
    WorkingOnBehalfTicket: [UCHAR; 8],
    ExceptionCode: NTSTATUS,
    ActivationContextStackPointer: ULONG, // WOW64_POINTER
    InstrumentationCallbackSp: ULONG,
    InstrumentationCallbackPreviousPc: ULONG,
    InstrumentationCallbackPreviousSp: ULONG,
    InstrumentationCallbackDisabled: BOOLEAN,
    SpareBytes: [UCHAR; 23],
    TxFsContext: ULONG,
    GdiTebBatch: GDI_TEB_BATCH32,
    RealClientId: CLIENT_ID32,
    GdiCachedProcessHandle: ULONG, // WOW64_POINTER
    GdiClientPID: ULONG,
    GdiClientTID: ULONG,
    GdiThreadLocalInfo: ULONG, // WOW64_POINTER
    Win32ClientInfo: [ULONG; 62],
    glDispatchTable: [ULONG; 233], // WOW64_POINTER
    glReserved1: [ULONG; 29], // WOW64_POINTER
    glReserved2: ULONG, // WOW64_POINTER
    glSectionInfo: ULONG, // WOW64_POINTER
    glSection: ULONG, // WOW64_POINTER
    glTable: ULONG, // WOW64_POINTER
    glCurrentRC: ULONG, // WOW64_POINTER
    glContext: ULONG, // WOW64_POINTER
    LastStatusValue: NTSTATUS,
    StaticUnicodeString: UNICODE_STRING32,
    StaticUnicodeBuffer: [WCHAR; 261],
    DeallocationStack: ULONG, // WOW64_POINTER
    TlsSlots: [ULONG; 64], // WOW64_POINTER
    TlsLinks: LIST_ENTRY32,
    Vdm: ULONG, // WOW64_POINTER
    ReservedForNtRpc: ULONG, // WOW64_POINTER
    DbgSsReserved: [ULONG; 2], // WOW64_POINTER
    HardErrorMode: ULONG,
    Instrumentation: [ULONG; 9], // WOW64_POINTER
    ActivityId: GUID,
    SubProcessTag: ULONG, // WOW64_POINTER
    PerflibData: ULONG, // WOW64_POINTER
    EtwTraceData: ULONG, // WOW64_POINTER
    WinSockData: ULONG, // WOW64_POINTER
    GdiBatchCount: ULONG,
    u: TEB32_u,
    GuaranteedStackBytes: ULONG,
    ReservedForPerf: ULONG, // WOW64_POINTER
    ReservedForOle: ULONG, // WOW64_POINTER
    WaitingOnLoaderLock: ULONG,
    SavedPriorityState: ULONG, // WOW64_POINTER
    ReservedForCodeCoverage: ULONG,
    ThreadPoolData: ULONG, // WOW64_POINTER
    TlsExpansionSlots: ULONG, // WOW64_POINTER
    MuiGeneration: ULONG,
    IsImpersonating: ULONG,
    NlsCache: ULONG, // WOW64_POINTER
    pShimData: ULONG, // WOW64_POINTER
    HeapVirtualAffinity: USHORT,
    LowFragHeapDataSlot: USHORT,
    CurrentTransactionHandle: ULONG, // WOW64_POINTER
    ActiveFrame: ULONG, // WOW64_POINTER
    FlsData: ULONG, // WOW64_POINTER
    PreferredLanguages: ULONG, // WOW64_POINTER
    UserPrefLanguages: ULONG, // WOW64_POINTER
    MergedPrefLanguages: ULONG, // WOW64_POINTER
    MuiImpersonation: ULONG,
    CrossTebFlags: USHORT,
    SameTebFlags: USHORT,
    TxnScopeEnterCallback: ULONG, // WOW64_POINTER
    TxnScopeExitCallback: ULONG, // WOW64_POINTER
    TxnScopeContext: ULONG, // WOW64_POINTER
    LockCount: ULONG,
    WowTebOffset: LONG,
    ResourceRetValue: ULONG, // WOW64_POINTER
    ReservedForWdf: ULONG, // WOW64_POINTER
    ReservedForCrt: ULONGLONG,
    EffectiveContainerId: GUID,
}}
BITFIELD!{TEB32 SameTebFlags: USHORT [
    SafeThunkCall set_SafeThunkCall[0..1],
    InDebugPrint set_InDebugPrint[1..2],
    HasFiberData set_HasFiberData[2..3],
    SkipThreadAttach set_SkipThreadAttach[3..4],
    WerInShipAssertCode set_WerInShipAssertCode[4..5],
    RanProcessInit set_RanProcessInit[5..6],
    ClonedThread set_ClonedThread[6..7],
    SuppressDebugMsg set_SuppressDebugMsg[7..8],
    DisableUserStackWalk set_DisableUserStackWalk[8..9],
    RtlExceptionAttached set_RtlExceptionAttached[9..10],
    InitialThread set_InitialThread[10..11],
    SessionAware set_SessionAware[11..12],
    LoadOwner set_LoadOwner[12..13],
    LoaderWorker set_LoaderWorker[13..14],
    SpareSameTebBits set_SpareSameTebBits[14..16],
]}
pub type PTEB32 = *mut TEB32;
#[inline]
pub fn UStr32ToUStr(
    Destination: &mut UNICODE_STRING,
    Source: &UNICODE_STRING32,
) {
    Destination.Length = Source.Length;
    Destination.MaximumLength = Source.MaximumLength;
    Destination.Buffer = Source.Buffer as *mut u16;
}
#[inline]
pub fn UStrToUStr32(
    Destination: &mut UNICODE_STRING32,
    Source: &UNICODE_STRING,
) {
    Destination.Length = Source.Length;
    Destination.MaximumLength = Source.MaximumLength;
    Destination.Buffer = Source.Buffer as u32;
}