/** @file
  Variable Write Architectural Protocol as defined in PI Specification VOLUME 2 DXE

  This provides the services required to set nonvolatile environment variables. 
  This protocol must be produced by a runtime DXE driver and may be consumed only 
  by the DXE Foundation.

  The DXE driver that produces this protocol must be a runtime driver. This driver 
  may update the SetVariable() field of the UEFI Runtime Services Table.
  
  After the UEFI Runtime Services Table has been initialized, the driver must 
  install the EFI_VARIABLE_WRITE_ARCH_PROTOCOL_GUID on a new handle with a NULL 
  interface pointer. The installation of this protocol informs the DXE Foundation 
  that the write services for nonvolatile environment variables are now available 
  and that the DXE Foundation must update the 32-bit CRC of the UEFI Runtime Services 
  Table. The full complement of environment variable services are not available 
  until both this protocol and EFI_VARIABLE_ARCH_PROTOCOL are installed. DXE drivers 
  that require read-only access or read/write access to volatile environment variables
  must have the EFI_VARIABLE_WRITE_ARCH_PROTOCOL in their dependency expressions.
  DXE drivers that require write access to nonvolatile environment variables must 
  have this architectural protocol in their dependency expressions.  
  
  Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials                          
  are licensed and made available under the terms and conditions of the BSD License         
  which accompanies this distribution.  The full text of the license may be found at        
  http://opensource.org/licenses/bsd-license.php                                            

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

**/

#ifndef __ARCH_PROTOCOL_VARIABLE_WRITE_ARCH_H__
#define __ARCH_PROTOCOL_VARIABLE_WRITE_ARCH_H__

///
/// Global ID for the Variable Write Architectural Protocol
///
#define EFI_VARIABLE_WRITE_ARCH_PROTOCOL_GUID \
  { 0x6441f818, 0x6362, 0x4e44, {0xb5, 0x70, 0x7d, 0xba, 0x31, 0xdd, 0x24, 0x53 } }

extern EFI_GUID gEfiVariableWriteArchProtocolGuid;

#endif 
