12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Andrew Tridgell 1995-1999
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This software may be distributed either under the terms of the
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * BSD-style license that accompanies tcpdump or the GNU GPL version 2
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or later
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     "@(#) $Header: /tcpdump/master/tcpdump/print-smb.c,v 1.41.2.4 2007/07/14 22:29:05 guy Exp $";
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "smb.h"
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int request = 0;
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int unicodestr = 0;
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst u_char *startbuf = NULL;
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct smbdescript {
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *req_f1;
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *req_f2;
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *rep_f1;
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *rep_f2;
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    void (*fn)(const u_char *, const u_char *, const u_char *, const u_char *);
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct smbdescriptint {
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *req_f1;
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *req_f2;
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *rep_f1;
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *rep_f2;
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    void (*fn)(const u_char *, const u_char *, int, int);
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct smbfns
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int id;
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *name;
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int flags;
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct smbdescript descript;
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct smbfnsint
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int id;
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *name;
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int flags;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct smbdescriptint descript;
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define DEFDESCRIPT	{ NULL, NULL, NULL, NULL, NULL }
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FLG_CHAIN	(1 << 0)
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct smbfns *
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsmbfind(int id, struct smbfns *list)
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int sindex;
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (sindex = 0; list[sindex].name; sindex++)
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (list[sindex].id == id)
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return(&list[sindex]);
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(&list[0]);
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct smbfnsint *
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsmbfindint(int id, struct smbfnsint *list)
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int sindex;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (sindex = 0; list[sindex].name; sindex++)
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (list[sindex].id == id)
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return(&list[sindex]);
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return(&list[0]);
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrans2_findfirst(const u_char *param, const u_char *data, int pcnt, int dcnt)
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *fmt;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request)
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fmt = "Attribute=[A]\nSearchCount=[d]\nFlags=[w]\nLevel=[dP4]\nFile=[S]\n";
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fmt = "Handle=[w]\nCount=[d]\nEOS=[w]\nEoffset=[d]\nLastNameOfs=[w]\n";
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    smb_fdata(param, fmt, param + pcnt, unicodestr);
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (dcnt) {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("data:\n");
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_data(data, dcnt);
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrans2_qfsinfo(const u_char *param, const u_char *data, int pcnt, int dcnt)
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    static int level = 0;
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *fmt="";
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*param, 2);
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	level = EXTRACT_LE_16BITS(param);
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fmt = "InfoLevel=[d]\n";
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(param, fmt, param + pcnt, unicodestr);
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (level) {
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fmt = "idFileSystem=[W]\nSectorUnit=[D]\nUnit=[D]\nAvail=[D]\nSectorSize=[d]\n";
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fmt = "CreationTime=[T2]VolNameLength=[lb]\nVolumeLabel=[c]\n";
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x105:
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fmt = "Capabilities=[W]\nMaxFileLen=[D]\nVolNameLen=[lD]\nVolume=[C]\n";
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fmt = "UnknownLevel\n";
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(data, fmt, data + dcnt, unicodestr);
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (dcnt) {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("data:\n");
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_data(data, dcnt);
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct smbfnsint trans2_fns[] = {
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 0, "TRANSACT2_OPEN", 0,
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Flags2=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]\nOFun=[w]\nSize=[D]\nRes=([w, w, w, w, w])\nPath=[S]",
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL,
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Handle=[d]\nAttrib=[A]\nTime=[T2]\nSize=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nInode=[W]\nOffErr=[d]\n|EALength=[d]\n",
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL }},
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 1, "TRANSACT2_FINDFIRST", 0,
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL, NULL, trans2_findfirst }},
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 2, "TRANSACT2_FINDNEXT", 0, DEFDESCRIPT },
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 3, "TRANSACT2_QFSINFO", 0,
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL, NULL, trans2_qfsinfo }},
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 4, "TRANSACT2_SETFSINFO", 0, DEFDESCRIPT },
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 5, "TRANSACT2_QPATHINFO", 0, DEFDESCRIPT },
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 6, "TRANSACT2_SETPATHINFO", 0, DEFDESCRIPT },
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 7, "TRANSACT2_QFILEINFO", 0, DEFDESCRIPT },
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 8, "TRANSACT2_SETFILEINFO", 0, DEFDESCRIPT },
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 9, "TRANSACT2_FSCTL", 0, DEFDESCRIPT },
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 10, "TRANSACT2_IOCTL", 0, DEFDESCRIPT },
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 11, "TRANSACT2_FINDNOTIFYFIRST", 0, DEFDESCRIPT },
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 12, "TRANSACT2_FINDNOTIFYNEXT", 0, DEFDESCRIPT },
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { 13, "TRANSACT2_MKDIR", 0, DEFDESCRIPT },
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { -1, NULL, 0, DEFDESCRIPT }
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_trans2(const u_char *words, const u_char *dat, const u_char *buf, const u_char *maxbuf)
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int bcc;
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    static struct smbfnsint *fn = &trans2_fns[0];
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *data, *param;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *w = words + 1;
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *f1 = NULL, *f2 = NULL;
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int pcnt, dcnt;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(words[0]);
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(w[14 * 2], 2);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcnt = EXTRACT_LE_16BITS(w + 9 * 2);
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	param = buf + EXTRACT_LE_16BITS(w + 10 * 2);
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dcnt = EXTRACT_LE_16BITS(w + 11 * 2);
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = buf + EXTRACT_LE_16BITS(w + 12 * 2);
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fn = smbfindint(EXTRACT_LE_16BITS(w + 14 * 2), trans2_fns);
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (words[0] == 0) {
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s\n", fn->name);
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Trans2Interim\n");
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(w[7 * 2], 2);
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcnt = EXTRACT_LE_16BITS(w + 3 * 2);
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	param = buf + EXTRACT_LE_16BITS(w + 4 * 2);
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dcnt = EXTRACT_LE_16BITS(w + 6 * 2);
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = buf + EXTRACT_LE_16BITS(w + 7 * 2);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%s param_length=%d data_length=%d\n", fn->name, pcnt, dcnt);
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (words[0] == 8) {
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(words + 1,
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"Trans2Secondary\nTotParam=[d]\nTotData=[d]\nParamCnt=[d]\nParamOff=[d]\nParamDisp=[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nHandle=[d]\n",
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf, unicodestr);
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(words + 1,
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"TotParam=[d]\nTotData=[d]\nMaxParam=[d]\nMaxData=[d]\nMaxSetup=[b][P1]\nFlags=[w]\nTimeOut=[D]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nDataCnt=[d]\nDataOff=[d]\nSetupCnt=[b][P1]\n",
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		words + 1 + 14 * 2, unicodestr);
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = fn->descript.req_f1;
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f2 = fn->descript.req_f2;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(words + 1,
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "TotParam=[d]\nTotData=[d]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nParamDisp[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nSetupCnt=[b][P1]\n",
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    words + 1 + 10 * 2, unicodestr);
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = fn->descript.rep_f1;
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f2 = fn->descript.rep_f2;
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*dat, 2);
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    bcc = EXTRACT_LE_16BITS(dat);
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("smb_bcc=%u\n", bcc);
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (fn->descript.fn)
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(*fn->descript.fn)(param, data, pcnt, dcnt);
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else {
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(param, f1 ? f1 : "Parameters=\n", param + pcnt, unicodestr);
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(data, f2 ? f2 : "Data=\n", data + dcnt, unicodestr);
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_browse(const u_char *param, int paramlen, const u_char *data, int datalen)
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf = data + datalen;
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int command;
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(data[0]);
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    command = data[0];
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    smb_fdata(param, "BROWSE PACKET\n|Param ", param+paramlen, unicodestr);
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch (command) {
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xF:
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (LocalMasterAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0x1:
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (HostAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0x2:
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (AnnouncementRequest)\nFlags=[B]\nReplySystemName=[S]\n",
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xc:
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (WorkgroupAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nCommentPointer=[W]\nServerName=[S]\n",
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0x8:
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (ElectionFrame)\nElectionVersion=[B]\nOSSummary=[W]\nUptime=[(W, W)]\nServerName=[S]\n",
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xb:
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (BecomeBackupBrowser)\nName=[S]\n",
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0x9:
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (GetBackupList)\nListCount?=[B]\nToken=[W]\n",
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xa:
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (BackupListResponse)\nServerCount?=[B]\nToken=[W]\n*Name=[S]\n",
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xd:
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (MasterAnnouncement)\nMasterName=[S]\n",
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    maxbuf, unicodestr);
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0xe:
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data,
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    "BROWSE PACKET:\nType=[B] (ResetBrowser)\nOptions=[B]\n", maxbuf, unicodestr);
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default:
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data, "Unknown Browser Frame ", maxbuf, unicodestr);
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	break;
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_ipc(const u_char *param, int paramlen, const u_char *data, int datalen)
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (paramlen)
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(param, "Command=[w]\nStr1=[S]\nStr2=[S]\n", param + paramlen,
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    unicodestr);
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (datalen)
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(data, "IPC ", data + datalen, unicodestr);
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_trans(const u_char *words, const u_char *data1, const u_char *buf, const u_char *maxbuf)
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int bcc;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *f1, *f2, *f3, *f4;
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *data, *param;
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *w = words + 1;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int datalen, paramlen;
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(w[12 * 2], 2);
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	paramlen = EXTRACT_LE_16BITS(w + 9 * 2);
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	param = buf + EXTRACT_LE_16BITS(w + 10 * 2);
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	datalen = EXTRACT_LE_16BITS(w + 11 * 2);
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = buf + EXTRACT_LE_16BITS(w + 12 * 2);
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nMaxParmCnt=[d] \nMaxDataCnt=[d]\nMaxSCnt=[d] \nTransFlags=[w] \nRes1=[w] \nRes2=[w] \nRes3=[w]\nParamCnt=[d] \nParamOff=[d] \nDataCnt=[d] \nDataOff=[d] \nSUCnt=[d]\n";
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f2 = "|Name=[S]\n";
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f3 = "|Param ";
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f4 = "|Data ";
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(w[7 * 2], 2);
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	paramlen = EXTRACT_LE_16BITS(w + 3 * 2);
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	param = buf + EXTRACT_LE_16BITS(w + 4 * 2);
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	datalen = EXTRACT_LE_16BITS(w + 6 * 2);
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = buf + EXTRACT_LE_16BITS(w + 7 * 2);
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nRes1=[d]\nParamCnt=[d] \nParamOff=[d] \nRes2=[d] \nDataCnt=[d] \nDataOff=[d] \nRes3=[d]\nLsetup=[d]\n";
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f2 = "|Unknown ";
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f3 = "|Param ";
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f4 = "|Data ";
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    smb_fdata(words + 1, f1, SMBMIN(words + 1 + 2 * words[0], maxbuf),
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        unicodestr);
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*data1, 2);
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    bcc = EXTRACT_LE_16BITS(data1);
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("smb_bcc=%u\n", bcc);
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (bcc > 0) {
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(data1 + 2, f2, maxbuf - (paramlen + datalen), unicodestr);
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (strcmp((const char *)(data1 + 2), "\\MAILSLOT\\BROWSE") == 0) {
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_browse(param, paramlen, data, datalen);
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (strcmp((const char *)(data1 + 2), "\\PIPE\\LANMAN") == 0) {
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_ipc(param, paramlen, data, datalen);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    return;
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (paramlen)
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(param, f3, SMBMIN(param + paramlen, maxbuf), unicodestr);
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (datalen)
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(data, f4, SMBMIN(data + datalen, maxbuf), unicodestr);
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_negprot(const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int wct, bcc;
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *f1 = NULL, *f2 = NULL;
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(words[0]);
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    wct = words[0];
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request)
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f2 = "*|Dialect=[Y]\n";
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else {
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (wct == 1)
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Core Protocol\nDialectIndex=[d]";
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (wct == 17)
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "NT1 Protocol\nDialectIndex=[d]\nSecMode=[B]\nMaxMux=[d]\nNumVcs=[d]\nMaxBuffer=[D]\nRawSize=[D]\nSessionKey=[W]\nCapabilities=[W]\nServerTime=[T3]TimeZone=[d]\nCryptKey=";
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (wct == 13)
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Coreplus/Lanman1/Lanman2 Protocol\nDialectIndex=[d]\nSecMode=[w]\nMaxXMit=[d]\nMaxMux=[d]\nMaxVcs=[d]\nBlkMode=[w]\nSessionKey=[W]\nServerTime=[T1]TimeZone=[d]\nRes=[W]\nCryptKey=";
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (f1)
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(words + 1, f1, SMBMIN(words + 1 + wct * 2, maxbuf),
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    unicodestr);
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_data(words + 1, SMBMIN(wct * 2, PTR_DIFF(maxbuf, words + 1)));
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*data, 2);
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    bcc = EXTRACT_LE_16BITS(data);
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("smb_bcc=%u\n", bcc);
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (bcc > 0) {
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (f2)
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(data + 2, f2, SMBMIN(data + 2 + EXTRACT_LE_16BITS(data),
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf), unicodestr);
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_data(data + 2, SMBMIN(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_sesssetup(const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int wct, bcc;
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *f1 = NULL, *f2 = NULL;
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(words[0]);
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    wct = words[0];
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (wct == 10)
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Com2=[w]\nOff2=[d]\nBufSize=[d]\nMpxMax=[d]\nVcNum=[d]\nSessionKey=[W]\nPassLen=[d]\nCryptLen=[d]\nCryptOff=[d]\nPass&Name=\n";
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Com2=[B]\nRes1=[B]\nOff2=[d]\nMaxBuffer=[d]\nMaxMpx=[d]\nVcNumber=[d]\nSessionKey=[W]\nCaseInsensitivePasswordLength=[d]\nCaseSensitivePasswordLength=[d]\nRes=[W]\nCapabilities=[W]\nPass1&Pass2&Account&Domain&OS&LanMan=\n";
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (wct == 3) {
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Com2=[w]\nOff2=[d]\nAction=[w]\n";
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (wct == 13) {
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = "Com2=[B]\nRes=[B]\nOff2=[d]\nAction=[w]\n";
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f2 = "NativeOS=[S]\nNativeLanMan=[S]\nPrimaryDomain=[S]\n";
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (f1)
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(words + 1, f1, SMBMIN(words + 1 + wct * 2, maxbuf),
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    unicodestr);
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_data(words + 1, SMBMIN(wct * 2, PTR_DIFF(maxbuf, words + 1)));
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*data, 2);
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    bcc = EXTRACT_LE_16BITS(data);
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("smb_bcc=%u\n", bcc);
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (bcc > 0) {
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (f2)
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(data + 2, f2, SMBMIN(data + 2 + EXTRACT_LE_16BITS(data),
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf), unicodestr);
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_data(data + 2, SMBMIN(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_lockingandx(const u_char *words, const u_char *data, const u_char *buf _U_, const u_char *maxbuf)
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int wct, bcc;
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxwords;
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *f1 = NULL, *f2 = NULL;
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(words[0]);
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    wct = words[0];
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (request) {
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = "Com2=[w]\nOff2=[d]\nHandle=[d]\nLockType=[w]\nTimeOut=[D]\nUnlockCount=[d]\nLockCount=[d]\n";
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(words[7]);
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (words[7] & 0x10)
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f2 = "*Process=[d]\n[P2]Offset=[M]\nLength=[M]\n";
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f2 = "*Process=[d]\nOffset=[D]\nLength=[D]\n";
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	f1 = "Com2=[w]\nOff2=[d]\n";
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    maxwords = SMBMIN(words + 1 + wct * 2, maxbuf);
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (wct)
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(words + 1, f1, maxwords, unicodestr);
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(*data, 2);
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    bcc = EXTRACT_LE_16BITS(data);
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("smb_bcc=%u\n", bcc);
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (bcc > 0) {
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (f2)
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(data + 2, f2, SMBMIN(data + 2 + EXTRACT_LE_16BITS(data),
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf), unicodestr);
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_data(data + 2, SMBMIN(EXTRACT_LE_16BITS(data), PTR_DIFF(maxbuf, data + 2)));
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct smbfns smb_fns[] = {
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { -1, "SMBunknown", 0, DEFDESCRIPT },
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtcon, "SMBtcon", 0,
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Path=[Z]\nPassword=[Z]\nDevice=[Z]\n",
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "MaxXmit=[d]\nTreeId=[d]\n", NULL,
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtdis, "SMBtdis", 0, DEFDESCRIPT },
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBexit,  "SMBexit", 0, DEFDESCRIPT },
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBioctl, "SMBioctl", 0, DEFDESCRIPT },
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBecho, "SMBecho", 0,
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "ReverbCount=[d]\n", NULL,
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "SequenceNum=[d]\n", NULL,
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBulogoffX, "SMBulogoffX", FLG_CHAIN, DEFDESCRIPT },
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBgetatr, "SMBgetatr", 0,
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Path=[Z]\n",
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Attribute=[A]\nTime=[T2]Size=[D]\nRes=([w,w,w,w,w])\n", NULL,
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsetatr, "SMBsetatr", 0,
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Attribute=[A]\nTime=[T2]Res=([w,w,w,w,w])\n", "Path=[Z]\n",
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL, NULL } },
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBchkpth, "SMBchkpth", 0,
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project       { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsearch, "SMBsearch", 0,
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Count=[d]\nAttrib=[A]\n",
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\n",
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n",
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBopen, "SMBopen", 0,
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Mode=[w]\nAttribute=[A]\n", "Path=[Z]\n",
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Handle=[d]\nOAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\n",
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBcreate, "SMBcreate", 0,
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Attrib=[A]\nTime=[T2]", "Path=[Z]\n", "Handle=[d]\n", NULL, NULL } },
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBmknew, "SMBmknew", 0,
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Attrib=[A]\nTime=[T2]", "Path=[Z]\n", "Handle=[d]\n", NULL, NULL } },
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBunlink, "SMBunlink", 0,
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Attrib=[A]\n", "Path=[Z]\n", NULL, NULL, NULL } },
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBread, "SMBread", 0,
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\nRes=([w,w,w,w])\n", NULL, NULL } },
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwrite, "SMBwrite", 0,
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n", NULL, NULL } },
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBclose, "SMBclose", 0,
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nTime=[T2]", NULL, NULL, NULL, NULL } },
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBmkdir, "SMBmkdir", 0,
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Path=[Z]\n", NULL, NULL, NULL } },
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBrmdir, "SMBrmdir", 0,
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Path=[Z]\n", NULL, NULL, NULL } },
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBdskattr, "SMBdskattr", 0,
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL,
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "TotalUnits=[d]\nBlocksPerUnit=[d]\nBlockSize=[d]\nFreeUnits=[d]\nMedia=[w]\n",
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBmv, "SMBmv", 0,
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Attrib=[A]\n", "OldPath=[Z]\nNewPath=[Z]\n", NULL, NULL, NULL } },
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * this is a Pathworks specific call, allowing the
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * changing of the root path
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { pSETDIR, "SMBsetdir", 0, { NULL, "Path=[Z]\n", NULL, NULL, NULL } },
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBlseek, "SMBlseek", 0,
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nMode=[w]\nOffset=[D]\n", "Offset=[D]\n", NULL, NULL, NULL } },
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBflush, "SMBflush", 0, { "Handle=[d]\n", NULL, NULL, NULL, NULL } },
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsplopen, "SMBsplopen", 0,
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "SetupLen=[d]\nMode=[w]\n", "Ident=[Z]\n", "Handle=[d]\n",
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsplclose, "SMBsplclose", 0,
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\n", NULL, NULL, NULL, NULL } },
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsplretq, "SMBsplretq", 0,
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "MaxCount=[d]\nStartIndex=[d]\n", NULL,
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\nIndex=[d]\n",
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "*Time=[T2]Status=[B]\nJobID=[d]\nSize=[D]\nRes=[B]Name=[s16]\n",
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsplwr, "SMBsplwr", 0,
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\n", NULL, NULL, NULL, NULL } },
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBlock, "SMBlock", 0,
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nCount=[D]\nOffset=[D]\n", NULL, NULL, NULL, NULL } },
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBunlock, "SMBunlock", 0,
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nCount=[D]\nOffset=[D]\n", NULL, NULL, NULL, NULL } },
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* CORE+ PROTOCOL FOLLOWS */
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBreadbraw, "SMBreadbraw", 0,
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[d]\n",
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL, NULL, NULL } },
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwritebraw, "SMBwritebraw", 0,
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nTotalCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\n|DataSize=[d]\nDataOff=[d]\n",
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, "WriteRawAck", NULL, NULL } },
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwritec, "SMBwritec", 0,
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, "Count=[d]\n", NULL, NULL } },
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwriteclose, "SMBwriteclose", 0,
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nCount=[d]\nOffset=[D]\nTime=[T2]Res=([w,w,w,w,w,w])",
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, "Count=[d]\n", NULL, NULL } },
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBlockread, "SMBlockread", 0,
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\nRes=([w,w,w,w])\n", NULL, NULL } },
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwriteunlock, "SMBwriteunlock", 0,
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n", NULL,
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n", NULL, NULL } },
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBreadBmpx, "SMBreadBmpx", 0,
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[w]\n",
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL,
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Offset=[D]\nTotCount=[d]\nRemaining=[d]\nRes=([w,w])\nDataSize=[d]\nDataOff=[d]\n",
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwriteBmpx, "SMBwriteBmpx", 0,
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nTotCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\nDataSize=[d]\nDataOff=[d]\n", NULL,
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Remaining=[d]\n", NULL, NULL } },
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwriteBs, "SMBwriteBs", 0,
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nTotCount=[d]\nOffset=[D]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\n",
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, "Count=[d]\n", NULL, NULL } },
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsetattrE, "SMBsetattrE", 0,
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\nCreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]", NULL,
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL, NULL } },
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBgetattrE, "SMBgetattrE", 0,
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\n", NULL,
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "CreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]Size=[D]\nAllocSize=[D]\nAttribute=[A]\n",
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtranss, "SMBtranss", 0, DEFDESCRIPT },
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBioctls, "SMBioctls", 0, DEFDESCRIPT },
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBcopy, "SMBcopy", 0,
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "TreeID2=[d]\nOFun=[w]\nFlags=[w]\n", "Path=[S]\nNewPath=[S]\n",
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "CopyCount=[d]\n",  "|ErrStr=[S]\n",  NULL } },
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBmove, "SMBmove", 0,
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "TreeID2=[d]\nOFun=[w]\nFlags=[w]\n", "Path=[S]\nNewPath=[S]\n",
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "MoveCount=[d]\n",  "|ErrStr=[S]\n",  NULL } },
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBopenX, "SMBopenX", FLG_CHAIN,
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Com2=[w]\nOff2=[d]\nFlags=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]OFun=[w]\nSize=[D]\nTimeOut=[D]\nRes=[W]\n",
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[S]\n",
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Com2=[w]\nOff2=[d]\nHandle=[d]\nAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nFileID=[W]\nRes=[w]\n",
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBreadX, "SMBreadX", FLG_CHAIN,
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nCountLeft=[d]\n",
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL,
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Com2=[w]\nOff2=[d]\nRemaining=[d]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\nRes=([w,w,w,w])\n",
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBwriteX, "SMBwriteX", FLG_CHAIN,
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nCountLeft=[d]\nRes=[w]\nDataSize=[d]\nDataOff=[d]\n",
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL,
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Com2=[w]\nOff2=[d]\nCount=[d]\nRemaining=[d]\nRes=[W]\n",
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBffirst, "SMBffirst", 0,
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Count=[d]\nAttrib=[A]\n",
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n",
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBfunique, "SMBfunique", 0,
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Count=[d]\nAttrib=[A]\n",
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n",
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBfclose, "SMBfclose", 0,
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Count=[d]\nAttrib=[A]\n",
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Count=[d]\n",
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL } },
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBfindnclose, "SMBfindnclose", 0,
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\n", NULL, NULL, NULL, NULL } },
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBfindclose, "SMBfindclose", 0,
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Handle=[d]\n", NULL, NULL, NULL, NULL } },
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsends, "SMBsends", 0,
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Source=[Z]\nDest=[Z]\n", NULL, NULL, NULL } },
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsendstrt, "SMBsendstrt", 0,
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Source=[Z]\nDest=[Z]\n", "GroupID=[d]\n", NULL, NULL } },
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsendend, "SMBsendend", 0,
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "GroupID=[d]\n", NULL, NULL, NULL, NULL } },
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsendtxt, "SMBsendtxt", 0,
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "GroupID=[d]\n", NULL, NULL, NULL, NULL } },
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsendb, "SMBsendb", 0,
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, "Source=[Z]\nDest=[Z]\n", NULL, NULL, NULL } },
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBfwdname, "SMBfwdname", 0, DEFDESCRIPT },
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBcancelf, "SMBcancelf", 0, DEFDESCRIPT },
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBgetmac, "SMBgetmac", 0, DEFDESCRIPT },
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBnegprot, "SMBnegprot", 0,
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL, NULL, print_negprot } },
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBsesssetupX, "SMBsesssetupX", FLG_CHAIN,
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL, NULL, print_sesssetup } },
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtconX, "SMBtconX", FLG_CHAIN,
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Com2=[w]\nOff2=[d]\nFlags=[w]\nPassLen=[d]\nPasswd&Path&Device=\n",
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, "Com2=[w]\nOff2=[d]\n", "ServiceType=[R]\n", NULL } },
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBlockingX, "SMBlockingX", FLG_CHAIN,
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL, NULL, print_lockingandx } },
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtrans2, "SMBtrans2", 0, { NULL, NULL, NULL, NULL, print_trans2 } },
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtranss2, "SMBtranss2", 0, DEFDESCRIPT },
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBctemp, "SMBctemp", 0, DEFDESCRIPT },
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBreadBs, "SMBreadBs", 0, DEFDESCRIPT },
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBtrans, "SMBtrans", 0, { NULL, NULL, NULL, NULL, print_trans } },
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBnttrans, "SMBnttrans", 0, DEFDESCRIPT },
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBnttranss, "SMBnttranss", 0, DEFDESCRIPT },
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBntcreateX, "SMBntcreateX", FLG_CHAIN,
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Com2=[w]\nOff2=[d]\nRes=[b]\nNameLen=[ld]\nFlags=[W]\nRootDirectoryFid=[D]\nAccessMask=[W]\nAllocationSize=[L]\nExtFileAttributes=[W]\nShareAccess=[W]\nCreateDisposition=[W]\nCreateOptions=[W]\nImpersonationLevel=[W]\nSecurityFlags=[b]\n",
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Path=[C]\n",
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Com2=[w]\nOff2=[d]\nOplockLevel=[b]\nFid=[d]\nCreateAction=[W]\nCreateTime=[T3]LastAccessTime=[T3]LastWriteTime=[T3]ChangeTime=[T3]ExtFileAttributes=[W]\nAllocationSize=[L]\nEndOfFile=[L]\nFileType=[w]\nDeviceState=[w]\nDirectory=[b]\n",
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  NULL, NULL } },
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { SMBntcancel, "SMBntcancel", 0, DEFDESCRIPT },
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    { -1, NULL, 0, DEFDESCRIPT }
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a SMB message
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_smb(const u_char *buf, const u_char *maxbuf)
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int16_t flags2;
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int nterrcodes;
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int command;
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int32_t nterror;
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *words, *maxwords, *data;
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct smbfns *fn;
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *fmt_smbheader =
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        "[P4]SMB Command   =  [B]\nError class   =  [BP1]\nError code    =  [d]\nFlags1        =  [B]\nFlags2        =  [B][P13]\nTree ID       =  [d]\nProc ID       =  [d]\nUID           =  [d]\nMID           =  [d]\nWord Count    =  [b]\n";
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int smboffset;
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(buf[9]);
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    request = (buf[9] & 0x80) ? 0 : 1;
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    flags2 = EXTRACT_LE_16BITS(&buf[10]);
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    unicodestr = flags2 & 0x8000;
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    nterrcodes = flags2 & 0x4000;
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = buf;
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    command = buf[4];
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fn = smbfind(command, smb_fns);
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag > 1)
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("SMB PACKET: %s (%s)\n", fn->name, request ? "REQUEST" : "REPLY");
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2)
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* print out the header */
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    smb_fdata(buf, fmt_smbheader, buf + 33, unicodestr);
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (nterrcodes) {
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    	nterror = EXTRACT_LE_32BITS(&buf[5]);
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (nterror)
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("NTError = %s\n", nt_errstr(nterror));
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (buf[5])
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("SMBError = %s\n", smb_errstr(buf[5], EXTRACT_LE_16BITS(&buf[7])));
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    smboffset = 32;
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (;;) {
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *f1, *f2;
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int wct;
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int bcc;
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int newsmboffset;
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	words = buf + smboffset;
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(words[0]);
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	wct = words[0];
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = words + 1 + wct * 2;
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maxwords = SMBMIN(data, maxbuf);
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (request) {
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = fn->descript.req_f1;
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f2 = fn->descript.req_f2;
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f1 = fn->descript.rep_f1;
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    f2 = fn->descript.rep_f2;
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fn->descript.fn)
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (*fn->descript.fn)(words, data, buf, maxbuf);
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (wct) {
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (f1)
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    smb_fdata(words + 1, f1, words + 1 + wct * 2, unicodestr);
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else {
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    int i;
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    int v;
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    for (i = 0; &words[1 + 2 * i] < maxwords; i++) {
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(words[1 + 2 * i], 2);
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			v = EXTRACT_LE_16BITS(words + 1 + 2 * i);
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("smb_vwv[%d]=%d (0x%X)\n", i, v, v);
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    TCHECK2(*data, 2);
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    bcc = EXTRACT_LE_16BITS(data);
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("smb_bcc=%u\n", bcc);
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (f2) {
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bcc > 0)
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    smb_fdata(data + 2, f2, data + 2 + bcc, unicodestr);
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    } else {
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bcc > 0) {
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("smb_buf[]=\n");
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    print_data(data + 2, SMBMIN(bcc, PTR_DIFF(maxbuf, data + 2)));
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((fn->flags & FLG_CHAIN) == 0)
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (wct == 0)
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(words[1]);
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	command = words[1];
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (command == 0xFF)
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(words[3], 2);
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	newsmboffset = EXTRACT_LE_16BITS(words + 3);
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fn = smbfind(command, smb_fns);
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\nSMB PACKET: %s (%s) (CHAINED)\n",
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fn->name, request ? "REQUEST" : "REPLY");
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (newsmboffset <= smboffset) {
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Bad andX offset: %u <= %u\n", newsmboffset, smboffset);
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smboffset = newsmboffset;
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n");
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a NBT packet received across tcp on port 139
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbt_tcp_print(const u_char *data, int length)
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int caplen;
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int type;
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_int nbt_len;
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf;
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (length < 4)
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto trunc;
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (snapend < data)
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto trunc;
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    caplen = snapend - data;
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (caplen < 4)
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto trunc;
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    maxbuf = data + caplen;
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    type = data[0];
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    nbt_len = EXTRACT_16BITS(data + 2);
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    length -= 4;
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    caplen -= 4;
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = data;
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2) {
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" NBT Session Packet: ");
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x00:
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Session Message");
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x81:
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Session Request");
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x82:
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Session Granted");
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x83:
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    int ecode;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (nbt_len < 4)
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (length < 4)
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (caplen < 4)
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ecode = data[4];
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Session Reject, ");
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    switch (ecode) {
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case 0x80:
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Not listening on called name");
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case 0x81:
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Not listening for calling name");
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case 0x82:
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Called name not present");
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    case 0x83:
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Called name present, but insufficient resources");
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    default:
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Unspecified error 0x%X", ecode);
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x85:
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("Session Keepalive");
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "Unknown packet type [rB]", maxbuf, 0);
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf ("\n>>> NBT Session Packet\n");
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x00:
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "[P1]NBT Session Message\nFlags=[B]\nLength=[rd]\n",
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data + 4, 0);
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (data == NULL)
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (nbt_len >= 4 && caplen >= 4 && memcmp(data,"\377SMB",4) == 0) {
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((int)nbt_len > caplen) {
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if ((int)nbt_len > length)
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("WARNING: Packet is continued in later TCP segments\n");
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    else
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("WARNING: Short packet. Try increasing the snap length by %d\n",
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    nbt_len - caplen);
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		print_smb(data, maxbuf > data + nbt_len ? data + nbt_len : maxbuf);
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    } else
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Session packet:(raw data or continuation?)\n");
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x81:
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data,
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"[P1]NBT Session Request\nFlags=[B]\nLength=[rd]\nDestination=[n1]\nSource=[n1]\n",
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf, 0);
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x82:
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "[P1]NBT Session Granted\nFlags=[B]\nLength=[rd]\n", maxbuf, 0);
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x83:
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const u_char *origdata;
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    int ecode;
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    origdata = data;
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "[P1]NBT SessionReject\nFlags=[B]\nLength=[rd]\nReason=[B]\n",
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf, 0);
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (data == NULL)
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (nbt_len >= 1 && caplen >= 1) {
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ecode = origdata[4];
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (ecode) {
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0x80:
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("Not listening on called name\n");
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0x81:
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("Not listening for calling name\n");
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0x82:
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("Called name not present\n");
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 0x83:
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("Called name present, but insufficient resources\n");
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    printf("Unspecified error 0x%X\n", ecode);
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    break;
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0x85:
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "[P1]NBT Session Keepalive\nFlags=[B]\nLength=[rd]\n", maxbuf, 0);
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "NBT - Unknown packet type\nType=[B]\n", maxbuf, 0);
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n");
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fflush(stdout);
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a NBT packet received across udp on port 137
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbt_udp137_print(const u_char *data, int length)
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf = data + length;
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int name_trn_id, response, opcode, nm_flags, rcode;
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int qdcount, ancount, nscount, arcount;
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *opcodestr;
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *p;
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int total, i;
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK2(data[10], 2);
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    name_trn_id = EXTRACT_16BITS(data);
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    response = (data[2] >> 7);
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    opcode = (data[2] >> 3) & 0xF;
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    nm_flags = ((data[2] & 0x7) << 4) + (data[3] >> 4);
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    rcode = data[3] & 0xF;
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    qdcount = EXTRACT_16BITS(data + 4);
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    ancount = EXTRACT_16BITS(data + 6);
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    nscount = EXTRACT_16BITS(data + 8);
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    arcount = EXTRACT_16BITS(data + 10);
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = data;
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (maxbuf <= data)
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag > 1)
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n>>> ");
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("NBT UDP PACKET(137): ");
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch (opcode) {
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 0: opcodestr = "QUERY"; break;
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 5: opcodestr = "REGISTRATION"; break;
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 6: opcodestr = "RELEASE"; break;
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 7: opcodestr = "WACK"; break;
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 8: opcodestr = "REFRESH(8)"; break;
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 9: opcodestr = "REFRESH"; break;
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case 15: opcodestr = "MULTIHOMED REGISTRATION"; break;
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default: opcodestr = "OPUNKNOWN"; break;
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("%s", opcodestr);
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (response) {
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (rcode)
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("; NEGATIVE");
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("; POSITIVE");
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (response)
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("; RESPONSE");
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("; REQUEST");
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (nm_flags & 1)
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("; BROADCAST");
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("; UNICAST");
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2)
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\nTrnID=0x%X\nOpCode=%d\nNmFlags=0x%X\nRcode=%d\nQueryCount=%d\nAnswerCount=%d\nAuthorityCount=%d\nAddressRecCount=%d\n",
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	name_trn_id, opcode, nm_flags, rcode, qdcount, ancount, nscount,
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	arcount);
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    p = data + 12;
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    total = ancount + nscount + arcount;
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (qdcount > 100 || total > 100) {
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("Corrupt packet??\n");
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (qdcount) {
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("QuestionRecords:\n");
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < qdcount; i++) {
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    p = smb_fdata(p,
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"|Name=[n1]\nQuestionType=[rw]\nQuestionClass=[rw]\n#",
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		maxbuf, 0);
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (p == NULL)
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto out;
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (total) {
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\nResourceRecords:\n");
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < total; i++) {
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    int rdlen;
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    int restype;
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    p = smb_fdata(p, "Name=[n1]\n#", maxbuf, 0);
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (p == NULL)
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto out;
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    restype = EXTRACT_16BITS(p);
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    p = smb_fdata(p, "ResType=[rw]\nResClass=[rw]\nTTL=[rD]\n", p + 8, 0);
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (p == NULL)
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto out;
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    rdlen = EXTRACT_16BITS(p);
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("ResourceLength=%d\nResourceData=\n", rdlen);
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    p += 2;
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (rdlen == 6) {
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p = smb_fdata(p, "AddrType=[rw]\nAddress=[b.b.b.b]\n", p + rdlen, 0);
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (p == NULL)
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    goto out;
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    } else {
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (restype == 0x21) {
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    int numnames;
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    TCHECK(*p);
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    numnames = p[0];
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    p = smb_fdata(p, "NumNames=[B]\n", p + 1, 0);
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    if (p == NULL)
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto out;
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    while (numnames--) {
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p = smb_fdata(p, "Name=[n2]\t#", maxbuf, 0);
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p == NULL)
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    goto out;
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*p);
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p[0] & 0x80)
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    printf("<GROUP> ");
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (p[0] & 0x60) {
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0x00: printf("B "); break;
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0x20: printf("P "); break;
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0x40: printf("M "); break;
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case 0x60: printf("_ "); break;
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p[0] & 0x10)
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    printf("<DEREGISTERING> ");
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p[0] & 0x08)
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    printf("<CONFLICT> ");
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p[0] & 0x04)
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    printf("<ACTIVE> ");
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (p[0] & 0x02)
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    printf("<PERMANENT> ");
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("\n");
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += 2;
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    print_data(p, min(rdlen, length - (p - data)));
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    p += rdlen;
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (p < maxbuf)
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(p, "AdditionalData:\n", maxbuf, 0);
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout:
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n");
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fflush(stdout);
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a NBT packet received across udp on port 138
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnbt_udp138_print(const u_char *data, int length)
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf = data + length;
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (maxbuf > snapend)
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maxbuf = snapend;
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (maxbuf <= data)
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = data;
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2) {
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("NBT UDP PACKET(138)");
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    data = smb_fdata(data,
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"\n>>> NBT UDP PACKET(138) Res=[rw] ID=[rw] IP=[b.b.b.b] Port=[rd] Length=[rd] Res2=[rw]\nSourceName=[n1]\nDestName=[n1]\n#",
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maxbuf, 0);
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (data != NULL) {
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* If there isn't enough data for "\377SMB", don't check for it. */
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (&data[3] >= maxbuf)
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    goto out;
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (memcmp(data, "\377SMB",4) == 0)
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    print_smb(data, maxbuf);
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout:
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n");
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    fflush(stdout);
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   print netbeui frames
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project*/
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct nbf_strings {
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char	*name;
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char	*nonverbose;
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char	*verbose;
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} nbf_strings[0x20] = {
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Add Group Name Query", ", [P23]Name to add=[n2]#",
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P5]ResponseCorrelator=[w]\n[P16]Name to add=[n2]\n" },
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Add Name Query", ", [P23]Name to add=[n2]#",
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P5]ResponseCorrelator=[w]\n[P16]Name to add=[n2]\n" },
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Name In Conflict", NULL, NULL },
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Status Query", NULL, NULL },
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Terminate Trace", NULL, NULL },
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Datagram", NULL,
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P7]Destination=[n2]\nSource=[n2]\n" },
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Broadcast Datagram", NULL,
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P7]Destination=[n2]\nSource=[n2]\n" },
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Name Query", ", [P7]Name=[n2]#",
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P1]SessionNumber=[B]\nNameType=[B][P2]\nResponseCorrelator=[w]\nName=[n2]\nName of sender=[n2]\n" },
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Add Name Response", ", [P1]GroupName=[w] [P4]Destination=[n2] Source=[n2]#",
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "AddNameInProcess=[B]\nGroupName=[w]\nTransmitCorrelator=[w][P2]\nDestination=[n2]\nSource=[n2]\n" },
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Name Recognized", NULL,
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P1]Data2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nDestination=[n2]\nSource=[n2]\n" },
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Status Response", NULL, NULL },
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Terminate Trace", NULL, NULL },
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Data Ack", NULL,
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P3]TransmitCorrelator=[w][P2]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Data First/Middle", NULL,
13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Flags=[{RECEIVE_CONTINUE|NO_ACK||PIGGYBACK_ACK_INCLUDED|}]\nResyncIndicator=[w][P2]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Data Only/Last", NULL,
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Flags=[{|NO_ACK|PIGGYBACK_ACK_ALLOWED|PIGGYBACK_ACK_INCLUDED|}]\nResyncIndicator=[w][P2]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Session Confirm", NULL,
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Data1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Session End", NULL,
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P1]Data2=[w][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Session Initialize", NULL,
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Data1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "No Receive", NULL,
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "Flags=[{|SEND_NO_ACK}]\nDataBytesAccepted=[b][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Receive Outstanding", NULL,
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P1]DataBytesAccepted=[b][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Receive Continue", NULL,
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  "[P2]TransmitCorrelator=[w]\n[P2]RemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n" },
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL, NULL, NULL },	/* not used */
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "Session Alive", NULL, NULL }
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnetbeui_print(u_short control, const u_char *data, int length)
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf = data + length;
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int len;
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int command;
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *data2;
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int is_truncated = 0;
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (maxbuf > snapend)
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maxbuf = snapend;
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    TCHECK(data[4]);
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    len = EXTRACT_LE_16BITS(data);
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    command = data[4];
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    data2 = data + len;
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (data2 >= maxbuf) {
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data2 = maxbuf;
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	is_truncated = 1;
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = data;
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2) {
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("NBF Packet: ");
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data, "[P5]#", maxbuf, 0);
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("\n>>> NBF Packet\nType=0x%X ", control);
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	data = smb_fdata(data, "Length=[d] Signature=[w] Command=[B]\n#", maxbuf, 0);
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (data == NULL)
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto out;
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (command > 0x1f || nbf_strings[command].name == NULL) {
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "Unknown NBF Command#", data2, 0);
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    data = smb_fdata(data, "Unknown NBF Command\n", data2, 0);
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    } else {
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2) {
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s", nbf_strings[command].name);
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (nbf_strings[command].nonverbose != NULL)
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = smb_fdata(data, nbf_strings[command].nonverbose, data2, 0);
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("%s:\n", nbf_strings[command].name);
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (nbf_strings[command].verbose != NULL)
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = smb_fdata(data, nbf_strings[command].verbose, data2, 0);
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    else
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n");
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (vflag < 2)
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (data == NULL)
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto out;
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (is_truncated) {
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* data2 was past the end of the buffer */
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto out;
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* If this isn't a command that would contain an SMB message, quit. */
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (command != 0x08 && command != 0x09 && command != 0x15 &&
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        command != 0x16)
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto out;
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* If there isn't enough data for "\377SMB", don't look for it. */
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (&data2[3] >= maxbuf)
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	goto out;
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (memcmp(data2, "\377SMB",4) == 0)
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_smb(data2, maxbuf);
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else {
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < 128; i++) {
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (&data2[i + 3] >= maxbuf)
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (memcmp(&data2[i], "\377SMB", 4) == 0) {
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("found SMB packet at %d\n", i);
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		print_smb(&data2[i], maxbuf);
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectout:
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("\n");
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|SMB]");
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print IPX-Netbios frames
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectipx_netbios_print(const u_char *data, u_int length)
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /*
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * this is a hack till I work out how to parse the rest of the
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     * NetBIOS-over-IPX stuff
14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int i;
14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const u_char *maxbuf;
14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    maxbuf = data + length;
14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* Don't go past the end of the captured data in the packet. */
14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (maxbuf > snapend)
14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	maxbuf = snapend;
14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    startbuf = data;
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (i = 0; i < 128; i++) {
14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (&data[i + 4] > maxbuf)
14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (memcmp(&data[i], "\377SMB", 4) == 0) {
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    smb_fdata(data, "\n>>> IPX transport ", &data[i], 0);
14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if (data != NULL)
14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		print_smb(&data[i], maxbuf);
14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("\n");
14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fflush(stdout);
14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (i == 128)
14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smb_fdata(data, "\n>>> Unknown IPX ", maxbuf, 0);
14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1472