From 1ebe46fcadee1d7c4715a974ec3046c091ff1363 Mon Sep 17 00:00:00 2001 From: martin Date: Sat, 25 Aug 2018 11:06:00 +0000 Subject: [PATCH] Remove userland part of ndis --- usr.sbin/Makefile | 4 +- usr.sbin/ndiscvt/Makefile | 22 -- usr.sbin/ndiscvt/inf-parse.y | 115 ------ usr.sbin/ndiscvt/inf-token.l | 206 ---------- usr.sbin/ndiscvt/inf.c | 748 ----------------------------------- usr.sbin/ndiscvt/inf.h | 61 --- usr.sbin/ndiscvt/ndiscvt.8 | 294 -------------- usr.sbin/ndiscvt/ndiscvt.c | 462 ---------------------- 8 files changed, 2 insertions(+), 1910 deletions(-) delete mode 100644 usr.sbin/ndiscvt/Makefile delete mode 100644 usr.sbin/ndiscvt/inf-parse.y delete mode 100644 usr.sbin/ndiscvt/inf-token.l delete mode 100644 usr.sbin/ndiscvt/inf.c delete mode 100644 usr.sbin/ndiscvt/inf.h delete mode 100644 usr.sbin/ndiscvt/ndiscvt.8 delete mode 100644 usr.sbin/ndiscvt/ndiscvt.c diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index a3f9ac95c9a9..29228f7cc510 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.276 2018/01/09 03:31:13 christos Exp $ +# $NetBSD: Makefile,v 1.277 2018/08/25 11:06:00 martin Exp $ # from: @(#)Makefile 5.20 (Berkeley) 6/12/93 .include @@ -17,7 +17,7 @@ SUBDIR= ac accton acpitools altq apm apmd arp autofs \ lastlogin ldpd link lmcconfig lockstat lpr \ mailwrapper makefs map-mbone mdconfig memswitch mlxctl mmcformat \ mopd mountd moused mrinfo mrouted mscdlabel mtrace mtree \ - ndbootd ndiscvt netgroup_mkdb nfsd \ + ndbootd netgroup_mkdb nfsd \ ofctl \ paxctl pcictl perfused psrset pstat pwd_mkdb postinstall \ powerd puffs \ diff --git a/usr.sbin/ndiscvt/Makefile b/usr.sbin/ndiscvt/Makefile deleted file mode 100644 index 51d3d3ea4cf1..000000000000 --- a/usr.sbin/ndiscvt/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# $NetBSD: Makefile,v 1.11 2009/04/22 15:23:06 lukem Exp $ -# $FreeBSD: src/usr.sbin/ndiscvt/Makefile,v 1.5 2004/02/23 20:21:21 johan Exp $ - -.PATH: ${.CURDIR}/../../sys/compat/ndis - -.if ${MACHINE_ARCH} == "i386" -PROG= ndiscvt -.endif - -MAN= ndiscvt.8 -MANSUBDIR= /i386 -SRCS= ndiscvt.c -SRCS+= subr_pe.c -SRCS+= inf.c inf-token.l inf-parse.y - -CFLAGS+=-I. -I${.CURDIR} -I${.CURDIR}/../../sys - -YHEADER=yes -YPREFIX=ndiscvt_ -LPREFIX=${YPREFIX} - -.include diff --git a/usr.sbin/ndiscvt/inf-parse.y b/usr.sbin/ndiscvt/inf-parse.y deleted file mode 100644 index af0397f6e2b2..000000000000 --- a/usr.sbin/ndiscvt/inf-parse.y +++ /dev/null @@ -1,115 +0,0 @@ -%{ -/* - * Copyright (c) 2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifdef __FreeBSD__ -__FBSDID("$FreeBSD: src/usr.sbin/ndiscvt/inf-parse.y,v 1.2 2004/01/02 04:31:06 wpaul Exp $"); -#endif -#ifdef __NetBSD__ -__RCSID("$NetBSD: inf-parse.y,v 1.6 2006/04/19 20:38:49 martin Exp $"); -#endif - - -#include -#include -#include - -#include "inf.h" - -extern int yyparse(void); -extern int yylex(void); -extern void yyerror(const char *); -%} - -%token EQUALS COMMA EOL -%token SECTION -%token STRING -%token WORD - -%union { - char *str; -} - -%% - -inf_file - : inf_list - | - ; - -inf_list - : inf - | inf_list inf - ; - -inf - : SECTION EOL - { section_add($1); } - | WORD EQUALS assign EOL - { assign_add($1); } - | WORD COMMA regkey EOL - { regkey_add($1); } - | WORD EOL - { define_add($1); } - | EOL - ; - -assign - : WORD - { push_word($1); } - | STRING - { push_word($1); } - | WORD COMMA assign - { push_word($1); } - | STRING COMMA assign - { push_word($1); } - | COMMA assign - { push_word(NULL); } - | - ; - -regkey - : WORD - { push_word($1); } - | STRING - { push_word($1); } - | WORD COMMA regkey - { push_word($1); } - | STRING COMMA regkey - { push_word($1); } - | COMMA regkey - { push_word(NULL); } - | COMMA - { push_word(NULL); } - ; -%% diff --git a/usr.sbin/ndiscvt/inf-token.l b/usr.sbin/ndiscvt/inf-token.l deleted file mode 100644 index 1613c552ed91..000000000000 --- a/usr.sbin/ndiscvt/inf-token.l +++ /dev/null @@ -1,206 +0,0 @@ -%{ -/* - * Copyright (c) 2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifdef __FreeBSD__ -__FBSDID("$FreeBSD: src/usr.sbin/ndiscvt/inf-token.l,v 1.3 2004/01/11 21:10:35 mdodd Exp $"); -#endif -#ifdef __NetBSD__ -__RCSID("$NetBSD: inf-token.l,v 1.10 2011/11/25 13:18:22 joerg Exp $"); -#endif - -#include -#include -#include -#include -#include -#include -#include "inf-parse.h" - -int lineno = 1; - -int input_is_unicode = 0; -#define IS_UNICODE 1 -#define ISNT_UNICODE 2 -static size_t opt_unicode_input(char *buf, size_t max_size); - -#define YY_INPUT(buf, result, max_size) \ - result = opt_unicode_input(buf, max_size) - -int yylex(void); -__dead void ndiscvt_error(const char *); -int ndiscvt_wrap(void); - -static void -update_lineno(const char *cp) -{ - while (*cp) - if (*cp++ == '\n') - lineno++; -} - -%} - -%option nounput noinput - -%% - -[ \t]+ ; -\n { lineno++; return EOL; } -\r ; -;.*$ ; -\/\/.*$ ; -= { return EQUALS; } -, { return COMMA; } -\"(\\\"|[^"]|\"\")*\" { - int len = strlen(yytext) - 2; - int blen = len + 1; - char *walker; - int i; - update_lineno(yytext); - ndiscvt_lval.str = (char *)malloc(blen); - if (ndiscvt_lval.str == NULL) - goto out; - walker = ndiscvt_lval.str; - for (i = 1; i <= len; i++) { - if (yytext[i] == '\"') { - switch (yytext[i + 1]) { - case '\"': - i++; - break; - default: - break; - } - } - if (yytext[i] == '\\') { - switch (yytext[i + 1]) { - case '\n': - i += 2; - while(isspace( - (unsigned char)yytext[i])) - i++; - break; - case '\"': - i++; - break; - case '(': - i++; - break; - default: - break; - } - } - *walker++ = yytext[i]; - } - *walker++ = '\0'; - out:; - return STRING; - } -\[[a-zA-Z0-9%&\{\}\-\.\/_\\\*\ ]+\] { - int len = strlen(yytext); - yytext[len-1] = '\0'; - ndiscvt_lval.str = strdup(yytext+1); - return SECTION; - } -[a-zA-Z0-9%&\{\}\-\.\/_\\\*]+ { - ndiscvt_lval.str = strdup(yytext); - return WORD; - } -%% - -void -ndiscvt_error(const char *s) -{ - errx(1, "line %d: %s%s %s.", lineno, yytext, yytext?":":"", s); -} - -int -ndiscvt_wrap(void) -{ - return 1; -} - -static size_t -opt_unicode_input(char *buf, size_t max_size) -{ - size_t i, rb; - char *t = buf; - - if (feof(yyin)) return YY_NULL; - if (input_is_unicode == ISNT_UNICODE) - /* standard ASCII .inf file */ - return fread(buf, 1, max_size, yyin); - - if (input_is_unicode != IS_UNICODE) { - /* we don't know yet if this file is unicode */ - if (max_size < 2) { - fprintf(stderr, "internal error: can not determine " - "unicode with max_size %zd\n", max_size); - return YY_NULL; - } - rb = fread(buf, 2, 1, yyin); - if (!rb) - return YY_NULL; - if ((unsigned char)buf[0] == 0xff - && (unsigned char)buf[1] == 0xfe) { - input_is_unicode = IS_UNICODE; - } else { - input_is_unicode = ISNT_UNICODE; - return 2; - } - } - - if (input_is_unicode != IS_UNICODE) - return YY_NULL; - - if (max_size < 2) { - fprintf(stderr, "internal error: can not read small unicode " - "buffer\n"); - return YY_NULL; - } - /* - * read unicode string and skip every second byte if it is zero, - * replace it by an innocent 'A' otherwise. Poor man's - * version of "iconv -f unicode -t ascii" - should be good enough - * for INF files (maybe besides comments, which we don't care - * about) - */ - rb = fread(buf, 1, max_size&~1, yyin); - for (i = 0; i < rb; i += 2) { - if (buf[i+1] != 0) - *t++ = 'A'; - else - *t++ = buf[i]; - } - return t-buf; -} diff --git a/usr.sbin/ndiscvt/inf.c b/usr.sbin/ndiscvt/inf.c deleted file mode 100644 index 08d9e9d09d8b..000000000000 --- a/usr.sbin/ndiscvt/inf.c +++ /dev/null @@ -1,748 +0,0 @@ -/* - * Copyright (c) 2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifdef __FreeBSD__ -__FBSDID("$FreeBSD: src/usr.sbin/ndiscvt/inf.c,v 1.13.2.1 2005/02/18 16:30:10 wpaul Exp $"); -#endif -#ifdef __NetBSD__ -__RCSID("$NetBSD: inf.c,v 1.4 2006/04/19 15:45:21 christos Exp $"); -#endif - - -#include -#include -#include -#include -#ifdef __NetBSD__ -#include -#endif - -#include - -#include "inf.h" - -#ifndef __DECONST -#define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var)) -#endif - - -extern FILE *ndiscvt_in; -int ndiscvt_parse (void); - -const char *words[W_MAX]; /* More than we'll need. */ -int idx; - -static struct section_head sh; -static struct reg_head rh; -static struct assign_head ah; - -static char *sstrdup (const char *); -static struct assign - *find_assign (const char *, const char *); -static struct section - *find_section (const char *); -static void dump_deviceids_pci (void); -static void dump_deviceids_pcmcia (void); -static void dump_pci_id (const char *); -static void dump_pcmcia_id (const char *); -static void dump_regvals (void); -static void dump_paramreg (const struct section *, - const struct reg *, int); - -static FILE *ofp; - -int -inf_parse (FILE *fp, FILE *outfp) -{ - TAILQ_INIT(&sh); - TAILQ_INIT(&rh); - TAILQ_INIT(&ah); - - ofp = outfp; - ndiscvt_in = fp; - ndiscvt_parse(); - - dump_deviceids_pci(); - dump_deviceids_pcmcia(); - fprintf(outfp, "#ifdef NDIS_REGVALS\n"); - dump_regvals(); - fprintf(outfp, "#endif /* NDIS_REGVALS */\n"); - - return (0); -} - -void -section_add (const char *s) -{ - struct section *sec; - - sec = malloc(sizeof(struct section)); - bzero(sec, sizeof(struct section)); - sec->name = s; - TAILQ_INSERT_TAIL(&sh, sec, link); - - return; -} - -static struct assign * -find_assign (const char *s, const char *k) -{ - struct assign *assign; - char newkey[256]; - - /* Deal with string section lookups. */ - - if (k != NULL && k[0] == '%') { - bzero(newkey, sizeof(newkey)); - strncpy(newkey, k + 1, strlen(k) - 2); - k = newkey; - } - - TAILQ_FOREACH(assign, &ah, link) { - if (strcasecmp(assign->section->name, s) == 0) { - if (k == NULL) - return(assign); - else - if (strcasecmp(assign->key, k) == 0) - return(assign); - } - } - return(NULL); -} - -static const char * -stringcvt(const char *s) -{ - struct assign *manf; - - manf = find_assign("strings", s); - if (manf == NULL) - return(s); - return(manf->vals[0]); -} - -struct section * -find_section (const char *s) -{ - struct section *section; - - TAILQ_FOREACH(section, &sh, link) { - if (strcasecmp(section->name, s) == 0) - return(section); - } - return(NULL); -} - -static void -dump_pcmcia_id(const char *s) -{ - char *manstr, *devstr; - char *p0, *p; - - p0 = __DECONST(char *, s); - - p = strchr(p0, '\\'); - if (p == NULL) - return; - p0 = p + 1; - - p = strchr(p0, '-'); - if (p == NULL) - return; - *p = '\0'; - - manstr = p0; - - /* Convert any underscores to spaces. */ - - while (*p0 != '\0') { - if (*p0 == '_') - *p0 = ' '; - p0++; - } - - p0 = p + 1; - p = strchr(p0, '-'); - if (p == NULL) - return; - *p = '\0'; - - devstr = p0; - - /* Convert any underscores to spaces. */ - - while (*p0 != '\0') { - if (*p0 == '_') - *p0 = ' '; - p0++; - } - - fprintf(ofp, "\t\\\n\t{ \"%s\", \"%s\", ", manstr, devstr); - return; -} - -static void -dump_pci_id(const char *s) -{ - char *p; - char vidstr[7], didstr[7], subsysstr[14]; - - p = strcasestr(s, "VEN_"); - if (p == NULL) - return; - p += 4; - strcpy(vidstr, "0x"); - strncat(vidstr, p, 4); - p = strcasestr(s, "DEV_"); - if (p == NULL) - return; - p += 4; - strcpy(didstr, "0x"); - strncat(didstr, p, 4); - if (p == NULL) - return; - p = strcasestr(s, "SUBSYS_"); - if (p == NULL) - strcpy(subsysstr, "0x00000000"); - else { - p += 7; - strcpy(subsysstr, "0x"); - strncat(subsysstr, p, 8); - } - - fprintf(ofp, "\t\\\n\t{ %s, %s, %s, ", vidstr, didstr, subsysstr); - return; -} - -static void -dump_deviceids_pci() -{ - struct assign *manf, *dev; - struct section *sec; - struct assign *assign; - char xpsec[256]; - int found = 0; - - /* Find manufacturer name */ - manf = find_assign("Manufacturer", NULL); - - /* Find manufacturer section */ - if (manf->vals[1] != NULL && - (strcasecmp(manf->vals[1], "NT.5.1") == 0 || - strcasecmp(manf->vals[1], "NTx86") == 0 || - strcasecmp(manf->vals[1], "NTx86.5.1") == 0 || - strcasecmp(manf->vals[1], "NTamd64") == 0)) { - /* Handle Windows XP INF files. */ - snprintf(xpsec, sizeof(xpsec), "%s.%s", - manf->vals[0], manf->vals[1]); - sec = find_section(xpsec); - } else - sec = find_section(manf->vals[0]); - - /* See if there are any PCI device definitions. */ - - TAILQ_FOREACH(assign, &ah, link) { - if (assign->section == sec) { - dev = find_assign("strings", assign->key); - if (strcasestr(assign->vals[1], "PCI") != NULL) { - found++; - break; - } - } - } - - if (found == 0) - return; - - found = 0; - - /* Emit start of PCI device table */ - fprintf (ofp, "#define NDIS_PCI_DEV_TABLE"); - -retry: - - /* - * Now run through all the device names listed - * in the manufacturer section and dump out the - * device descriptions and vendor/device IDs. - */ - - TAILQ_FOREACH(assign, &ah, link) { - if (assign->section == sec) { - dev = find_assign("strings", assign->key); - /* Emit device IDs. */ - if (strcasestr(assign->vals[1], "PCI") != NULL) - dump_pci_id(assign->vals[1]); - else - continue; - /* Emit device description */ - fprintf (ofp, "\t\\\n\t\"%s\" },", dev->vals[0]); - found++; - } - } - - /* Someone tried to fool us. Shame on them. */ - if (!found) { - found++; - sec = find_section(manf->vals[0]); - goto retry; - } - - /* Emit end of table */ - - fprintf(ofp, "\n\n"); - -} - -static void -dump_deviceids_pcmcia() -{ - struct assign *manf, *dev; - struct section *sec; - struct assign *assign; - char xpsec[256]; - int found = 0; - - /* Find manufacturer name */ - manf = find_assign("Manufacturer", NULL); - - /* Find manufacturer section */ - if (manf->vals[1] != NULL && - (strcasecmp(manf->vals[1], "NT.5.1") == 0 || - strcasecmp(manf->vals[1], "NTx86") == 0 || - strcasecmp(manf->vals[1], "NTx86.5.1") == 0 || - strcasecmp(manf->vals[1], "NTamd64") == 0)) { - /* Handle Windows XP INF files. */ - snprintf(xpsec, sizeof(xpsec), "%s.%s", - manf->vals[0], manf->vals[1]); - sec = find_section(xpsec); - } else - sec = find_section(manf->vals[0]); - - /* See if there are any PCMCIA device definitions. */ - - TAILQ_FOREACH(assign, &ah, link) { - if (assign->section == sec) { - dev = find_assign("strings", assign->key); - if (strcasestr(assign->vals[1], "PCMCIA") != NULL) { - found++; - break; - } - } - } - - if (found == 0) - return; - - found = 0; - - /* Emit start of PCMCIA device table */ - fprintf (ofp, "#define NDIS_PCMCIA_DEV_TABLE"); - -retry: - - /* - * Now run through all the device names listed - * in the manufacturer section and dump out the - * device descriptions and vendor/device IDs. - */ - - TAILQ_FOREACH(assign, &ah, link) { - if (assign->section == sec) { - dev = find_assign("strings", assign->key); - /* Emit device IDs. */ - if (strcasestr(assign->vals[1], "PCMCIA") != NULL) - dump_pcmcia_id(assign->vals[1]); - else - continue; - /* Emit device description */ - fprintf (ofp, "\t\\\n\t\"%s\" },", dev->vals[0]); - found++; - } - } - - /* Someone tried to fool us. Shame on them. */ - if (!found) { - found++; - sec = find_section(manf->vals[0]); - goto retry; - } - - /* Emit end of table */ - - fprintf(ofp, "\n\n"); - -} - -static void -dump_addreg(const char *s, int devidx) -{ - struct section *sec; - struct reg *reg; - - /* Find the addreg section */ - sec = find_section(s); - - /* Dump all the keys defined in it. */ - TAILQ_FOREACH(reg, &rh, link) { - /* - * Keys with an empty subkey are very easy to parse, - * so just deal with them here. If a parameter key - * of the same name also exists, prefer that one and - * skip this one. - */ - if (reg->section == sec) { - if (reg->subkey == NULL) { - fprintf(ofp, "\n\t{ \"%s\",", reg->key); - fprintf(ofp,"\n\t\"%s \",", reg->key); - fprintf(ofp, "\n\t{ \"%s\" }, %d },", - reg->value == NULL ? "" : - stringcvt(reg->value), devidx); - } else if (strncasecmp(reg->subkey, - "Ndi\\params", strlen("Ndi\\params")-1) == 0 && - (reg->key != NULL && strcasecmp(reg->key, - "ParamDesc") == 0)) - dump_paramreg(sec, reg, devidx); - } - } - - return; -} - -static void -dump_enumreg(const struct section *s, const struct reg *r) -{ - struct reg *reg; - char enumkey[256]; - - sprintf(enumkey, "%s\\enum", r->subkey); - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, enumkey)) - continue; - fprintf(ofp, " [%s=%s]", reg->key, - stringcvt(reg->value)); - } - return; -} - -static void -dump_editreg(const struct section *s, const struct reg *r) -{ - struct reg *reg; - - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, r->subkey)) - continue; - if (reg->key == NULL) - continue; - if (strcasecmp(reg->key, "LimitText") == 0) - fprintf(ofp, " [maxchars=%s]", reg->value); - if (strcasecmp(reg->key, "Optional") == 0 && - strcmp(reg->value, "1") == 0) - fprintf(ofp, " [optional]"); - } - return; -} - -/* Use this for int too */ -static void -dump_dwordreg(const struct section *s, const struct reg *r) -{ - struct reg *reg; - - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, r->subkey)) - continue; - if (reg->key == NULL) - continue; - if (strcasecmp(reg->key, "min") == 0) - fprintf(ofp, " [min=%s]", reg->value); - if (strcasecmp(reg->key, "max") == 0) - fprintf(ofp, " [max=%s]", reg->value); - } - return; -} - -static void -dump_defaultinfo(const struct section *s, const struct reg *r, int devidx) -{ - struct reg *reg; - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, r->subkey)) - continue; - if (reg->key == NULL || strcasecmp(reg->key, "Default")) - continue; - fprintf(ofp, "\n\t{ \"%s\" }, %d },", reg->value == NULL ? "" : - stringcvt(reg->value), devidx); - break; - } - return; -} - -static void -dump_paramdesc(const struct section *s, const struct reg *r) -{ - struct reg *reg; - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, r->subkey)) - continue; - if (reg->key == NULL || strcasecmp(reg->key, "ParamDesc")) - continue; - fprintf(ofp, "\n\t\"%s", stringcvt(r->value)); - break; - } - return; -} - -static void -dump_typeinfo(const struct section *s, const struct reg *r) -{ - struct reg *reg; - TAILQ_FOREACH(reg, &rh, link) { - if (reg->section != s) - continue; - if (reg->subkey == NULL || strcasecmp(reg->subkey, r->subkey)) - continue; - if (reg->key == NULL) - continue; - if (strcasecmp(reg->key, "type")) - continue; - if (strcasecmp(reg->value, "dword") == 0 || - strcasecmp(reg->value, "int") == 0) - dump_dwordreg(s, r); - if (strcasecmp(reg->value, "enum") == 0) - dump_enumreg(s, r); - if (strcasecmp(reg->value, "edit") == 0) - dump_editreg(s, r); - } - return; -} - -static void -dump_paramreg(const struct section *s, const struct reg *r, int devidx) -{ - const char *keyname; - - keyname = r->subkey + strlen("Ndi\\params\\"); - fprintf(ofp, "\n\t{ \"%s\",", keyname); - dump_paramdesc(s, r); - dump_typeinfo(s, r); - fprintf(ofp, "\","); - dump_defaultinfo(s, r, devidx); - - return; -} - -static void -dump_regvals(void) -{ - struct assign *manf, *dev; - struct section *sec; - struct assign *assign; - char sname[256]; - int found = 0, i, is_winxp = 0, is_winnt = 0, devidx = 0; - - /* Find signature to check for special case of WinNT. */ - assign = find_assign("version", "signature"); - if (strcasecmp(assign->vals[0], "$windows nt$") == 0) - is_winnt++; - - /* Find manufacturer name */ - manf = find_assign("Manufacturer", NULL); - - /* Find manufacturer section */ - if (manf->vals[1] != NULL && - (strcasecmp(manf->vals[1], "NT.5.1") == 0 || - strcasecmp(manf->vals[1], "NTx86") == 0 || - strcasecmp(manf->vals[1], "NTx86.5.1") == 0 || - strcasecmp(manf->vals[1], "NTamd64") == 0)) { - is_winxp++; - /* Handle Windows XP INF files. */ - snprintf(sname, sizeof(sname), "%s.%s", - manf->vals[0], manf->vals[1]); - sec = find_section(sname); - } else - sec = find_section(manf->vals[0]); - - /* Emit start of block */ - fprintf (ofp, "ndis_cfg ndis_regvals[] = {"); - -retry: - - TAILQ_FOREACH(assign, &ah, link) { - if (assign->section == sec) { - found++; - /* - * Find all the AddReg sections. - * Look for section names with .NT, unless - * this is a WinXP .INF file. - */ - - if (is_winxp) { - sprintf(sname, "%s.NTx86", assign->vals[0]); - dev = find_assign(sname, "AddReg"); - if (dev == NULL) { - sprintf(sname, "%s.NT", - assign->vals[0]); - dev = find_assign(sname, "AddReg"); - } - if (dev == NULL) - dev = find_assign(assign->vals[0], - "AddReg"); - } else { - sprintf(sname, "%s.NT", assign->vals[0]); - dev = find_assign(sname, "AddReg"); - if (dev == NULL && is_winnt) - dev = find_assign(assign->vals[0], - "AddReg"); - } - /* Section not found. */ - if (dev == NULL) - continue; - for (i = 0; i < W_MAX; i++) { - if (dev->vals[i] != NULL) - dump_addreg(dev->vals[i], devidx); - } - devidx++; - } - } - - if (!found) { - sec = find_section(manf->vals[0]); - is_winxp = 0; - found++; - goto retry; - } - - fprintf(ofp, "\n\t{ NULL, NULL, { 0 }, 0 }\n};\n\n"); - - return; -} - -void -assign_add (const char *a) -{ - struct assign *assign; - int i; - - assign = malloc(sizeof(struct assign)); - bzero(assign, sizeof(struct assign)); - assign->section = TAILQ_LAST(&sh, section_head); - assign->key = sstrdup(a); - for (i = 0; i < idx; i++) - assign->vals[(idx - 1) - i] = sstrdup(words[i]); - TAILQ_INSERT_TAIL(&ah, assign, link); - - clear_words(); - return; -} - -void -define_add (const char *d __unused) -{ -#ifdef notdef - fprintf(stderr, "define \"%s\"\n", d); -#endif - return; -} - -static char * -sstrdup(const char *str) -{ - if (str != NULL && strlen(str)) - return (strdup(str)); - return (NULL); -} - -static int -satoi (const char *nptr) -{ - if (nptr != NULL && strlen(nptr)) - return (atoi(nptr)); - return (0); -} - -void -regkey_add (const char *r) -{ - struct reg *reg; - - reg = malloc(sizeof(struct reg)); - bzero(reg, sizeof(struct reg)); - reg->section = TAILQ_LAST(&sh, section_head); - reg->root = sstrdup(r); - reg->subkey = sstrdup(words[3]); - reg->key = sstrdup(words[2]); - reg->flags = satoi(words[1]); - reg->value = sstrdup(words[0]); - TAILQ_INSERT_TAIL(&rh, reg, link); - - free(__DECONST(char *, r)); - clear_words(); - return; -} - -void -push_word (const char *w) -{ - if (w && strlen(w)) - words[idx++] = w; - else - words[idx++] = NULL; - return; -} - -void -clear_words (void) -{ - int i; - - for (i = 0; i < idx; i++) { - if (words[i]) { - free(__DECONST(char *, words[i])); - } - } - idx = 0; - bzero(words, sizeof(words)); - return; -} diff --git a/usr.sbin/ndiscvt/inf.h b/usr.sbin/ndiscvt/inf.h deleted file mode 100644 index 1872759d491f..000000000000 --- a/usr.sbin/ndiscvt/inf.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * $NetBSD: inf.h,v 1.3 2006/04/28 07:20:39 skrll Exp $ - * - * $FreeBSD: src/usr.sbin/ndiscvt/inf.h,v 1.1 2003/12/11 22:38:14 wpaul Exp $ - */ - -#define W_MAX 16 - -struct section { - const char * name; - - TAILQ_ENTRY(section) link; -}; -TAILQ_HEAD(section_head, section); - -struct assign { - struct section *section; - - const char * key; - const char * vals[W_MAX]; - - TAILQ_ENTRY(assign) link; -}; -TAILQ_HEAD(assign_head, assign); - -struct reg { - struct section *section; - - const char * root; - const char * subkey; - const char * key; - u_int flags; - const char * value; - - TAILQ_ENTRY(reg) link; -}; -TAILQ_HEAD(reg_head, reg); - -#define FLG_ADDREG_TYPE_SZ 0x00000000 -#define FLG_ADDREG_BINVALUETYPE 0x00000001 -#define FLG_ADDREG_NOCLOBBER 0x00000002 -#define FLG_ADDREG_DELVAL 0x00000004 -#define FLG_ADDREG_APPEND 0x00000008 -#define FLG_ADDREG_KEYONLY 0x00000010 -#define FLG_ADDREG_OVERWRITEONLY 0x00000020 -#define FLG_ADDREG_64BITKEY 0x00001000 -#define FLG_ADDREG_KEYONLY_COMMON 0x00002000 -#define FLG_ADDREG_32BITKEY 0x00004000 -#define FLG_ADDREG_TYPE_MULTI_SZ 0x00010000 -#define FLG_ADDREG_TYPE_EXPAND_SZ 0x00020000 -#define FLG_ADDREG_TYPE_DWORD 0x00010001 -#define FLG_ADDREG_TYPE_NONE 0x00020001 - -extern void section_add (const char *); -extern void assign_add (const char *); -extern void define_add (const char *); -extern void regkey_add (const char *); - -extern void push_word (const char *); -extern void clear_words (void); -extern int inf_parse (FILE *, FILE *); diff --git a/usr.sbin/ndiscvt/ndiscvt.8 b/usr.sbin/ndiscvt/ndiscvt.8 deleted file mode 100644 index 6985c5379be5..000000000000 --- a/usr.sbin/ndiscvt/ndiscvt.8 +++ /dev/null @@ -1,294 +0,0 @@ -.\" $NetBSD: ndiscvt.8,v 1.9 2014/03/18 18:20:47 riastradh Exp $ -.\" -.\" Copyright (c) 2003 -.\" Bill Paul All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by Bill Paul. -.\" 4. Neither the name of the author nor the names of any co-contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD -.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -.\" THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" $FreeBSD: src/usr.sbin/ndiscvt/ndiscvt.8,v 1.5.2.1 2005/02/27 15:40:17 brueffer Exp $ -.\" -.Dd December 24, 2007 -.Dt NDISCVT 8 i386 -.Os -.Sh NAME -.Nm ndiscvt -.Nd convert -.Tn Windows\[rg] -NDIS drivers for use with -.Nx -.Sh SYNOPSIS -.Nm -.Op Fl O -.Op Fl i Ar inffile -.Op Fl n Ar devname -.Op Fl o Ar outfile -.Fl s Ar sysfile -.\".Nm -.\".Op Fl f Ar firmfile -.Sh DESCRIPTION -The -.Nm -utility transforms a -.Tn Windows\[rg] -NDIS driver into a data file which -is used to build an -.\".Xr ndis 4 -ndis -compatibility driver module. -.Tn Windows\[rg] -drivers consist of two main parts: a -.Pa .SYS -file, which contains the actual driver executable code, -and an -.Pa .INF -file, which provides the -.Tn Windows\[rg] -installer with device -identifier information and a list of driver-specific registry keys. -The -.Nm -utility can convert these files into a header file that is compiled -into -.Pa if_ndis.c -to create an object code module that can be linked into -the -.Nx -kernel. -.Pp -The -.Pa .INF -file is typically required since only it contains device -identification data such as PCI vendor and device IDs or PCMCIA -indentifier strings. -The -.Pa .INF -file may be optionally omitted however, -in which case the -.Nm -utility will only perform the conversion of the -.Pa .SYS -file. -This is useful for debugging purposes only. -.Sh OPTIONS -The options are as follows: -.Bl -tag -offset indent -width XfXfirmfileXX -.\"*************************************************************************** -.\" The section describing the -f option for firmware has been commented out -.\" Because this is not currently supported on NetBSD. -.\"*************************************************************************** -.\".It Fl f Ar firmfile -.\"A few NDIS drivers come with additional files that the core -.\"driver module will load during initialization time. -.\"Typically, -.\"these files contain firmware which the driver will transfer to -.\"the device in order to make it fully operational. -.\"In -.\".Tn Windows\[rg] , -.\"these files are usually just copied into one of the system -.\"directories along with the driver itself. -.\".Pp -.\"In -.\".Nx -.\"there are two mechanism for loading these files. -.\"If the driver -.\"is built as a loadable kernel module which is loaded after the -.\"kernel has finished booting -.\"(and after the root filesystem has -.\"been mounted), -.\"the extra files can simply be copied to the -.\".Pa /compat/ndis -.\"directory, and they will be loaded into the kernel on demand when the -.\"the driver needs them. -.\".Pp -.\"If however the driver is required to bootstrap the system -.\"(i.e. if -.\"the NDIS-based network interface is to be used for diskless/PXE -.\"booting), -.\"the files need to be pre-loaded by the bootstrap -.\"loader in order to be accessible, since the driver will need them -.\"before the root file system has been mounted. -.\"However, the bootstrap -.\"loader is only able to load files that are shared -.\".Nx -.\"binary objects. -.\".Pp -.\"The -.\".Fl f -.\"flag can be used to convert an arbitrary file -.\".Ar firmfile -.\"into shared object format -.\"(the actual conversion is done using -.\"the -.\".Xr objcopy 1 -.\"and -.\".Xr ld 1 -.\"commands). -.\"The resulting files can then be copied to the -.\".Pa /boot/kernel -.\"directory, and can be pre-loaded directly from the boot loader -.\"prompt, or automatically by editing the -.\".Xr loader.conf 5 -.\"file. -.\"If desired, the files can also be loaded into memory -.\"at runtime using the -.\".Xr kldload 8 -.\"command. -.\".Pp -.\"When an NDIS driver tries to open an external file, the -.\".Xr ndisapi 9 -.\"code will first search for a loaded kernel module that matches the -.\"name specified in the open request, and if that fails, it will then -.\"try to open the file from the -.\".Pa /compat/ndis -.\"directory as well. -.\"Note that during kernel bootstrap, the ability -.\"to open files from -.\".Pa /compat/ndis -.\"is disabled: only the module search will be performed. -.\".Pp -.\"When using the -.\".Fl f -.\"flag, -.\".Nm -.\"will generate both a relocatable object file -.\"(with a -.\".Pa .o -.\"extension) -.\"and a shared object file -.\"(with a -.\".Pa .ko -.\"extension). -.\"The shared object is the one that should be placed in -.\"the -.\".Pa /boot/kernel -.\"directory. -.\"The relocatable object file is useful if the user wishes -.\"to create a completely static kernel image: the object file can be -.\"linked into the kernel directly along with the driver itself. -.\"Some -.\"editing of the kernel configuration files will be necessary in order -.\"to have the extra object included in the build. -.It Fl i Ar inffile -Open and parse the specified -.Pa .INF -file when performing conversion. -The -.Nm -utility will parse this file and emit a device identification -structure and registry key configuration structures which will be -used by the -.\".Xr ndis 4 -ndis -driver and -.\".Xr ndisapi 9 -ndisapi -kernel subsystem. -If this is omitted, -.Nm -will emit a dummy configuration structure only. -.It Fl n Ar devname -Specify an alternate name for the network device/interface which will -be created when the driver is instantiated. -If you need to load more -than one NDIS driver into your system (i.e., if you have two different -network cards in your system which require NDIS driver support), each -module you create must have a unique name. -Device can not be larger than -.Dv IFNAMSIZ . -If no name is specified, the driver will use the -default a default name -.Pq Dq Li ndis . -.It Fl O -Generate both an -.Pa ndis_driver_data.h -file and -an -.Pa ndis_driver.data.o -file. -The latter file will contain a copy of the -.Tn Windows\[rg] -.Pa .SYS -driver image encoded as a -.Nx -ELF object file -(created with -.Xr objcopy 1 ) . -Turning the -.Tn Windows\[rg] -driver image directly into an object code file saves disk space -and compilation time. -.It Fl o Ar outfile -Specify the output file in which to place the resulting data. -This can be any file pathname. -If -.Ar outfile -is a single dash -.Pq Sq Fl , -the data will be written to the standard output. -The -.Pa if_ndis.c -module expects to find the driver data in a file called -.Pa ndis_driver_data.h , -so it is recommended that this name be used. -.It Fl s Ar sysfile -Open and parse the specified -.Pa .SYS -file. -This file must contain a -.Tn Windows\[rg] -driver image. -The -.Nm -utility will perform some manipulation of the sections within the -executable file to make runtime linking within the kernel a little -easier and then convert the image into a data array. -.El -.Sh SEE ALSO -.Xr ld 1 , -.Xr objcopy 1 , -.Xr ndis 4 -.\".Xr kldload 8 , -.\".Xr ndisapi 9 -.Sh HISTORY -The -.Nm -utility first appeared in -.Fx 5.3 . -.Sh AUTHORS -.An -nosplit -The -.Nm -utility was written by -.An Bill Paul Aq Mt wpaul@windriver.com . -The -.Xr lex 1 -and -.Xr yacc 1 -.Pa .INF -file parser was written by -.An Matthew Dodd Aq Mt mdodd@FreeBSD.org . diff --git a/usr.sbin/ndiscvt/ndiscvt.c b/usr.sbin/ndiscvt/ndiscvt.c deleted file mode 100644 index ecd96640dad6..000000000000 --- a/usr.sbin/ndiscvt/ndiscvt.c +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright (c) 2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#ifdef __FreeBSD__ -__FBSDID("$FreeBSD: src/usr.sbin/ndiscvt/ndiscvt.c,v 1.9.2.2 2005/02/23 16:31:47 wpaul Exp $"); -#endif -#ifdef __NetBSD__ -__RCSID("$NetBSD: ndiscvt.c,v 1.12 2015/06/16 23:04:14 christos Exp $"); -#endif - - -#include -#ifdef __NetBSD__ -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "inf.h" - -static int insert_padding(void **, int *); -extern const char *__progname; - -/* - * Sections within Windows PE files are defined using virtual - * and physical address offsets and virtual and physical sizes. - * The physical values define how the section data is stored in - * the executable file while the virtual values describe how the - * sections will look once loaded into memory. It happens that - * the linker in the Microsoft(r) DDK will tend to generate - * binaries where the virtual and physical values are identical, - * which means in most cases we can just transfer the file - * directly to memory without any fixups. This is not always - * the case though, so we have to be prepared to handle files - * where the in-memory section layout differs from the disk file - * section layout. - * - * There are two kinds of variations that can occur: the relative - * virtual address of the section might be different from the - * physical file offset, and the virtual section size might be - * different from the physical size (for example, the physical - * size of the .data section might be 1024 bytes, but the virtual - * size might be 1384 bytes, indicating that the data section should - * actually use up 1384 bytes in RAM and be padded with zeros). What we - * do is read the original file into memory and then make an in-memory - * copy with all of the sections relocated, re-sized and zero padded - * according to the virtual values specified in the section headers. - * We then emit the fixed up image file for use by the if_ndis driver. - * This way, we don't have to do the fixups inside the kernel. - */ - -#define ROUND_DOWN(n, align) (((uintptr_t)n) & ~((align) - 1l)) -#define ROUND_UP(n, align) ROUND_DOWN(((uintptr_t)n) + (align) - 1l, \ - (align)) - -#define SET_HDRS(x) \ - dos_hdr = (image_dos_header *)x; \ - nt_hdr = (image_nt_header *)(x + dos_hdr->idh_lfanew); \ - sect_hdr = (image_section_header *)((vm_offset_t)nt_hdr + \ - sizeof(image_nt_header)); - -static -int insert_padding(imgbase, imglen) - void **imgbase; - int *imglen; -{ - image_section_header *sect_hdr; - image_dos_header *dos_hdr; - image_nt_header *nt_hdr; - image_optional_header opt_hdr; - int i = 0, sections; - int offaccum = 0, oldraddr, oldrlen; - uint8_t *newimg, *tmp; - - newimg = malloc(*imglen); - - if (newimg == NULL) - return(ENOMEM); - - bcopy(*imgbase, newimg, *imglen); - - if (pe_get_optional_header((vm_offset_t)newimg, &opt_hdr)) - return(0); - - sections = pe_numsections((vm_offset_t)newimg); - - SET_HDRS(newimg); - - for (i = 0; i < sections; i++) { - oldraddr = sect_hdr->ish_rawdataaddr; - oldrlen = sect_hdr->ish_rawdatasize; - sect_hdr->ish_rawdataaddr = sect_hdr->ish_vaddr; - offaccum += ROUND_UP(sect_hdr->ish_vaddr - oldraddr, - opt_hdr.ioh_filealign); - offaccum += - ROUND_UP(sect_hdr->ish_misc.ish_vsize, - opt_hdr.ioh_filealign) - - ROUND_UP(sect_hdr->ish_rawdatasize, - opt_hdr.ioh_filealign); - tmp = realloc(newimg, *imglen + offaccum); - if (tmp == NULL) { - free(newimg); - return(ENOMEM); - } - newimg = tmp; - SET_HDRS(newimg); - sect_hdr += i; - bzero(newimg + sect_hdr->ish_rawdataaddr, - ROUND_UP(sect_hdr->ish_misc.ish_vsize, - opt_hdr.ioh_filealign)); - bcopy((uint8_t *)(*imgbase) + oldraddr, - newimg + sect_hdr->ish_rawdataaddr, oldrlen); - sect_hdr++; - } - - free(*imgbase); - - *imgbase = newimg; - *imglen += offaccum; - - return(0); -} - -__dead static void -usage(void) -{ - fprintf(stderr, "Usage: %s [-O] [-i ] -s " - "[-n devname] [-o outfile]\n", __progname); - fprintf(stderr, " %s -f \n", __progname); - - exit(1); -} - -static void -bincvt(char *sysfile, char *outfile, void *img, int fsize) -{ - char *ptr; - char tname[] = "/tmp/ndiscvt.XXXXXX"; - char sysbuf[1024]; - FILE *binfp; - int fd; - - fd = mkstemp(tname); - if (fd == -1) - err(1, "creating temp file %s failed", tname); - - binfp = fdopen(fd, "a+"); - if (binfp == NULL) { - unlink(tname); - err(1, "opening %s failed", tname); - } - - if (fwrite(img, fsize, 1, binfp) != 1) { - unlink(tname); - err(1, "failed to output binary image"); - } - - fclose(binfp); - - outfile = strdup(basename(outfile)); - if (strchr(outfile, '.')) - *strchr(outfile, '.') = '\0'; - - snprintf(sysbuf, sizeof(sysbuf), -#ifdef __i386__ -#ifdef __FreeBSD__ - "objcopy -I binary -O elf32-i386-freebsd -B i386 %s %s.o\n", -#else - "objcopy -I binary -O elf32-i386 -B i386 %s %s.o\n", -#endif /* __FreeBSD__ */ -#endif -#ifdef __amd64__ - "objcopy -I binary -O elf64-x86-64 -B i386 %s %s.o\n", -#endif - tname, outfile); - printf("%s", sysbuf); - system(sysbuf); - unlink(tname); - - ptr = tname; - while (*ptr) { - if (*ptr == '/' || *ptr == '.') - *ptr = '_'; - ptr++; - } - - snprintf(sysbuf, sizeof(sysbuf), - "objcopy --redefine-sym _binary_%s_start=%s_drv_data_start " - "--strip-symbol _binary_%s_size " - "--redefine-sym _binary_%s_end=%s_drv_data_end %s.o %s.o\n", - tname, sysfile, tname, tname, sysfile, outfile, outfile); - printf("%s", sysbuf); - system(sysbuf); - - free(outfile); - return; -} - -__dead static void -firmcvt(char *firmfile) -{ - char *basefile, *outfile, *ptr; - char sysbuf[1024]; - - outfile = strdup(basename(firmfile)); - basefile = strdup(outfile); - - snprintf(sysbuf, sizeof(sysbuf), -#ifdef __i386__ -#ifdef __FreeBSD__ - "objcopy -I binary -O elf32-i386-freebsd -B i386 %s %s.o\n", -#else - "objcopy -I binary -O elf32-i386 -B i386 %s %s.o\n", -#endif /* __FreeBSD__ */ -#endif -#ifdef __amd64__ - "objcopy -I binary -O elf64-x86-64 -B i386 %s %s.o\n", -#endif - firmfile, outfile); - printf("%s", sysbuf); - system(sysbuf); - - ptr = firmfile; - while (*ptr) { - if (*ptr == '/' || *ptr == '.') - *ptr = '_'; - ptr++; - } - ptr = basefile; - while (*ptr) { - if (*ptr == '/' || *ptr == '.') - *ptr = '_'; - else - *ptr = tolower((int)*ptr); - ptr++; - } - - snprintf(sysbuf, sizeof(sysbuf), - "objcopy --redefine-sym _binary_%s_start=%s_start " - "--strip-symbol _binary_%s_size " - "--redefine-sym _binary_%s_end=%s_end %s.o %s.o\n", - firmfile, basefile, firmfile, firmfile, - basefile, outfile, outfile); - ptr = sysbuf; - printf("%s", sysbuf); - system(sysbuf); - - snprintf(sysbuf, sizeof(sysbuf), - "ld -Bshareable -d -warn-common -o %s.ko %s.o\n", - outfile, outfile); - printf("%s", sysbuf); - system(sysbuf); - - free(basefile); - - exit(0); -} - -int -main(int argc, char *argv[]) -{ - FILE *fp, *outfp; - int i, bin = 0; - void *img; - int n, fsize, cnt; - char *ptr; - char *inffile = NULL, *sysfile = NULL; - char *outfile = NULL, *firmfile = NULL; - char *dname = NULL; - int ch; - - while((ch = getopt(argc, argv, "i:s:o:n:f:O")) != -1) { - switch(ch) { - case 'f': - firmfile = optarg; - break; - case 'i': - inffile = optarg; - break; - case 's': - sysfile = optarg; - break; - case 'o': - outfile = optarg; - break; - case 'n': - dname = optarg; - break; - case 'O': - bin = 1; - break; - default: - usage(); - break; - } - } - - if (firmfile != NULL) - firmcvt(firmfile); - - if (sysfile == NULL) - usage(); - - /* Open the .SYS file and load it into memory */ - fp = fopen(sysfile, "r"); - if (fp == NULL) - err(1, "opening .SYS file '%s' failed", sysfile); - fseek (fp, 0L, SEEK_END); - fsize = ftell (fp); - if (fsize == -1) - err(1, "getting size of .SYS file '%s' failed", sysfile); - rewind (fp); - img = malloc(fsize); - n = fread (img, fsize, 1, fp); - if (n < 1) - err(1, "reading .SYS file '%s' failed", sysfile); - - fclose(fp); - fp = NULL; - - if (insert_padding(&img, &fsize)) { - errx(1, "section relocation failed"); - } - - if (outfile == NULL || strcmp(outfile, "-") == 0) - outfp = stdout; - else { - outfp = fopen(outfile, "w"); - if (outfp == NULL) - err(1, "opening output file '%s' failed", outfile); - } - - fprintf(outfp, "\n/*\n"); - fprintf(outfp, " * Generated from %s and %s (%d bytes)\n", - inffile == NULL ? "" : inffile, sysfile, fsize); - fprintf(outfp, " */\n\n"); - - if (dname != NULL) { - if (strlen(dname) > IFNAMSIZ) - err(1, "selected device name '%s' is " - "too long (max chars: %d)", dname, IFNAMSIZ); - fprintf (outfp, "#define NDIS_DEVNAME \"%s\"\n", dname); - fprintf (outfp, "#define NDIS_MODNAME %s\n\n", dname); - } - - if (inffile == NULL) { - fprintf (outfp, "#ifdef NDIS_REGVALS\n"); - fprintf (outfp, "ndis_cfg ndis_regvals[] = {\n"); - fprintf (outfp, "\t{ NULL, NULL, { 0 }, 0 }\n"); - fprintf (outfp, "#endif /* NDIS_REGVALS */\n"); - - fprintf (outfp, "};\n\n"); - } else { - fp = fopen(inffile, "r"); - if (fp == NULL) - err(1, "opening .INF file '%s' failed", inffile); - - - inf_parse(fp, outfp); - fclose(fp); - fp = NULL; - } - - fprintf(outfp, "\n#ifdef NDIS_IMAGE\n"); - - if (bin) { - sysfile = strdup(basename(sysfile)); - ptr = sysfile; - while (*ptr) { - if (*ptr == '.') - *ptr = '_'; - ptr++; - } - fprintf(outfp, - "\nextern unsigned char %s_drv_data_start[];\n", - sysfile); - fprintf(outfp, "static unsigned char *drv_data = " - "%s_drv_data_start;\n\n", sysfile); - bincvt(sysfile, outfile, img, fsize); - goto done; - } - - - fprintf(outfp, "\nextern unsigned char drv_data[];\n\n"); - - fprintf(outfp, "__asm__(\".data\");\n"); - fprintf(outfp, "__asm__(\".globl drv_data\");\n"); - fprintf(outfp, "__asm__(\".type drv_data, @object\");\n"); - fprintf(outfp, "__asm__(\".size drv_data, %d\");\n", fsize); - fprintf(outfp, "__asm__(\"drv_data:\");\n"); - - ptr = img; - cnt = 0; - while(cnt < fsize) { - fprintf (outfp, "__asm__(\".byte "); - for (i = 0; i < 10; i++) { - cnt++; - if (cnt == fsize) { - fprintf(outfp, "0x%.2X\");\n", ptr[i]); - goto done; - } else { - if (i == 9) - fprintf(outfp, "0x%.2X\");\n", ptr[i]); - else - fprintf(outfp, "0x%.2X, ", ptr[i]); - } - } - ptr += 10; - } - -done: - - fprintf(outfp, "#endif /* NDIS_IMAGE */\n"); - - if (fp != NULL) - fclose(fp); - fclose(outfp); - free(img); - exit(0); -}