📄 pxe.h
字号:
/*
Copyright 2006-2008, V.
For contact information, see http://winaoe.org/
This file is part of WinAoE.
WinAoE is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
WinAoE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with WinAoE. If not, see <http://www.gnu.org/licenses/>.
*/
asm(".code16gcc");
#ifndef _PXE_H
#define _PXE_H
int pxeinit();
unsigned short api(unsigned short command, void* commandstruct);
void apierror(char *message, unsigned short status);
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned long UINT32;
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
#define MAC_ADDR_LEN 16
typedef UINT8 MAC_ADDR[MAC_ADDR_LEN];
typedef UINT16 OFF16;
typedef UINT16 PXENV_STATUS;
typedef UINT16 SEGSEL;
typedef UINT16 UDP_PORT;
typedef UINT32 ADDR32;
typedef struct s_SEGDESC {
UINT16 segment_address;
UINT32 Physical_address;
UINT16 Seg_Size;
} __attribute__((__packed__)) SEGDESC;
typedef struct s_SEGOFF16 {
OFF16 offset;
SEGSEL segment;
} __attribute__((__packed__)) SEGOFF16;
#define IP_ADDR_LEN 4
typedef union u_IP4 {
UINT32 num;
UINT8 array[IP_ADDR_LEN];
} __attribute__((__packed__)) IP4;
typedef struct s_PXENV {
UINT8 Signature[6];
UINT16 Version;
UINT8 Length;
UINT8 Checksum;
SEGOFF16 RMEntry;
UINT32 PMOffset;
SEGSEL PMSelector;
SEGSEL StackSeg;
UINT16 StackSize;
SEGSEL BC_CodeSeg;
UINT16 BC_CodeSize;
SEGSEL BC_DataSeg;
UINT16 BC_DataSize;
SEGSEL UNDIDataSeg;
UINT16 UNDIDataSize;
SEGSEL UNDICodeSeg;
UINT16 UNDICodeSize;
SEGOFF16 PXEPtr;
} __attribute__((__packed__)) t_PXENV;
typedef struct s_PXE {
UINT8 Signature[4];
UINT8 StructLength;
UINT8 StructCksum;
UINT8 StructRev;
UINT8 reserved1;
SEGOFF16 UNDIROMID;
SEGOFF16 BaseROMID;
SEGOFF16 EntryPointSP;
SEGOFF16 EntryPointESP;
SEGOFF16 StatusCallout;
UINT8 reserved2;
UINT8 SegDescCnt;
SEGSEL FirstSelector;
SEGDESC Stack;
SEGDESC UNDIData;
SEGDESC UNDICode;
SEGDESC UNDICodeWrite;
SEGDESC BC_Data;
SEGDESC BC_Code;
SEGDESC BC_CodeWrite;
} __attribute__((__packed__)) t_PXE;
typedef struct s_UNDI_ROM_ID {
UINT8 Signature[4];
UINT8 StructLength;
UINT8 StructCksum;
UINT8 StructRev;
UINT8 UNDIRev[3];
UINT16 UNDILoader;
UINT16 StackSize;
UINT16 DataSize;
UINT16 CodeSize;
UINT8 BusType[][4];
} __attribute__((__packed__)) t_UNDI_ROM_ID;
typedef struct s_UNDI_LOADER {
PXENV_STATUS Status;
UINT16 AX;
UINT16 BX;
UINT16 DX;
UINT16 DI;
UINT16 ES;
UINT16 UNDI_DS;
UINT16 UNDI_CS;
SEGOFF16 PXEptr;
SEGOFF16 PXENVptr;
} __attribute__((__packed__)) t_UNDI_LOADER;
#define PXENV_START_UNDI 0x0000
typedef struct s_PXENV_START_UNDI {
PXENV_STATUS Status;
UINT16 AX;
UINT16 BX;
UINT16 DX;
UINT16 DI;
UINT16 ES;
} __attribute__((__packed__)) t_PXENV_START_UNDI;
#define PXENV_UNDI_STARTUP 0x0001
typedef struct s_PXENV_UNDI_STARTUP {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_STARTUP;
#define PXENV_UNDI_CLEANUP 0x0002
typedef struct s_PXENV_UNDI_CLEANUP {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_CLEANUP;
#define PXENV_UNDI_INITIALIZE 0x0003
typedef struct s_PXENV_UNDI_INITIALIZE {
PXENV_STATUS Status;
ADDR32 ProtocolIni;
UINT8 reserved[8];
} __attribute__((__packed__)) t_PXENV_UNDI_INITIALIZE;
#define MAXNUM_MCADDR 8
typedef struct s_PXENV_UNDI_MCAST_ADDRESS {
UINT16 MCastAddrCount;
MAC_ADDR McastAddr[MAXNUM_MCADDR];
} __attribute__((__packed__)) t_PXENV_UNDI_MCAST_ADDRESS;
#define PXENV_UNDI_RESET_ADAPTER 0x0004
typedef struct s_PXENV_UNDI_RESET {
PXENV_STATUS Status;
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} __attribute__((__packed__)) t_PXENV_UNDI_RESET;
#define PXENV_UNDI_SHUTDOWN 0x0005
typedef struct s_PXENV_UNDI_SHUTDOWN {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_SHUTDOWN;
#define PXENV_UNDI_OPEN 0x0006
typedef struct s_PXENV_UNDI_OPEN {
PXENV_STATUS Status;
UINT16 OpenFlag;
UINT16 PktFilter;
#define FLTR_DIRECTED 0x0001
#define FLTR_BRDCST 0x0002
#define FLTR_PRMSCS 0x0004
#define FLTR_SRC_RTG 0x0008
t_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} __attribute__((__packed__)) t_PXENV_UNDI_OPEN;
#define PXENV_UNDI_CLOSE 0x0007
typedef struct s_PXENV_UNDI_CLOSE {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_CLOSE;
#define PXENV_UNDI_TRANSMIT 0x0008
typedef struct s_PXENV_UNDI_TRANSMIT {
PXENV_STATUS Status;
UINT8 Protocol;
#define P_UNKNOWN 0
#define P_IP 1
#define P_ARP 2
#define P_RARP 3
UINT8 XmitFlag;
#define XMT_DESTADDR 0x0000
#define XMT_BROADCAST 0x0001
SEGOFF16 DestAddr;
SEGOFF16 TBD;
UINT32 Reserved[2];
} __attribute__((__packed__)) t_PXENV_UNDI_TRANSMIT;
#define MAX_DATA_BLKS 8
typedef struct s_PXENV_UNDI_TBD {
UINT16 ImmedLength;
SEGOFF16 Xmit;
UINT16 DataBlkCount;
struct DataBlk {
UINT8 TDPtrType;
UINT8 TDRsvdByte;
UINT16 TDDataLen;
SEGOFF16 TDDataPtr;
} __attribute__((__packed__)) DataBlock[MAX_DATA_BLKS];
} __attribute__((__packed__)) t_PXENV_UNDI_TBD;
#define PXENV_UNDI_SET_MCAST_ADDRESS 0x0009
typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS {
PXENV_STATUS Status;
t_PXENV_UNDI_MCAST_ADDRESS
R_Mcast_Buf;
} __attribute__((__packed__)) t_PXENV_UNDI_SET_MCAST_ADDR;
#define PXENV_UNDI_SET_STATION_ADDRESS 0x000A
typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS {
PXENV_STATUS Status;
MAC_ADDR StationAddress;
} __attribute__((__packed__)) t_PXENV_UNDI_SET_STATION_ADDR;
#define PXENV_UNDI_SET_PACKET_FILTER 0x000B
typedef struct s_PXENV_UNDI_SET_PACKET_FILTER {
PXENV_STATUS Status;
UINT8 filter;
} __attribute__((__packed__)) t_PXENV_UNDI_SET_PACKET_FILTER;
#define PXENV_UNDI_GET_INFORMATION 0x000C
typedef struct s_PXENV_UNDI_GET_INFORMATION {
PXENV_STATUS Status;
UINT16 BaseIo;
UINT16 IntNumber;
UINT16 MaxTranUnit;
UINT16 HwType;
#define ETHER_TYPE 1
#define EXP_ETHER_TYPE 2
#define IEEE_TYPE 6
#define ARCNET_TYPE 7
UINT16 HwAddrLen;
MAC_ADDR CurrentNodeAddress;
MAC_ADDR PermNodeAddress;
SEGSEL ROMAddress;
UINT16 RxBufCt;
UINT16 TxBufCt;
} __attribute__((__packed__)) t_PXENV_UNDI_GET_INFORMATION;
#define PXENV_UNDI_GET_STATISTICS 0x000D
typedef struct s_PXENV_UNDI_GET_STATISTICS {
PXENV_STATUS Status;
UINT32 XmtGoodFrames;
UINT32 RcvGoodFrames;
UINT32 RcvCRCErrors;
UINT32 RcvResourceErrors;
} __attribute__((__packed__)) t_PXENV_UNDI_GET_STATISTICS;
#define PXENV_UNDI_CLEAR_STATISTICS 0x000E
typedef struct s_PXENV_UNDI_CLEAR_STATISTICS {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_CLEAR_STATISTICS;
#define PXENV_UNDI_INITIATE_DIAGS 0x000F
typedef struct s_PXENV_UNDI_INITIATE_DIAGS{
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_INITIATE_DIAGS;
#define PXENV_UNDI_FORCE_INTERRUPT 0x0010
typedef struct s_PXENV_UNDI_FORCE_INTERRUPT {
PXENV_STATUS Status;
} __attribute__((__packed__)) t_PXENV_UNDI_FORCE_INTERRUPT;
#define PXENV_UNDI_GET_MCAST_ADDRESS 0x0011
typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS {
PXENV_STATUS Status;
IP4 InetAddr;
MAC_ADDR MediaAddr;
} __attribute__((__packed__)) t_PXENV_UNDI_GET_MCAST_ADDR;
#define PXENV_UNDI_GET_NIC_TYPE 0x0012
typedef struct s_PXENV_UNDI_GET_NIC_TYPE {
PXENV_STATUS Status;
UINT8 NicType;
#define PCI_NIC 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -