/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: kdutil.c Abstract: Packet scheduler KD extension utilities. Author: Rajesh Sundaram (1st Aug, 1998) Revision History: --*/ #include "precomp.h" EXT_API_VERSION ApiVersion = { 3, 5, EXT_API_VERSION_NUMBER, 0 }; WINDBG_EXTENSION_APIS ExtensionApis; USHORT SavedMajorVersion; USHORT SavedMinorVersion; ULONG GpcClientVcTag = '1CSP'; PCHAR ClientVCState[] = { "", "CL_VC_INITIALIZED", "CL_CALL_PENDING", "CL_INTERNAL_CALL_COMPLETE", "CL_CALL_COMPLETE", "CL_MODIFY_PENDING", "CL_GPC_CLOSE_PENDING", "CL_INTERNAL_CLOSE_PENDING" }; PCHAR ServiceTypeLabels[] = { "No Traffic", "Best Effort", "Controlled Load", "Guaranteed", "Network Unavailable", "General Information", "No Change", "", "", "Non Conforming", "Network Control", "Custom1", "Custom2", "Custom3" }; PCHAR SDMode[]= { "Borrow", "Shape", "Discard", "Borrow Plus"}; ushort IPHeaderXsum(void *Buffer, int Size) { ushort UNALIGNED *Buffer1 = (ushort UNALIGNED *)Buffer; // Buffer expres ulong csum = 0; while (Size > 1) { csum += *Buffer1++; Size -= sizeof(ushort); } if (Size) csum += *(uchar *)Buffer1; // For odd buffers, add in la csum = (csum >> 16) + (csum & 0xffff); csum += (csum >> 16); return (ushort)~csum; } VOID CheckVersion( VOID ) { #if 0 #if DBG if ((SavedMajorVersion != 0x0c) || (SavedMinorVersion != VER_PRODUCTBUILD)) { dprintf("\r\n*** Extension DLL(%d Checked) does not match target " "system(%d %s)\r\n\r\n", VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" ); } #else if ((SavedMajorVersion != 0x0f) || (SavedMinorVersion != VER_PRODUCTBUILD)) { dprintf("\r\n*** Extension DLL(%d Free) does not match target " "system(%d %s)\r\n\r\n", VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" ); } #endif #endif } LPEXT_API_VERSION ExtensionApiVersion( VOID ) { return &ApiVersion; } VOID WinDbgExtensionDllInit( PWINDBG_EXTENSION_APIS lpExtensionApis, USHORT MajorVersion, USHORT MinorVersion ) { ExtensionApis = *lpExtensionApis; SavedMajorVersion = MajorVersion; SavedMinorVersion = MinorVersion; return; } DECLARE_API( version ) { #if DBG PCHAR DebuggerType = "Checked"; #else PCHAR DebuggerType = "Free"; #endif dprintf("%s Extension dll for Build %d debugging %s kernel for Build %d\n", DebuggerType, VER_PRODUCTBUILD, SavedMajorVersion == 0x0c ? "Checked" : "Free", SavedMinorVersion ); } VOID DumpGpcClientVc(PCHAR indent, PGPC_CLIENT_VC TargetClientVC, PGPC_CLIENT_VC LocalClientVC) { PWSTR Name; ULONG bytes; #if DBG if ( LocalClientVC->LLTag != GpcClientVcTag ) { dprintf( "%s ClientVC @ %08X has the wrong type \n", indent, TargetClientVC ); return; } #endif dprintf( "%s ClientVC @ %08X\n\n", indent, TargetClientVC ); dprintf( "%s Refcount = %d \n", indent, LocalClientVC->RefCount); dprintf( "%s VC State = %s\n", indent, ClientVCState[ LocalClientVC->ClVcState ]); dprintf( "%s Adapter = 0x%x \n", indent, LocalClientVC->Adapter); dprintf( "%s Flags = 0x%x \n", indent, LocalClientVC->Flags); dprintf( "%s Lock @ %08X \n", indent, &TargetClientVC->Lock); if(LocalClientVC->InstanceName.Length) { bytes = LocalClientVC->InstanceName.Length; Name = (PWSTR)malloc( bytes ); if ( Name != NULL ) { KD_READ_MEMORY((LocalClientVC->InstanceName.Buffer), Name, bytes); } } else { Name = 0; } dprintf( "%s Instance Name = %ws \n", indent, Name); dprintf( "%s CfInfo Handle = %08X \n", indent, LocalClientVC->CfInfoHandle); dprintf( "%s CfType = %d \n", indent, LocalClientVC->CfType); dprintf( "%s TOS non conforming = %X \n", indent, LocalClientVC->IPPrecedenceNonConforming); dprintf( "%s 802.1p conforming = %X \n", indent, LocalClientVC->UserPriorityConforming); dprintf( "%s 802.1p non conforming = %X \n", indent, LocalClientVC->UserPriorityNonConforming); dprintf( "%s Flow Context = %x \n", indent, LocalClientVC->PsFlowContext); dprintf( "%s TokenRateChange = %x \n", indent, LocalClientVC->TokenRateChange); // // Control by a flag later on.... to much junk otherwize // if(LocalClientVC->CallParameters) { dprintf("%s Call Parameters \n", indent); DumpCallParameters(LocalClientVC, " "); } if(Name) free(Name); return; } VOID DumpFlowSpec( PFLOWSPEC Flow, PCHAR Indent ) { dprintf( "%sTokenRate = %u (%08X)\n", Indent, Flow->TokenRate, Flow->TokenRate ); dprintf( "%sTokenBucketSize = %u (%08X)\n", Indent, Flow->TokenBucketSize, Flow->TokenBucketSize ); dprintf( "%sPeakBandwidth = %u (%08X)\n", Indent, Flow->PeakBandwidth, Flow->PeakBandwidth ); dprintf( "%sLatency = %u (%08X)\n", Indent, Flow->Latency, Flow->Latency ); dprintf( "%sDelayVariation = %u (%08X)\n", Indent, Flow->DelayVariation, Flow->DelayVariation ); if ( (LONG)(Flow->ServiceType) != -1 ) { dprintf( "%sServiceType = %s\n", Indent, ServiceTypeLabels[ Flow->ServiceType ] ); } else { dprintf( "%sServiceType = Unspecified\n", Indent ); } dprintf( "%sMaxSduSize = %u (%08X)\n", Indent, Flow->MaxSduSize, Flow->MaxSduSize ); dprintf( "%sMinimumPolicedSize = %u (%08X)\n", Indent, Flow->MinimumPolicedSize, Flow->MinimumPolicedSize ); } VOID DumpSpecific( ULONG Length, PCO_CALL_MANAGER_PARAMETERS TargetCMParams, PCHAR Indent ) { LONG ParamsLength; LPQOS_OBJECT_HDR lQoSObject = malloc(Length); CO_CALL_MANAGER_PARAMETERS CM; ULONG Address; if(!lQoSObject) return; Address = (ULONG)TargetCMParams + FIELD_OFFSET(CO_CALL_MANAGER_PARAMETERS, CallMgrSpecific) + FIELD_OFFSET(CO_SPECIFIC_PARAMETERS, Parameters); KD_READ_MEMORY(Address, lQoSObject, Length); ParamsLength = Length; while(ParamsLength > 0) { switch(lQoSObject->ObjectType) { case QOS_OBJECT_SHAPING_RATE: { LPQOS_SHAPING_RATE pShapingRate = (LPQOS_SHAPING_RATE)(lQoSObject); dprintf("%s QOS_OBJECT_SHAPING_RATE (Shaping Rate = %d (0x%x) \n", Indent, pShapingRate->ShapingRate, pShapingRate->ShapingRate); break; } case QOS_OBJECT_DS_CLASS: { LPQOS_DS_CLASS pDClass = (LPQOS_DS_CLASS)(lQoSObject); dprintf("%s QOS_OBJECT_DS_CLASS (DSCP = %d (0x%x) \n", Indent, pDClass->DSField, pDClass->DSField); break; } case QOS_OBJECT_TRAFFIC_CLASS: { LPQOS_TRAFFIC_CLASS pDClass = (LPQOS_TRAFFIC_CLASS)(lQoSObject); dprintf("%s QOS_OBJECT_TRAFFIC_CLASS (DSCP = %d (0x%x) \n", Indent, pDClass->TrafficClass, pDClass->TrafficClass); break; } case QOS_OBJECT_PRIORITY: { LPQOS_PRIORITY pPri = (LPQOS_PRIORITY)(lQoSObject); dprintf("%s QOS_OBJECT_PRIORITY \n", Indent); dprintf("%s%s SendPriority = %d \n", Indent, Indent, pPri->SendPriority); dprintf("%s%s RecvPriority = %d \n", Indent, Indent, pPri->ReceivePriority); dprintf("%s%s SendFlags = %d \n", Indent, Indent, pPri->SendFlags); break; } case QOS_OBJECT_SD_MODE: { LPQOS_SD_MODE pSDMode = (LPQOS_SD_MODE)(lQoSObject); dprintf("%s QOS_OBJECT_SD_MODE (SD mode = %s) \n", Indent, SDMode[pSDMode->ShapeDiscardMode]); break; } case QOS_OBJECT_DIFFSERV: { LPQOS_DIFFSERV qD = (LPQOS_DIFFSERV)(lQoSObject); ULONG DSFieldCount = qD->DSFieldCount; LPQOS_DIFFSERV_RULE pDiffServRule = (LPQOS_DIFFSERV_RULE) qD->DiffservRule; ULONG i; dprintf("%s QOS_OBJECT_DIFFSERV \n\n", Indent); for(i=0; iInboundDSField, pDiffServRule->InboundDSField); dprintf("%s%sConforming DS = %3d (0x%x) \n", Indent, Indent, pDiffServRule->ConformingOutboundDSField, pDiffServRule->ConformingOutboundDSField); dprintf("%s%sNon Conforming DS = %3d (0x%x) \n", Indent, Indent, pDiffServRule->NonConformingOutboundDSField, pDiffServRule->NonConformingOutboundDSField); dprintf("%s%sConforming 802.1p = %3d (0x%x) \n", Indent, Indent, pDiffServRule->ConformingUserPriority, pDiffServRule->ConformingUserPriority); dprintf("%s%sNon Conforming 802.1p = %3d (0x%x) \n", Indent, Indent, pDiffServRule->NonConformingUserPriority, pDiffServRule->NonConformingUserPriority); dprintf("\n"); } break; } } if( ((LONG)lQoSObject->ObjectLength <= 0) || ((LONG)lQoSObject->ObjectLength > ParamsLength) ){ return; } ParamsLength -= lQoSObject->ObjectLength; lQoSObject = (LPQOS_OBJECT_HDR)((UINT_PTR)lQoSObject + lQoSObject->ObjectLength); } if(lQoSObject) { free(lQoSObject); } } VOID DumpCallParameters( PGPC_CLIENT_VC Vc, PCHAR Indent ) { PCO_CALL_PARAMETERS tCp = Vc->CallParameters; CO_CALL_PARAMETERS lCp; LONG bytes = sizeof( CO_CALL_MANAGER_PARAMETERS ); LONG IndentLen; PCHAR NewIndent; IndentLen = strlen( Indent ); NewIndent = malloc( IndentLen + 8 ); if(!NewIndent) return; strcpy( NewIndent, Indent ); strcat( NewIndent, " " ); // // Read CallParameters out of memory // KD_READ_MEMORY(tCp, &lCp, sizeof(CO_CALL_PARAMETERS)); // // Dump it // dprintf("%sFlags 0x%x \n", Indent, lCp.Flags); dprintf("%sCallManager Parameters \n", Indent); { // // read CMParams struct out of target's memory // CO_CALL_MANAGER_PARAMETERS LocalCMParams; PCO_CALL_MANAGER_PARAMETERS TargetCMParams; TargetCMParams = lCp.CallMgrParameters; KD_READ_MEMORY((ULONG)TargetCMParams, &LocalCMParams,sizeof( CO_CALL_MANAGER_PARAMETERS)); dprintf( "%s Transmit\n", Indent ); DumpFlowSpec( &LocalCMParams.Transmit, NewIndent ); dprintf( "%s Receive\n", Indent ); DumpFlowSpec( &LocalCMParams.Receive, NewIndent ); dprintf( "%s Specific\n", Indent ); DumpSpecific( LocalCMParams.CallMgrSpecific.Length, TargetCMParams, NewIndent ); } dprintf("%sMediaParameters \n", Indent); { CO_MEDIA_PARAMETERS lM; PCO_MEDIA_PARAMETERS pM; pM = lCp.MediaParameters; KD_READ_MEMORY((ULONG)pM, &lM,sizeof(CO_MEDIA_PARAMETERS)); dprintf( "%s Flags %x \n", Indent, lM.Flags); dprintf( "%s ReceivePriority %x \n", Indent, lM.ReceivePriority ); dprintf( "%s ReceiveSizeHint %x \n", Indent, lM.ReceiveSizeHint ); dprintf( "%s Specific\n", Indent ); //DumpSpecific( &lM.MediaSpecific, NewIndent ); } free( NewIndent ); }