Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование PXE 
:(
    Опции темы
lamber
Дата 15.5.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Возникла необходимость использования PXE UNDI. Если вкратце то дописать авторизацию TrueCrypt. Очень много гуглил и по PXE нашел только спек, фактически описывающий тольуо структуру PXE, не SDK нихрена больше не нашел. Есть исходник найденный на линуховых форумах, который едва поддается преобразованию к MSVC т.к. он собирался (правда собирался он или нет этого увы не проверял) под Linux. У кого есть опыт разработки поделитесь плз, уже пару дней бьюсь впустую. Ниже привожу код инициализации pxe а именно поиска на целевой машине pxe. В ссылка полных код для функций pxe. Задача стоит в том чтобы хотябы напсать фунцкцию поиска pxe, если таковая имеется на мамке. 

Код

int pxe_init(int quiet)
{
    t_PXENV_GET_CACHED_INFO *gci = (void *) pxe_command_buf;
    pxenv_t *pxenv;
    pxe_t *pxe;
    char *cp;
    int i;
    u_int8_t cksum, *ucp;

    /*
     * Checking for the presence of PXE is a machine-dependent
     * operation.  On the IA-32, this can be done two ways:
     *
     *    Int 0x1a function 0x5650
     *
     *    Scan memory for the !PXE or PXENV+ signatures
     *
     * We do the latter, since the Int method returns a pointer
     * to a deprecated structure (PXENV+).
     */

    pxenv = NULL;
    pxe = NULL;

    for (cp = (char *)0xa0000; cp > (char *)0x10000; cp -= 2) {
        if (pxenv == NULL) {
            pxenv = (pxenv_t *)cp;
            if (memcmp(pxenv->Signature, S_SIZE("PXENV+")) != 0)
                pxenv = NULL;
            else {
                for (i = 0, ucp = (u_int8_t *)cp, cksum = 0;
                     i < pxenv->Length; i++)
                    cksum += ucp[i];
                if (cksum != 0) {
                    printf("\npxe_init: bad cksum (0x%x) "
                        "for PXENV+ at 0x%lx\n", cksum,
                        (u_long) cp);
                    pxenv = NULL;
                }
            }
        }

        if (pxe == NULL) {
            pxe = (pxe_t *)cp;
            if (memcmp(pxe->Signature, S_SIZE("!PXE")) != 0)
                pxe = NULL;
            else {
                for (i = 0, ucp = (u_int8_t *)cp, cksum = 0;
                     i < pxe->StructLength; i++)
                    cksum += ucp[i];
                if (cksum != 0) {
                    printf("pxe_init: bad cksum (0x%x) "
                        "for !PXE at 0x%lx\n", cksum,
                        (u_long) cp);
                    pxe = NULL;
                }
            }
        }

        if (pxe != NULL && pxenv != NULL)
            break;
    }

    if (pxe == NULL && pxenv == NULL) {
        if (!quiet) printf("pxe_init: No PXE BIOS found.\n");
        return 1;
    }

    if (pxenv == NULL) {
        /* assert(pxe != NULL); */

        printf(quiet ? " pxe!" : "PXE present\n");
    } else {                /* pxenv != NULL */
        int bang = 0;

        if (pxenv->Version >= 0x0201 && pxe != NULL) {
            /* 2.1 or greater -- don't use PXENV+ */
            bang = 1;
        }

        if (quiet) {
            printf(" pxe%c[%d.%d]",
                (bang ? '!' : '+'),
                (pxenv->Version >> 8) & 0xff,
                 pxenv->Version & 0xff);
        } else {
            printf("PXE BIOS Version %d.%d\n",
                (pxenv->Version >> 8) & 0xff,
                 pxenv->Version & 0xff);
        }

        if (bang) {
            pxenv = NULL;
        }
    }

    if (pxenv == NULL) {
        pxe_call = pxecall_bangpxe;
        bangpxe_off = pxe->EntryPointSP.offset;
        bangpxe_seg = pxe->EntryPointSP.segment;
    } else {
        pxe_call = pxecall_pxenv;
        pxenv_off = pxenv->RMEntry.offset;
        pxenv_seg = pxenv->RMEntry.segment;
    }

    /*
     * Pre-compute the segment/offset of the pxe_command_buf
     * to make things nicer in the low-level calling glue.
     */
    pxe_command_buf_seg = VTOPSEG(pxe_command_buf);
    pxe_command_buf_off = VTOPOFF(pxe_command_buf);

    /*
     * Get the cached info from the server's Discovery reply packet.
     */
    bzero(gci, sizeof(*gci));
    gci->PacketType = PXENV_PACKET_TYPE_CACHED_REPLY;
    pxe_call(PXENV_GET_CACHED_INFO);

    if (gci->Status != PXENV_STATUS_SUCCESS) {
        printf("\npxeinfo: PXENV_GET_CACHED_INFO failed: 0x%x\n",
            gci->Status);
        return 1;
    }

    memcpy(&bootplayer,
        SEGOFF2FLAT(gci->Buffer.segment, gci->Buffer.offset),
        gci->BufferSize);

    bcopy(&bootplayer.yip, &myip.s_addr, sizeof(myip.s_addr));
    bcopy(&bootplayer.sip, &servip.s_addr, sizeof(servip.s_addr));

        /* Compute our "natural" netmask. */
    if (IN_CLASSA(myip.s_addr))
        netmask = IN_CLASSA_NET;
    else if (IN_CLASSB(myip.s_addr))
        netmask = IN_CLASSB_NET;
    else
        netmask = IN_CLASSC_NET;

    return 0;
}


pxe source
PM MAIL   Вверх
xvr
Дата 16.5.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Вы в курсе, что это надо исполнять на голой машине (не под Windows)? 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.