audk/IntelFrameworkModulePkg/Csm/BiosThunk/Snp16Dxe/Pxe.h

607 lines
22 KiB
C

/** @file
These are PXE Specification 2.1-compliant data structures and defines.
This file relies upon the existence of a PXE-compliant ROM
in memory, as defined by the Preboot Execution Environment
Specification (PXE), Version 2.1, located at
http://developer.intel.com/ial/wfm/wfmspecs.htm
Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _PXEDEF_H_
#define _PXEDEF_H_
#pragma pack(1)
//
// PXE structure signatures
//
#define BC_ROMID_SIG "$BC$"
#define UNDI_ROMID_SIG "UNDI"
#define BUSD_ROMID_SIG "BUSD"
#define PXE_SIG "!PXE"
#define PXENV_SIG "PXENV+"
#define BC_ROMID_REV 0x00
#define UNDI_ROMID_REV 0x00
#define BUSD_ROMID_REV 0x00
#define PXE_REV 0x00
#define PXENV_REV 0x0201
#define PXENV_PTR SIGNATURE_32 ('P', 'X', 'E', 'N')
#define PXE_PTR SIGNATURE_32 ('!', 'P', 'X', 'E')
#define UNDI_ROMID_SIG_PTR SIGNATURE_32 ('U', 'N', 'D', 'I')
typedef UINT16 SEGSEL; // Real mode segment or protected mode selector.
typedef UINT16 OFF16; // Unsigned 16bit offset.
typedef UINT32 ADDR32;
//
// Bus types
//
#define PXENV_BUS_ISA 0
#define PXENV_BUS_EISA 1
#define PXENV_BUS_MCA 2
#define PXENV_BUS_PCI 3
#define PXENV_BUS_VESA 4
#define PXENV_BUS_PCMCIA 5
//
//
// Result codes returned in AX by a PXENV API service.
//
#define PXENV_EXIT_SUCCESS 0x0000
#define PXENV_EXIT_FAILURE 0x0001
//
// Status codes returned in the status word of PXENV API parameter structures.
//
// Generic API errors - these do not match up with the M0x or E0x messages
// that are reported by the loader.
//
#define PXENV_STATUS_SUCCESS 0x00
#define PXENV_STATUS_FAILURE 0x01
#define PXENV_STATUS_BAD_FUNC 0x02
#define PXENV_STATUS_UNSUPPORTED 0x03
#define PXENV_STATUS_KEEP_UNDI 0x04
#define PXENV_STATUS_KEEP_ALL 0x05
#define PXENV_STATUS_OUT_OF_RESOURCES 0x06
typedef enum {
PxeEnvStatus_Success,
PxeEnvStatus_Failure,
PxeEnvStatus_BadFunc,
PxeEnvStatus_Unsupported,
PxeEnvStatus_KeepUndi,
PxeEnvStatus_KeepAll
} EFI_PXE_STATUS;
/* Driver errors (0x60 to 0x6F) */
// These errors are for UNDI compatible NIC drivers.
#define PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60
#define PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61
#define PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63
#define PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64
#define PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65
#define PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66
#define PXENV_STATUS_UNDI_BAD_MAC_ADDR 0x67
#define PXENV_STATUS_UNDI_BAD_EEPROM_CKSUM 0x68
#define PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
#define PXENV_STATUS_UNDI_INVALID_STATE 0x6A
#define PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B
#define PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C
typedef struct {
UINT16 Seg_Addr;
UINT32 Phy_Addr;
UINT16 Seg_Size;
} NEWSEGDESC_T;
typedef struct {
OFF16 Offset;
SEGSEL Segment;
} SEGOFF16;
typedef struct {
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
UINT8 StructLength; ///< Length of this structure in bytes.
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
UINT8 StructRev; ///< Structure format revision number.
UINT8 UNDI_Rev[3]; ///< API revision number stored in Intel order.
//
// Revision 2.1.0 == 0x00, 0x01, 0x02
//
UINT16 UNDI_Loader; ///< Offset of UNDI loader routine in the option ROM image.
UINT16 StackSize; ///< Minimum stack segment size, in bytes, needed to load and run the UNDI.
UINT16 DataSize; ///< UNDI runtime code and data
UINT16 CodeSize; ///< segment sizes.
UINT8 BusType[4]; ///< 'ISAR', 'EISA', 'PCIR', 'PCCR'
} UNDI_ROMID_T;
typedef struct {
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
UINT8 StructLength; ///< Length of this structure in bytes.
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
UINT8 StructRev; ///< Structure format revision number.
UINT8 BC_Rev[3]; ///< API revision number stored in Intel order.
//
// Revision 2.1.0 == 0x00, 0x01, 0x02
//
UINT16 BC_Loader; ///< Offset of base-code loader routine in the option ROM image.
UINT16 StackSize; ///< Minimum stack segment size (bytes) needed to load/run base-code.
UINT16 DataSize; ///< Base-code runtime code and data
UINT16 CodeSize; ///< segment sizes.
} BC_ROMID_T;
typedef struct {
UINT8 Signature[4]; ///< Structure signature is not NULL terminated.
UINT8 StructLength; ///< Length of this structure in bytes.
UINT8 StructCksum; ///< Use to make byte checksum of this structure == zero.
UINT8 StructRev; ///< Structure format revision number.
UINT8 Reserved1; ///< must be zero
///
/// UNDI_ROMID_T __FAR *UNDI;// Far pointer to UNDI ROMID
///
SEGOFF16 Undi;
///
/// BC_ROMID_T __FAR *Base; // Far pointer to base-code ROMID
///
SEGOFF16 Base;
///
/// UINT16 (__FAR __CDECL *EntryPointSP)(UINT16 func, VOID __FAR *param);
/// 16bit stack segment API entry point. This will be seg:off in
/// real mode and sel:off in 16:16 protected mode.
///
SEGOFF16 EntryPointSP;
///
/// UINT16 (__FAR __CDECL *EntryPointESP)(UINT16 func, VOID __FAR *param);
/// 32bit stack segment API entry point. This will be sel:off.
/// In real mode, sel == 0
///
SEGOFF16 EntryPointESP;
///
/// UINT16 (__FAR __CDECL *StatusCallout)(UINT16 param);
/// Address of DHCP/TFTP status callout routine.
///
SEGOFF16 StatusCallout;
UINT8 Reserved2; ///< must be zero
UINT8 SegDescCnt; ///< Number of segment descriptors in this structure.
UINT16 FirstSelector; ///< First segment descriptor in GDT assigned to PXE.
NEWSEGDESC_T Stack;
NEWSEGDESC_T UNDIData;
NEWSEGDESC_T UNDICode;
NEWSEGDESC_T UNDICodeWrite;
NEWSEGDESC_T BC_Data;
NEWSEGDESC_T BC_Code;
NEWSEGDESC_T BC_CodeWrite;
} PXE_T;
typedef struct {
CHAR8 Signature[6]; ///< "PXENV+"
UINT16 Version; ///< PXE version number. LSB is minor version. MSB is major version.
UINT8 StructLength; ///< Length of PXE-2.0 Entry Point structure in bytes.
UINT8 StructCksum; ///< Used to make structure checksum equal zero.
UINT32 RMEntry; ///< Real mode API entry point segment:offset.
UINT32 PMEntryOff; ///< Protected mode API entry point
UINT16 PMEntrySeg; ///< segment:offset. This will always be zero. Protected mode API calls
///< must be made through the API entry points in the PXE Runtime ID structure.
UINT16 StackSeg; ///< Real mode stack segment.
UINT16 StackSize; ///< Stack segment size in bytes.
UINT16 BaseCodeSeg; ///< Real mode base-code code segment.
UINT16 BaseCodeSize; ///< Base-code code segment size
UINT16 BaseDataSeg; ///< Real mode base-code data segment.
UINT16 BaseDataSize; ///< Base-code data segment size
UINT16 UNDIDataSeg; ///< Real mode UNDI data segment.
UINT16 UNDIDataSize; ///< UNDI data segment size in bytes.
UINT16 UNDICodeSeg; ///< Real mode UNDI code segment.
UINT16 UNDICodeSize; ///< UNDI code segment size in bytes.
PXE_T *RuntimePtr; ///< Real mode segment:offset pointer to PXE Runtime ID structure.
} PXENV_T;
typedef struct {
OUT UINT16 Status;
IN OUT UINT16 Ax;
IN OUT UINT16 Bx;
IN OUT UINT16 Dx;
IN OUT UINT16 Di;
IN OUT UINT16 Es;
IN OUT UINT16 Undi_Ds;
IN OUT UINT16 Undi_Cs;
OUT SEGOFF16 PXEptr;
OUT SEGOFF16 PXENVptr;
} UNDI_LOADER_T;
//
// Put in some UNDI-specific arguments
//
#define PXENV_START_UNDI 0x0000
#define PXENV_UNDI_STARTUP 0x0001
#define PXENV_UNDI_CLEANUP 0x0002
#define PXENV_UNDI_INITIALIZE 0x0003
#define PXENV_UNDI_RESET_NIC 0x0004
#define PXENV_UNDI_SHUTDOWN 0x0005
#define PXENV_UNDI_OPEN 0x0006
#define PXENV_UNDI_CLOSE 0x0007
#define PXENV_UNDI_TRANSMIT 0x0008
#define PXENV_UNDI_SET_MCAST_ADDR 0x0009
#define PXENV_UNDI_SET_STATION_ADDR 0x000A
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
#define PXENV_UNDI_GET_INFORMATION 0x000C
#define PXENV_UNDI_GET_STATISTICS 0x000D
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
#define PXENV_UNDI_GET_MCAST_ADDR 0x0011
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
#define PXENV_UNDI_GET_NDIS_INFO 0x0013
#define PXENV_UNDI_ISR 0x0014
#define PXENV_STOP_UNDI 0x0015
#define PXENV_UNDI_GET_STATE 0x0016
#define ADDR_LEN 16
#define MAXNUM_MCADDR 8
#define IPLEN 4 ///< length of an IP address
#define XMT_DESTADDR 0x0000 ///< destination address given
#define XMT_BROADCAST 0x0001 ///< use broadcast address
typedef struct {
UINT16 MCastAddrCount; ///< In: Number of multi-cast
/* addresses. */
UINT8 MCastAddr[MAXNUM_MCADDR][ADDR_LEN]; /* In: */
/* list of multi-cast addresses. */
/* Each address can take up to */
/* ADDR_LEN bytes and a maximum */
/* of MAXNUM_MCADDR address can */
/* be provided*/
} PXENV_UNDI_MCAST_ADDR_T;
/* Definitions of TFTP API parameter structures.
*/
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN UINT16 Ax; ///< In: These register fields must be
IN UINT16 Bx; ///< filled in with the same data
IN UINT16 Dx; ///< that was passed to the MLID
IN UINT16 Di; ///< option ROM boot code by the
IN UINT16 Es; ///< system BIOS.
} PXENV_START_UNDI_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_STARTUP_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_CLEANUP_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
///
/// This is an input parameter and is a 32-bit physical address of
/// a memory copy of the driver module in the protocol.ini file
/// obtained from the Protocol Manager driver(refer to NDIS 2.0
/// specifications). This parameter is basically supported for
/// the universal NDIS driver to pass the information contained in
/// protocol.ini file to the NIC driver for any specific
/// configuration of the NIC. (Note that the module
/// identification in the protocol.ini file was done by NDIS
/// itself.) This value can be NULL for for any other application
/// interfacing to the Universal NIC Driver.
///
IN UINT32 ProtocolIni;
UINT8 Reserved[8];
} PXENV_UNDI_INITIALIZE_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN PXENV_UNDI_MCAST_ADDR_T R_Mcast_Buf; ///< multicast address list
/* see note below */
} PXENV_UNDI_RESET_T;
/*++
Note: The NIC driver does not remember the multicast
addresses provided in any call. So the application must
provide the multicast address list with all the calls that
reset the receive unit of the adapter.
--*/
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_SHUTDOWN_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
///
/// This is an input parameter and is adapter specific. This is
/// supported for Universal NDIS 2.0 driver to pass down the Open
/// flags provided by the protocol driver (See NDIS 2.0
/// specifications). This can be zero.
///
IN UINT16 OpenFlag; ///< In: See description below
IN UINT16 PktFilter; ///< In: Filter for receiving
/* packet. It takes the following */
/* values, multiple values can be */
/* ORed together. */
#define FLTR_DIRECTED 0x0001 ///< directed/multicast
#define FLTR_BRDCST 0x0002 ///< broadcast packets
#define FLTR_PRMSCS 0x0004 ///< any packet on LAN
#define FLTR_SRC_RTG 0x0008 ///< source routing packet
IN PXENV_UNDI_MCAST_ADDR_T McastBuffer; /* In: */
/* See t_PXENV_UNDI_MCAST_ADDR. */
} PXENV_UNDI_OPEN_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_CLOSE_T;
#define MAX_DATA_BLKS 8
typedef struct {
IN UINT16 ImmedLength; ///< In: Data buffer length in
/* bytes. */
UINT16 XmitOffset; ///< 16-bit segment & offset of the
UINT16 XmitSegment; ///< immediate data buffer.
UINT16 DataBlkCount; ///< In: Number of data blocks.
struct DataBlk {
UINT8 TDPtrType; ///< 0 => 32 bit Phys pointer in TDDataPtr, not supported in this version of LSA
///< 1 => seg:offser in TDDataPtr which can be a real mode or 16-bit protected mode pointer
UINT8 TDRsvdByte; ///< Reserved, must be zero.
UINT16 TDDataLen; ///< Data block length in bytes.
UINT16 TDDataPtrOffset; ///< Far pointer to data buffer.
UINT16 TDDataPtrSegment; ///< Far pointer to data buffer.
} DataBlock[MAX_DATA_BLKS];
}
PXENV_UNDI_TBD_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
///
/// This is the protocol of the upper layer that is calling
/// NICTransmit call. If the upper layer has filled the media
/// header this field must be 0.
///
IN UINT8 Protocol;
#define P_UNKNOWN 0
#define P_IP 1
#define P_ARP 2
#define P_RARP 3
///
/// If this flag is 0, the NIC driver expects a pointer to the
/// destination media address in the field DestMediaAddr. If 1,
/// the NIC driver fills the broadcast address for the
/// destination.
///
IN UINT8 XmitFlag;
#define XMT_DESTADDR 0x0000 ///< destination address given
#define XMT_BROADCAST 0x0001 ///< use broadcast address
///
/// This is a pointer to the hardware address of the destination
/// media. It can be null if the destination is not known in
/// which case the XmitFlag contains 1 for broadcast. Destination
/// media address must be obtained by the upper level protocol
/// (with Address Resolution Protocol) and NIC driver does not do
/// any address resolution.
///
IN UINT16 DestAddrOffset; ///< 16-bit segment & offset of the
IN UINT16 DestAddrSegment; ///< destination media address
IN UINT16 TBDOffset; ///< 16-bit segment & offset of the
IN UINT16 TBDSegment; ///< transmit buffer descriptor of type
/// XmitBufferDesc
IN UINT32 Reserved[2];
} PXENV_UNDI_TRANSMIT_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN PXENV_UNDI_MCAST_ADDR_T McastBuffer; ///< In:
} PXENV_UNDI_SET_MCAST_ADDR_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN UINT8 StationAddress[ADDR_LEN]; ///< new address to be set
} PXENV_UNDI_SET_STATION_ADDR_T;
typedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN UINT8 Filter; ///< In: Receive filter value.
} PXENV_UNDI_SET_PACKET_FILTER_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
OUT UINT16 BaseIo; ///< Out: Adapter's Base IO
OUT UINT16 IntNumber; ///< Out: IRQ number
OUT UINT16 MaxTranUnit; ///< Out: MTU
OUT UINT16 HwType; ///< Out: type of protocol at hardware level
#define ETHER_TYPE 1
#define EXP_ETHER_TYPE 2
#define IEEE_TYPE 6
#define ARCNET_TYPE 7
/*++
other numbers can be obtained from rfc1010 for "Assigned
Numbers". This number may not be validated by the application
and hence adding new numbers to the list should be fine at any
time.
--*/
OUT UINT16 HwAddrLen; ///< Out: actual length of hardware address
OUT UINT8 CurrentNodeAddress[ADDR_LEN]; ///< Out: Current hardware address
OUT UINT8 PermNodeAddress[ADDR_LEN]; ///< Out: Permanent hardware address
OUT UINT16 ROMAddress; ///< Out: ROM address
OUT UINT16 RxBufCt; ///< Out: receive Queue length
OUT UINT16 TxBufCt; ///< Out: Transmit Queue length
} PXENV_UNDI_GET_INFORMATION_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
OUT UINT32 XmtGoodFrames; ///< Out: No. of good transmissions
OUT UINT32 RcvGoodFrames; ///< Out: No. of good frames received
OUT UINT32 RcvCRCErrors; ///< Out: No. of frames with CRC error
OUT UINT32 RcvResourceErrors; ///< Out: no. of frames discarded
/* Out: receive Queue full */
} PXENV_UNDI_GET_STATISTICS_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_CLEAR_STATISTICS_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_INITIATE_DIAGS_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_UNDI_FORCE_INTERRUPT_T;
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
IN UINT32 InetAddr; ///< In: IP Multicast Address
OUT UINT8 MediaAddr[ADDR_LEN]; ///< Out: corresponding hardware
/* multicast address */
} PXENV_UNDI_GET_MCAST_ADDR_T;
typedef struct {
OUT UINT16 Vendor_ID; ///< OUT:
OUT UINT16 Dev_ID; ///< OUT:
OUT UINT8 Base_Class; ///< OUT:
OUT UINT8 Sub_Class; ///< OUT:
OUT UINT8 Prog_Intf; ///< OUT: program interface
OUT UINT8 Rev; ///< OUT: Revision number
OUT UINT16 BusDevFunc; ///< OUT: Bus, Device & Function numbers
OUT UINT16 SubVendor_ID; ///< OUT:
OUT UINT16 SubDevice_ID; ///< OUT:
} PCI_INFO_T;
typedef struct {
OUT UINT32 EISA_Dev_ID; ///< Out:
OUT UINT8 Base_Class; ///< OUT:
OUT UINT8 Sub_Class; ///< OUT:
OUT UINT8 Prog_Intf; ///< OUT: program interface
OUT UINT16 CardSelNum; ///< OUT: Card Selector Number
OUT UINT8 Reserved; ///< to make it 10 bytes
} PNP_INFO_T;
typedef union {
PCI_INFO_T Pci;
PNP_INFO_T Pnp;
} PCI_PNP_INFO_T;
typedef struct {
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
OUT UINT8 NicType; ///< OUT: 2=PCI, 3=PnP
PCI_PNP_INFO_T PciPnpInfo;
} PXENV_UNDI_GET_NIC_TYPE_T;
typedef struct {
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
OUT UINT8 IfaceType[16]; ///< OUT: Type name of MAC, AsciiZ
/* format. This is used by the */
/* Universal NDIS Driver to fill */
/* the driver type in it's MAC */
/* Service specific */
/* characteristic table */
OUT UINT32 LinkSpeed; ///< OUT:
OUT UINT32 ServiceFlags; ///< OUT: as defined in NDIS Spec 2.0X
OUT UINT32 Reserved[4]; ///< OUT: will be filled with 0s till defined
} PXENV_UNDI_GET_NDIS_INFO_T;
typedef struct {
OUT UINT16 Status; ///< OUT: PXENV_STATUS_xxx
IN OUT UINT16 FuncFlag; ///< In: PXENV_UNDI_ISR_IN_xxx
/* Out: PXENV_UNDI_ISR_OUT_xxx */
OUT UINT16 BufferLength;
OUT UINT16 FrameLength;
OUT UINT16 FrameHeaderLength;
OUT UINT16 FrameOffset;
OUT UINT16 FrameSegSel;
OUT UINT8 ProtType;
OUT UINT8 PktType;
} PXENV_UNDI_ISR_T;
#define PXENV_UNDI_ISR_IN_START 1 /* This function must be first */
/* when an interrupt is received. */
/* It will tell us if the intr */
/* was generated by our device. */
#define PXENV_UNDI_ISR_IN_PROCESS 2 /* Call to start processing one of */
/* our interrupts. */
#define PXENV_UNDI_ISR_IN_GET_NEXT 3 /* Call to start/continue receiving */
/* data from receive buffer(s). */
/*++
Possible responses from PXENV_UNDI_ISR_IN_START
--*/
#define PXENV_UNDI_ISR_OUT_OURS 0 ///< This is our interrupt. Deal with it.
#define PXENV_UNDI_ISR_OUT_NOT_OURS 1 ///< This is not our interrupt.
/*++
Possible responses from PXENV_UNDI_ISR_IN_PROCESS and
PXENV_UNDI_ISR_IN_PROCESS
--*/
#define PXENV_UNDI_ISR_OUT_DONE 0 ///< We are done processing this interrupt.
#define PXENV_UNDI_ISR_OUT_TRANSMIT 2 ///< We completed a transmit interrupt.
#define PXENV_UNDI_ISR_OUT_RECEIVE 3 ///< Get data from receive buffer.
#define PXENV_UNDI_ISR_OUT_BUSY 4 /* ? */
typedef struct {
UINT16 Status; ///< Out: PXENV_STATUS_xxx
} PXENV_STOP_UNDI_T;
#define PXENV_UNDI_STARTED 1 ///< not even initialized
#define PXENV_UNDI_INITIALIZED 2 ///< initialized and closed (not opened)
#define PXENV_UNDI_OPENED 3 ///< initialized & opened
typedef struct {
OUT UINT16 Status; ///< Out: PXENV_STATUS_xxx
UINT16 UNDI_State;
} PXENV_UNDI_GET_STATE_T;
#pragma pack()
#endif