Возникла необходимость использования 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
|