/*++ Copyright (c) 1998 Microsoft Corporation Module Name: hdrext.c Abstract: This file contains the generic routines for debugging NBF / DLC Headers. Author: Chaitanya Kodeboyina Environment: User Mode --*/ #include "precomp.h" #pragma hdrstop #include "hdrext.h" // // Exported Functions // DECLARE_API( nhdr ) /*++ Routine Description: Print an NBF packet header at an addr Arguments: args - Address of the packet header Detail of debug information Return Value: None --*/ { NBF_HDR NbfPktHdr; ULONG printDetail; ULONG proxyPtr; // Get the detail of debug information needed printDetail = NORM_SHAL; if (*args) { sscanf(args, "%x %lu", &proxyPtr, &printDetail); } // Get the NBF header if (ReadNbfPktHdr(&NbfPktHdr, proxyPtr) != 0) return; // Print the header PrintNbfPktHdr(&NbfPktHdr, proxyPtr, printDetail); } // // Helper Functions // UINT ReadNbfPktHdr(PNBF_HDR pPktHdr, ULONG proxyPtr) { USHORT hdrlen; ULONG bytesRead; // Read the current packet header length if (!ReadMemory(proxyPtr, &hdrlen, sizeof(USHORT), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Packet Header", proxyPtr); return -1; } // Validate the length of the NBF header switch (hdrlen) { case sizeof(NBF_HDR_CONNECTION): // dprintf("Connection Oriented: \n"); break; case sizeof(NBF_HDR_CONNECTIONLESS): // dprintf("Connection Less: \n"); break; case sizeof(NBF_HDR_GENERIC): // dprintf("Generic Header: \n"); break; default: dprintf("%s @ %08x: Improper len = %08x\n", "Packet Header", proxyPtr, hdrlen); return -1; } // Read the current packet header if (!ReadMemory(proxyPtr, pPktHdr, hdrlen, &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Packet Header", proxyPtr); return -1; } return 0; } UINT PrintNbfPktHdr(PNBF_HDR pPktHdr, ULONG proxyPtr, ULONG printDetail) { // Is this a valid NBF packet header ? if (HEADER_SIGNATURE(&pPktHdr->Generic) != NETBIOS_SIGNATURE) { dprintf("%s @ %08x: Could not match signature\n", "Packet Header", proxyPtr); return -1; } // What detail do we have to print at ? if (printDetail > MAX_DETAIL) printDetail = MAX_DETAIL; // Print Information at reqd detail FieldInNbfPktHdr(proxyPtr, NULL, printDetail); return 0; } VOID FieldInNbfPktHdr(ULONG structAddr, CHAR *fieldName, ULONG printDetail) { NBF_HDR NbfHdr; StructAccessInfo *StInfo; if (ReadNbfPktHdr(&NbfHdr, structAddr) == 0) { switch (NbfHdr.Generic.Length) { case sizeof(NBF_HDR_CONNECTION): StInfo = &NbfConnectionHdrInfo; break; case sizeof(NBF_HDR_CONNECTIONLESS): StInfo = &NbfConnectionLessHdrInfo; break; case sizeof(NBF_HDR_GENERIC): StInfo = &NbfGenPktHdrInfo; break; default: return; } PrintFields(&NbfHdr, structAddr, fieldName, printDetail, StInfo); } } UINT FreeNbfPktHdr(PNBF_HDR pPktHdr) { return 0; }