Page 1 of 1

absence of PXE+ structure

Posted: Thu Aug 01, 2019 2:08 am
by eminus
Hi,

I faced issue about PXE structure. I couldn't found !PXE in pxe pointer of PXENV+ structure. My structure for PXENV+:

Code: Select all

    // The Signature of the PXENV+ structure - contains "PXENV+".
    uint8_t  Signature[6];
 
    // The MSB contains the Major version number, while the LSB contains the minor version number.
    uint16_t Version;
 
    // The Length and the checksum of the structure, used for calculating the checksum.
    uint8_t  Length;
    uint8_t  Checksum;
 
    // A Far Pointer to the real mode PXE API entry point. 
    uint32_t RMEntry;
 
    // 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
    uint32_t PMOffset;
 
    // The rest of the fields don't matter much, and the Specifications can be referred.
    uint16_t PMSelector;
    uint16_t StackSeg;
    uint16_t StackSize;
    uint16_t BCCodeSeg;
    uint16_t BCCodeSize;
    uint16_t BCDataSeg;
    uint16_t BCDataSize;
 
    uint16_t UNDIDataSeg;
    uint16_t UNDIDataSize;
    uint16_t UNDICodeSeg;
    uint16_t UNDICodeSize;
 
    // This is a far pointer to the "!PXE" structure, only present when the structure is present.
    uint32_t PXEPtr;
When I was in the Protected mode, I switched to real mode for PXE interrupt. After that es and ebx registers got the address of PXENV+ structure.
Then I want to use PXEPtr that has incorrect address. But there is correct Signature, Length, Checksum in PXENV+ structure but PXEPtr has incorrect address or in VMWare workstation PXEPtr has address of PXENV+ structure.

Re: absence of PXE+ structure

Posted: Thu Aug 01, 2019 2:50 am
by Octocontrabass
Did you tell your compiler that the PXENV+ structure doesn't follow C struct alignment rules?

Re: absence of PXE+ structure

Posted: Thu Aug 01, 2019 4:15 am
by eminus
Yes, I've configured like this:

Code: Select all

struct __attribute__((__packed__)) PXE_ENV{
    // The Signature of the PXENV+ structure - contains "PXENV+".
    uint8_t  Signature[6];

    // The MSB contains the Major version number, while the LSB contains the minor version number.
    uint16_t Version;

    // The Length and the checksum of the structure, used for calculating the checksum.
    uint8_t  Length;
    uint8_t  Checksum;

    // A Far Pointer to the real mode PXE API entry point. 
    uint32_t RMEntry;

    // 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
    uint32_t PMOffset;

    // The rest of the fields don't matter much, and the Specifications can be referred.
    uint16_t PMSelector;
    uint16_t StackSeg;
    uint16_t StackSize;
    uint16_t BCCodeSeg;
    uint16_t BCCodeSize;
    uint16_t BCDataSeg;
    uint16_t BCDataSize;

    uint16_t UNDIDataSeg;
    uint16_t UNDIDataSize;
    uint16_t UNDICodeSeg;
    uint16_t UNDICodeSize;

    // This is a far pointer to the "!PXE" structure, only present when the structure is present.
    uint32_t PXEPtr;
};

Re: absence of PXE+ structure

Posted: Thu Aug 01, 2019 4:44 am
by eminus
I found a problem. I have to translate segment:offset to physical address in this field (PXEPtr). That's worked well!

Thanks.