typedef enum _PROCESS_MITIGATION_POLICY {
    ProcessDEPPolicy,
    ProcessASLRPolicy,
    ProcessDynamicCodePolicy,
    ProcessStrictHandleCheckPolicy,
    ProcessSystemCallDisablePolicy,
    ProcessMitigationOptionsMask,
    ProcessExtensionPointDisablePolicy,
    ProcessReserved1Policy,
    ProcessSignaturePolicy,
    MaxProcessMitigationPolicy
} PROCESS_MITIGATION_POLICY, *PPROCESS_MITIGATION_POLICY;


// DEP Policy

struct _ANON_PROCESS_MITIGATION_DEP_POLICY_BITFIELD {
    DWORD Enable : 1;
    DWORD DisableAtlThunkEmulation : 1;
    DWORD ReservedFlags : 30;
};

union _ANON_PROCESS_MITIGATION_DEP_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_DEP_POLICY_BITFIELD anon;
};

typedef struct _PROCESS_MITIGATION_DEP_POLICY {
  _ANON_PROCESS_MITIGATION_DEP_POLICY_UNION anon;
  BOOLEAN Permanent;
} PROCESS_MITIGATION_DEP_POLICY, *PPROCESS_MITIGATION_DEP_POLICY;


// ASLR policy

struct _ANON_PROCESS_MITIGATION_ASLR_POLICY_BITFIELD {
      DWORD EnableBottomUpRandomization : 1;
      DWORD EnableForceRelocateImages : 1;
      DWORD EnableHighEntropy : 1;
      DWORD DisallowStrippedImages : 1;
      DWORD ReservedFlags : 28;
};

union _ANON_PROCESS_MITIGATION_ASLR_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_ASLR_POLICY_BITFIELD anon;
};


typedef struct _PROCESS_MITIGATION_ASLR_POLICY {
    _ANON_PROCESS_MITIGATION_ASLR_POLICY_UNION anon;
} PROCESS_MITIGATION_ASLR_POLICY, *PPROCESS_MITIGATION_ASLR_POLICY;

// Dynamic code policy

struct _ANON_PROCESS_MITIGATION_DYNAMIC_CODE_POLICY_BITFIELD {
      DWORD ProhibitDynamicCode  :1;
      DWORD AllowThreadOptOut  :1;
      DWORD AllowRemoteDowngrade  :1;
      DWORD ReservedFlags  :30;
};

union _ANON_PROCESS_MITIGATION_DYNAMIC_CODE_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_DYNAMIC_CODE_POLICY_BITFIELD anon;
};

typedef struct _PROCESS_MITIGATION_DYNAMIC_CODE_POLICY {
    _ANON_PROCESS_MITIGATION_DYNAMIC_CODE_POLICY_UNION anon;
} PROCESS_MITIGATION_DYNAMIC_CODE_POLICY, *PPROCESS_MITIGATION_DYNAMIC_CODE_POLICY;


//Strict handle policy

struct _ANON_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY_BITFIELD {
  DWORD RaiseExceptionOnInvalidHandleReference : 1;
  DWORD HandleExceptionsPermanentlyEnabled : 1;
  DWORD ReservedFlags : 30;
};

union _ANON_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY_BITFIELD ANON_STRUCT;
};


typedef struct _PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY {
    _ANON_PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY_UNION  anon;
} PROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY, *PPROCESS_MITIGATION_STRICT_HANDLE_CHECK_POLICY;



// System Call policy

struct _ANON_PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY_BITFIELD {
    DWORD DisallowWin32kSystemCalls : 1;
    DWORD ReservedFlags : 31;
};

union _ANON_PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY_BITFIELD ANON_STRUCT;
};

typedef struct _PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY {
    _ANON_PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY_UNION  anon;
} PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY, *PPROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY;


// EXTENSION POINT policy

struct _ANON_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY_BITFIELD {
    DWORD DisableExtensionPoints : 1;
    DWORD ReservedFlags : 31;
};

union _ANON_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY_BITFIELD ANON_STRUCT;
};

typedef struct _PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY {
    _ANON_PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY_UNION  anon;
} PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY, *PPROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY;


// CFG policy

struct _ANON_PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY_BITFIELD {
      DWORD EnableControlFlowGuard  :1;
      DWORD EnableExportSuppression  :1;
      DWORD StrictMode  :1;
      DWORD ReservedFlags  :29;
};

union _ANON_PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY_BITFIELD ANON_STRUCT;
};

typedef struct _PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY  {
    _ANON_PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY_UNION  anon;
} PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY, *PPROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY;


// BINARY SIGNATURE  policy


struct _ANON_PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY_BITFIELD {
      DWORD MicrosoftSignedOnly  :1;
      DWORD StoreSignedOnly  :1;
      DWORD MitigationOptIn  :1;
      DWORD ReservedFlags  :29;
};

union _ANON_PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY_BITFIELD ANON_STRUCT;
};

typedef struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY  {
    _ANON_PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY_UNION  anon;
} PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY, *PPROCESS_MITIGATION_BINARY_SIGNATURE_POLICY;


// Font disable policy

struct _ANON_PROCESS_MITIGATION_IMAGE_LOAD_POLICY_BITFIELD {
      DWORD NoRemoteImages  :1;
      DWORD NoLowMandatoryLabelImages  :1;
      DWORD PreferSystem32Images  :1;
      DWORD ReservedFlags  :29;
};

union _ANON_PROCESS_MITIGATION_IMAGE_LOAD_POLICY_UNION {
    DWORD Flags;
    _ANON_PROCESS_MITIGATION_IMAGE_LOAD_POLICY_BITFIELD ANON_STRUCT;
};

typedef struct _PROCESS_MITIGATION_IMAGE_LOAD_POLICY  {
    _ANON_PROCESS_MITIGATION_IMAGE_LOAD_POLICY_UNION  anon;
} PROCESS_MITIGATION_IMAGE_LOAD_POLICY, *PPROCESS_MITIGATION_IMAGE_LOAD_POLICY;
