smbutil.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,890 行 · 第 1/5 页

C
1,890
字号
	    strsize = *len - 2;	}    } else {	/*	 * Counted string.	 */	strsize = *len;    }    if (!use_unicode) {    	while (strsize != 0) {    	    TCHECK(s[0]);	    if (l >= MAX_UNISTR_SIZE)		break;	    if (isprint(s[0]))		buf[l] = s[0];	    else {		if (s[0] == 0)		    break;		buf[l] = '.';	    }	    l++;	    s++;	    strsize--;	}    } else {	while (strsize != 0) {	    TCHECK2(s[0], 2);	    if (l >= MAX_UNISTR_SIZE)		break;	    if (s[1] == 0 && isprint(s[0])) {		/* It's a printable ASCII character */		buf[l] = s[0];	    } else {		/* It's a non-ASCII character or a non-printable ASCII character */		if (s[0] == 0 && s[1] == 0)		    break;		buf[l] = '.';	    }	    l++;	    s += 2;	    if (strsize == 1)		break;	    strsize -= 2;	}    }    buf[l] = 0;    return buf;trunc:    return NULL;}static const u_char *smb_fdata1(const u_char *buf, const char *fmt, const u_char *maxbuf,    int unicodestr){    int reverse = 0;    const char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|";    while (*fmt && buf<maxbuf) {	switch (*fmt) {	case 'a':	    TCHECK(buf[0]);	    write_bits(buf[0], attrib_fmt);	    buf++;	    fmt++;	    break;	case 'A':	    TCHECK2(buf[0], 2);	    write_bits(EXTRACT_LE_16BITS(buf), attrib_fmt);	    buf += 2;	    fmt++;	    break;	case '{':	  {	    char bitfmt[128];	    char *p;	    int l;	    p = strchr(++fmt, '}');	    l = PTR_DIFF(p, fmt);	    if ((unsigned int)l > sizeof(bitfmt) - 1)		    l = sizeof(bitfmt)-1;	    strncpy(bitfmt, fmt, l);	    bitfmt[l] = '\0';	    fmt = p + 1;	    TCHECK(buf[0]);	    write_bits(buf[0], bitfmt);	    buf++;	    break;	  }	case 'P':	  {	    int l = atoi(fmt + 1);	    TCHECK2(buf[0], l);	    buf += l;	    fmt++;	    while (isdigit((unsigned char)*fmt))		fmt++;	    break;	  }	case 'r':	    reverse = !reverse;	    fmt++;	    break;	case 'b':	  {	    unsigned int x;	    TCHECK(buf[0]);	    x = buf[0];	    printf("%u (0x%x)", x, x);	    buf += 1;	    fmt++;	    break;	  }	case 'd':	  {	    unsigned int x;	    TCHECK2(buf[0], 2);	    x = reverse ? EXTRACT_16BITS(buf) :			  EXTRACT_LE_16BITS(buf);	    printf("%d (0x%x)", x, x);	    buf += 2;	    fmt++;	    break;	  }	case 'D':	  {	    unsigned int x;	    TCHECK2(buf[0], 4);	    x = reverse ? EXTRACT_32BITS(buf) :			  EXTRACT_LE_32BITS(buf);	    printf("%d (0x%x)", x, x);	    buf += 4;	    fmt++;	    break;	  }	case 'L':	  {	    u_int64_t x;	    TCHECK2(buf[0], 8);	    x = reverse ? EXTRACT_64BITS(buf) :			  EXTRACT_LE_64BITS(buf);	    printf("%" PRIu64 " (0x%" PRIx64 ")", x, x);	    buf += 8;	    fmt++;	    break;	  }	case 'M':	  {	    /* Weird mixed-endian length values in 64-bit locks */	    u_int32_t x1, x2;	    u_int64_t x;	    TCHECK2(buf[0], 8);	    x1 = reverse ? EXTRACT_32BITS(buf) :			   EXTRACT_LE_32BITS(buf);	    x2 = reverse ? EXTRACT_32BITS(buf + 4) :			   EXTRACT_LE_32BITS(buf + 4);	    x = (((u_int64_t)x1) << 32) | x2;	    printf("%" PRIu64 " (0x%" PRIx64 ")", x, x);	    buf += 8;	    fmt++;	    break;	  }	case 'B':	  {	    unsigned int x;	    TCHECK(buf[0]);	    x = buf[0];	    printf("0x%X", x);	    buf += 1;	    fmt++;	    break;	  }	case 'w':	  {	    unsigned int x;	    TCHECK2(buf[0], 2);	    x = reverse ? EXTRACT_16BITS(buf) :			  EXTRACT_LE_16BITS(buf);	    printf("0x%X", x);	    buf += 2;	    fmt++;	    break;	  }	case 'W':	  {	    unsigned int x;	    TCHECK2(buf[0], 4);	    x = reverse ? EXTRACT_32BITS(buf) :			  EXTRACT_LE_32BITS(buf);	    printf("0x%X", x);	    buf += 4;	    fmt++;	    break;	  }	case 'l':	  {	    fmt++;	    switch (*fmt) {	    case 'b':		TCHECK(buf[0]);		stringlen = buf[0];		printf("%u", stringlen);		buf += 1;		break;	    case 'd':		TCHECK2(buf[0], 2);		stringlen = reverse ? EXTRACT_16BITS(buf) :				      EXTRACT_LE_16BITS(buf);		printf("%u", stringlen);		buf += 2;		break;	    case 'D':		TCHECK2(buf[0], 4);		stringlen = reverse ? EXTRACT_32BITS(buf) :				      EXTRACT_LE_32BITS(buf);		printf("%u", stringlen);		buf += 4;		break;	    }	    fmt++;	    break;	  }	case 'S':	case 'R':	/* like 'S', but always ASCII */	  {	    /*XXX unistr() */	    const char *s;	    u_int32_t len;	    len = 0;	    s = unistr(buf, &len, (*fmt == 'R') ? 0 : unicodestr);	    if (s == NULL)		goto trunc;	    printf("%s", s);	    buf += len;	    fmt++;	    break;	  }	case 'Z':	case 'Y':	/* like 'Z', but always ASCII */	  {	    const char *s;	    u_int32_t len;	    TCHECK(*buf);	    if (*buf != 4 && *buf != 2) {		printf("Error! ASCIIZ buffer of type %u", *buf);		return maxbuf;	/* give up */	    }	    len = 0;	    s = unistr(buf + 1, &len, (*fmt == 'Y') ? 0 : unicodestr);	    if (s == NULL)		goto trunc;	    printf("%s", s);	    buf += len + 1;	    fmt++;	    break;	  }	case 's':	  {	    int l = atoi(fmt + 1);	    TCHECK2(*buf, l);	    printf("%-*.*s", l, l, buf);	    buf += l;	    fmt++;	    while (isdigit((unsigned char)*fmt))		fmt++;	    break;	  }	case 'c':	  {	    TCHECK2(*buf, stringlen);	    printf("%-*.*s", (int)stringlen, (int)stringlen, buf);	    buf += stringlen;	    fmt++;	    while (isdigit((unsigned char)*fmt))		fmt++;	    break;	  }	case 'C':	  {	    const char *s;	    s = unistr(buf, &stringlen, unicodestr);	    if (s == NULL)		goto trunc;	    printf("%s", s);	    buf += stringlen;	    fmt++;	    break;	  }	case 'h':	  {	    int l = atoi(fmt + 1);	    TCHECK2(*buf, l);	    while (l--)		printf("%02x", *buf++);	    fmt++;	    while (isdigit((unsigned char)*fmt))		fmt++;	    break;	  }	case 'n':	  {	    int t = atoi(fmt+1);	    char nbuf[255];	    int name_type;	    int len;	    switch (t) {	    case 1:		name_type = name_extract(startbuf, PTR_DIFF(buf, startbuf),		    maxbuf, nbuf);		if (name_type < 0)		    goto trunc;		len = name_len(buf, maxbuf);		if (len < 0)		    goto trunc;		buf += len;		printf("%-15.15s NameType=0x%02X (%s)", nbuf, name_type,		    name_type_str(name_type));		break;	    case 2:		TCHECK(buf[15]);		name_type = buf[15];		printf("%-15.15s NameType=0x%02X (%s)", buf, name_type,		    name_type_str(name_type));		buf += 16;		break;	    }	    fmt++;	    while (isdigit((unsigned char)*fmt))		fmt++;	    break;	  }	case 'T':	  {	    time_t t;	    struct tm *lt;	    const char *tstring;	    u_int32_t x;	    switch (atoi(fmt + 1)) {	    case 1:		TCHECK2(buf[0], 4);		x = EXTRACT_LE_32BITS(buf);		if (x == 0 || x == 0xFFFFFFFF)		    t = 0;		else		    t = make_unix_date(buf);		buf += 4;		break;	    case 2:		TCHECK2(buf[0], 4);		x = EXTRACT_LE_32BITS(buf);		if (x == 0 || x == 0xFFFFFFFF)		    t = 0;		else		    t = make_unix_date2(buf);		buf += 4;		break;	    case 3:		TCHECK2(buf[0], 8);		t = interpret_long_date(buf);		buf += 8;		break;	    default:		t = 0;		break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?