[syslinux] Jumping to PXE boot from DOS

Oscar Gueta ogueta at yahoo.com
Tue Nov 23 14:55:41 PST 2004

Hello all,

     I want to create a program that runs from a
pxe-loaded virtual floppy (using memdisk + keeppxe) to
call again PXE boot.

     I took a piece of code form NILO to look for PXE
data structures and the call to function
PXENV_START_BASE from PXE spec as follows:

lower = (unsigned char *)LOWER_PXE_MEM;
upper = (unsigned char *)UPPER_PXE_MEM;

for (i=upper; i>lower;i--) {
        if (memcmp (i, sig, size) == 0) {
            /* We found it. Now see if it's usable. */
            /* Look for the version number. As the
names of this field
               are different for the PXE and PXENV
structures, we use an
               offset of 6 bytes, which is the same
for both structures. */
            if (*(i+6) != rev) {
                printf ("PXE version 0x%02x too
low.\r\n", *(i+6));
            } else {
                printf ("Found the %s data structure
at 0x%04x\r\n",
                                (type == PXE) ? "!PXE"
: "PXENV+", i);
                return (i);

However, this function never finds the PXE signatures.
Does anybody has any suggestion to make it work? After
finding the structure, I need to call function to see
if it returns to PXE boot again:

pxe_data_struct->entry16point (PXENV_START_BASE ,
(void *)0)

where pxe_data_struct looks as follows:

typedef struct pxe_s {
    u_int8_t signature[4];	/* Structure signature is
not NULL */
				/* terminated. FIXME: this was 4 */
    u_int8_t structlength;	/* Length of this structure
in */
				/* bytes. */
    u_int8_t structcksum;	/* Use to make byte checksum
of this */
				/* structure == zero. */
    u_int8_t structrev;		/* Structure format revision
number. */
    u_int8_t reserved1;		/* must be zero */
    undi_romid_t *undi;	        /* Far pointer to UNDI
    bc_romid_t *base;	        /* Far pointer to
base-code ROMID */
    u_int16_t (*entry16point)(u_int16_t func, void
                                /* 16bit stack segment
API entry */
				/* point.  This will be seg:off in */
				/* real mode and sel:off in 16:16 */
				/* protected mode. */
    u_int16_t (*entry32point)(u_int16_t func, void
				/* 32bit stack segment API entry */
				/* point.  This will be sel:off. */
				/* In real mode, sel == 0 */
    u_int16_t (*statuscallout)(u_int16_t param);
				/* Address of DHCP/TFTP status */
				/* callout routine. */
    u_int8_t reserved2;		/* must be zero */
    u_int8_t segdesccnt;	/* Number of segment
descriptors in */
				/* this structure. */
    u_int16_t 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;

Any ideas?


Do you Yahoo!? 
The all-new My Yahoo! - Get yours free! 

More information about the Syslinux mailing list