singrdk/base/boot/Singldr/pxe.h

367 lines
9.9 KiB
C

//////////////////////////////////////////////////////////////////////////////
//
// pxe.h - implementation of BootDevice class for pxe boot
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
#ifndef __PXE_H__
#define __PXE_H__
#include "singldr.h"
#include "bootdevice.h"
//////////////////////////////////////////////////////////////////////////////
//
// Various declarations that should probably be private
// (unmodified from original implementation)
#define IN
#define OUT
#define INOUT
// MAC_ADDR Hardware address.
#define MAC_ADDR_LEN 16
typedef UINT8 MAC_ADDR[MAC_ADDR_LEN];
//////////////////////////////////////////////////////////////////////////////
struct PXE
{
UINT8 Signature[4];
UINT8 StructLength;
UINT8 StructCksum;
UINT8 StructRev;
UINT8 reserved1;
LPVOID UndiRomID;
LPVOID BaseRomID;
FPENTRY EntryPoint;
LPVOID EntryPointProt;
LPVOID StatusCallout;
UINT8 reserved2;
};
struct PXENV
{
UINT8 Signature[6];
UINT16 Version;
UINT8 Length;
UINT8 Checksum;
FPENTRY EntryPoint;
UINT32 ProtOffset;
UINT16 ProtSelector;
UINT16 StackSeg;
UINT16 StackSize;
UINT16 BC_CodeSeg;
UINT16 BC_CodeSize;
UINT16 UndiDataSeg;
UINT16 UndiDataSize;
UINT16 UndiCodeSeg;
UINT16 UndiCodeSize;
PXE __far * PXEPtr;
};
//////////////////////////////////////////////////////////////////////////////
enum PXENV_COMMAND {
TFTP_READ_FILE = 0x23,
TFTP_GET_FSIZE = 0x25,
UDP_OPEN = 0x30,
UDP_CLOSE = 0x31,
UDP_READ = 0x32,
UDP_WRITE = 0x33,
GET_CACHED_INFO = 0x71
};
enum PXENV_PACKET_TYPE {
DHCP_DISCOVER = 1,
DHCP_ACK = 2,
CACHED_REPLY = 3
};
struct PXENV_GET_CACHED_INFO
{
OUT UINT16 Status;
IN UINT16 PacketType;
INOUT UINT16 BufferSize;
INOUT LPVOID Buffer;
OUT UINT16 BufferLimit;
};
struct PXENV_TFTP_GET_FSIZE
{
OUT UINT16 Status;
IN UINT32 ServerIpAddress;
IN UINT32 GatewayIpAddress;
IN CHAR FileName[128];
OUT UINT32 FileSize;
};
struct PXENV_TFTP_READ_FILE
{
OUT UINT16 Status;
IN CHAR FileName[128];
IN UINT32 BufferSize;
IN ADDR32 Buffer;
IN UINT32 ServerIpAddress;
IN UINT32 GatewayIpAddress;
IN UINT32 McastIpAddress;
IN UINT16 TftpClntPort;
IN UINT16 TftpSrvPort;
IN UINT16 TftpOpenTimeOut;
IN UINT16 TftpReopenDelay;
};
struct PXENV_UDP_OPEN
{
OUT UINT16 Status;
IN UINT32 SelfAddress;
};
struct PXENV_UDP_CLOSE
{
OUT UINT16 Status;
};
struct PXENV_UDP_READ
{
OUT UINT16 Status;
OUT UINT32 ServerIpAddress;
IN UINT32 SelfIpAddress;
OUT UINT16 ServerPort;
IN UINT16 SelfPort;
INOUT UINT16 BufferSize;
IN LPVOID Buffer;
};
struct PXENV_UDP_WRITE
{
OUT UINT16 Status;
IN UINT32 ServerIpAddress;
IN UINT32 GatewayIpAddress;
IN UINT16 SelfPort;
IN UINT16 ServerPort;
IN UINT16 BufferSize;
IN LPVOID Buffer;
};
struct DHCP_OPTIONS {
UINT8 Code;
UINT8 Length;
UINT8 Data[1];
};
//////////////////////////////////////////////////////////////////////////////
struct DHCP_PACKET {
UINT8 op;
UINT8 htype;
UINT8 hlen;
UINT8 hops;
UINT32 xid;
UINT16 secs;
UINT16 flags; // UNUSED for BOOTP
UINT32 ciaddr;
UINT32 yiaddr;
UINT32 siaddr;
UINT32 giaddr;
UINT8 chaddr[16];
CHAR sname[64];
CHAR file[128];
UINT8 cookie[4];
DHCP_OPTIONS options;
};
/*
* DHCP Standard Options.
*/
#define DHCP_OPTION_PAD 0
#define DHCP_OPTION_SUBNET_MASK 1
#define DHCP_OPTION_TIME_OFFSET 2
#define DHCP_OPTION_ROUTER_ADDRESS 3
#define DHCP_OPTION_TIME_SERVERS 4
#define DHCP_OPTION_IEN116_NAME_SERVERS 5
#define DHCP_OPTION_DOMAIN_NAME_SERVERS 6
#define DHCP_OPTION_LOG_SERVERS 7
#define DHCP_OPTION_COOKIE_SERVERS 8
#define DHCP_OPTION_LPR_SERVERS 9
#define DHCP_OPTION_IMPRESS_SERVERS 10
#define DHCP_OPTION_RLP_SERVERS 11
#define DHCP_OPTION_HOST_NAME 12
#define DHCP_OPTION_BOOT_FILE_SIZE 13
#define DHCP_OPTION_MERIT_DUMP_FILE 14
#define DHCP_OPTION_DOMAIN_NAME 15
#define DHCP_OPTION_SWAP_SERVER 16
#define DHCP_OPTION_ROOT_DISK 17
#define DHCP_OPTION_EXTENSIONS_PATH 18
/*
* IP Layer Parameters - per host
*/
#define DHCP_OPTION_BE_A_ROUTER 19
#define DHCP_OPTION_NON_LOCAL_SOURCE_ROUTING 20
#define DHCP_OPTION_POLICY_FILTER_FOR_NLSR 21
#define DHCP_OPTION_MAX_REASSEMBLY_SIZE 22
#define DHCP_OPTION_DEFAULT_TTL 23
#define DHCP_OPTION_PMTU_AGING_TIMEOUT 24
#define DHCP_OPTION_PMTU_PLATEAU_TABLE 25
/*
* IP Layer Parameters - per interface.
*/
#define DHCP_OPTION_MTU 26
#define DHCP_OPTION_ALL_SUBNETS_MTU 27
#define DHCP_OPTION_BROADCAST_ADDRESS 28
#define DHCP_OPTION_PERFORM_MASK_DISCOVERY 29
#define DHCP_OPTION_BE_A_MASK_SUPPLIER 30
#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY 31
#define DHCP_OPTION_ROUTER_SOLICITATION_ADDR 32
#define DHCP_OPTION_STATIC_ROUTES 33
#define DHCP_OPTION_TRAILERS 34
#define DHCP_OPTION_ARP_CACHE_TIMEOUT 35
#define DHCP_OPTION_ETHERNET_ENCAPSULATION 36
/*
* TCP Parameters - per host
*/
#define DHCP_OPTION_TTL 37
#define DHCP_OPTION_KEEP_ALIVE_INTERVAL 38
#define DHCP_OPTION_KEEP_ALIVE_DATA_SIZE 39
/*
* Application Layer Parameters
*/
#define DHCP_OPTION_NETWORK_INFO_SERVICE_DOM 40
#define DHCP_OPTION_NETWORK_INFO_SERVERS 41
#define DHCP_OPTION_NETWORK_TIME_SERVERS 42
/*
* Vender Specific Information Option
*/
#define DHCP_OPTION_VENDOR_SPEC_INFO 43
/*
* NetBIOS Over TCP/IP Name Server Options
*/
#define DHCP_OPTION_NETBIOS_NAME_SERVER 44
#define DHCP_OPTION_NETBIOS_DATAGRAM_SERVER 45
#define DHCP_OPTION_NETBIOS_NODE_TYPE 46
#define DHCP_OPTION_NETBIOS_SCOPE_OPTION 47
/*
* X Window System Options
*/
#define DHCP_OPTION_XWINDOW_FONT_SERVER 48
#define DHCP_OPTION_XWINDOW_DISPLAY_MANAGER 49
/*
* DHCP Extensions
*/
#define DHCP_OPTION_REQUESTED_ADDRESS 50
#define DHCP_OPTION_LEASE_TIME 51
#define DHCP_OPTION_OK_TO_OVERLAY 52
#define DHCP_OPTION_MESSAGE_TYPE 53
#define DHCP_OPTION_SERVER_IDENTIFIER 54
#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55
#define DHCP_OPTION_MESSAGE 56
#define DHCP_OPTION_MESSAGE_LENGTH 57
#define DHCP_OPTION_RENEWAL_TIME 58 /* T1 */
#define DHCP_OPTION_REBIND_TIME 59 /* T2 */
#define DHCP_OPTION_CLIENT_CLASS_INFO 60
#define DHCP_OPTION_CLIENT_ID 61
/*
* More Application Layer Parameters
*/
#define DHCP_OPTION_NIS_PLUS_DOM 64
#define DHCP_OPTION_NIS_PLUS 65
/*
* Overlayed Header Field Replacements
*/
#define DHCP_OPTION_TFTP_SERVER_NAME 66
#define DHCP_OPTION_TFTP_BOOTFILE_NAME 67
/*
* Even More Application Layer Parameters
*/
#define DHCP_OPTION_MOBILE_IP_HOME_AGENTS 68
#define DHCP_OPTION_SMTP_SERVERS 69
#define DHCP_OPTION_POP_SERVERS 70
#define DHCP_OPTION_NNTP_SERVERS 71
#define DHCP_OPTION_WWW_SERVERS 72
#define DHCP_OPTION_FINGER_SERVERS 73
#define DHCP_OPTION_IRC_SERVERS 74
#define DHCP_OPTION_STREETTALK_SERVERS 75
#define DHCP_OPTION_STREETTALK_DIR_SERVERS 76
/*
* Option codes from 77 to 127 are reserved through the
* Internet Assigned Numbers Authority (iana@isi.edu).
*/
/*
* PXE Parameters
*/
#define DHCP_OPTION_PXE_CLIENT_ARCH_ID 93
#define DHCP_OPTION_PXE_CLIENT_NIC_ID 94
#define DHCP_OPTION_PXE_CLIENT_ID 97
/*
* Option codes from 128 to 254 are for site-specific options.
*/
#define DHCP_OPTION_END 255
//////////////////////////////////////////////////////////////////////////////
//
// static info from original implementation
static FPENTRY s_fpPxe = NULL;
static FPENTRY s_fpPxenv = NULL;
//////////////////////////////////////////////////////////////////////////////
//
// Declaration for class PxeDevice
struct __near PxeDevice : BootDevice
{
private:
PXE __far *pxe; // on pxe boot, these two pointers are given
PXENV __far * pxenv; // to SINGLDR as params to BootPhase1
DHCP_PACKET __far *reply;
uint32 ServerIP;
public:
// constructor
PxeDevice(PXE __far *pxePtr, PXENV __far * pxenvPtr) __far
{
// set private fields based on params
this->pxe = pxePtr;
this->pxenv = pxenvPtr;
}
// implement the virtual functions from the base class
int __near OpenDevice() __far;
int __near CloseDevice() __far;
int __near GetFileProperties(LPCHAR filename,
FilePtr file,
FilePtr directory) __far;
INT16 __near ReadFileLow(LPCHAR filename,
FilePtr file,
uint8 __far * buffer) __far;
UINT32 __near ReadFileHigh(LPCHAR filename,
FilePtr file,
uint32 pBuffer,
uint32 cbBuffer) __far;
};
#endif