tdi code

JTAG调试完全指南:TAP状态机、SWD与MCU实战 在嵌入式开发中,串口打印和LED翻转往往难以定位随机死机、寄存器异常等深层问题。JTAG作为IEEE 1149.1标准定义的边界扫描与调试接口,通过TAP状态机、指令寄存器与数据寄存器,实现了对MCU内部状态的实时访问与控制。其核心价值在于不修改业务代码即可暂停CPU、读写寄存器、设置硬件断点,为裸机与RTOS开发提供了高可信度的调试手段。在应用层面,JTAG不仅用于程序烧录与断点调试,还支持低功耗模式唤醒、多芯片菊花链连接、PCB边界扫描等场景。SWD作为其衍生协议,以更少引脚完成多数调试任务,在Cort 阅读详情
#define MY_PORT   7609

   HANDLE hTdiTransport = NULL;                    // handle to tdi transport
   PFILE_OBJECT pTdiTransportObject = NULL;        // pointer to tdi transport object

   dStatus = TdiOpenTransport (                                      // open transport
                     L"//Device//Udp",                               // device name
                     MY_PORT,                                        // port number
                     &hTdiTransport,                                 // return transport handle
                     &pTdiTransportObject );                         // return transport object

   dStatus = TdiOpenTransport (                                      // open transport
                     L"//Device//Tcp",                               // device name
                     MY_PORT,                                        // port number
                     &hTdiTransport,                                 // return transport handle
                     &pTdiTransportObject );                         // return transport object

   if ( NT_SUCCESS ( dStatus ) )
   {
         QueryAddressInfo( pTdiTransportObject, pAddress, dwSizeAddress );
   }


// **************************************************************************

int QueryAddressInfo( PFILE_OBJECT pFileObject, PVOID pAddress, ULONG dwSizeAddress )
{

  PDEVICE_OBJECT pDeviceObject;
  PTDI_ADDRESS_INFO pAddrInfo;
  NTSTATUS         NtStatus;
  IO_STATUS_BLOCK  IoStatusBlock;

  int              bRes;
  ULONG            dwSize;

  if (KeGetCurrentIrql() != PASSIVE_LEVEL) //> DISPATCH_LEVEL)
    return FALSE;
  if ( pFileObject == NULL || pAddress == NULL)
    return FALSE;

  bRes = FALSE;
  dwSize = sizeof(TDI_ADDRESS_INFO) + sizeof(TDI_ADDRESS_IP);

  pDeviceObject = IoGetRelatedDeviceObject( pFileObject );
  pAddrInfo = (PTDI_ADDRESS_INFO) ExAllocatePool( PagedPool, dwSize );
  if (pAddrInfo != NULL)
  {
    PIRP pIrp = TdiBuildInternalDeviceControlIrp(TDI_QUERY_INFORMATION, pDeviceObject, pFileObject, NULL, NULL);    
    if (pIrp != NULL)
    {
      PMDL pMdl = IoAllocateMdl(pAddrInfo, dwSize, FALSE, FALSE, NULL);
      if (pMdl != NULL)
      {
        __try
        {
          MmProbeAndLockPages(pMdl, KernelMode, IoModifyAccess);    // probe & lock
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
          IoFreeMdl(pMdl);
          pMdl = NULL;
        }
  
        if (pMdl != NULL)
        {
          TdiBuildQueryInformation(pIrp, pDeviceObject, pFileObject, NULL, NULL, TDI_QUERY_ADDRESS_INFO, pMdl);
          
          NtStatus = TdiCall(pIrp, pDeviceObject, &IoStatusBlock);
          if (NT_SUCCESS(NtStatus))
          {
            memcpy(pAddress, &(pAddrInfo->Address), dwSizeAddress);            
          }
        }
      }
    }

    ExFreePool( pAddrInfo );
  }

  return bRes;
}

// **************************************************************************

NTSTATUS TdiOpenTransport (
                  IN PWSTR pProtocol,
                  IN USHORT wPort,
                  OUT PHANDLE phTransport,
                  OUT PFILE_OBJECT *ppTransportObject )
{
   PTA_IP_ADDRESS pAddress;                                          // transport address
   ULONG dEaLength;                                                  // buffer size
   PFILE_FULL_EA_INFORMATION pEaInfo;                                // pointer to ea
   NTSTATUS dStatus;                                                 // current status

   dEaLength = sizeof ( FILE_FULL_EA_INFORMATION ) +                 // account for ea
   sizeof ( TdiTransportAddress ) +                                  // account for transport
   sizeof ( TA_IP_ADDRESS ) + 1;                                     // account for ip address
   pEaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool (
                           NonPagedPool, dEaLength );
   if ( pEaInfo )                                                    // validate pointer
   {
      RtlZeroMemory ( pEaInfo, dEaLength );                          // clear eabuffer
      pEaInfo->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH;          // size
      RtlCopyMemory ( pEaInfo->EaName,                               // copy transport name
                           TdiTransportAddress,
                           sizeof ( TdiTransportAddress ) );
      pEaInfo->EaValueLength = sizeof ( TA_IP_ADDRESS );             // size of data
      pAddress = (PTA_IP_ADDRESS)(pEaInfo->EaName +
                           sizeof ( TdiTransportAddress ));
      pAddress->TAAddressCount = 1;                                  // number of addresses
      pAddress->Address[0].AddressLength = sizeof ( TDI_ADDRESS_IP );
      pAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
      pAddress->Address[0].Address[0].sin_port =                     // local port
            W_LITTLE_TO_BIG_ENDIAN(wPort);
      pAddress->Address[0].Address[0].in_addr = 0L;                  // local address
      dStatus = TdiOpen (                                            // open tdi device
                           pProtocol,                                // tdi device name
                           dEaLength,                                // length of ea info
                           pEaInfo,                                  // pointer to ea info
                           phTransport,                              // return transport handle
                           ppTransportObject );                      // return transport object
      ExFreePool ( pEaInfo );                                        // free buffer
   }
   return ( dStatus );
}




NTSTATUS TdiOpen (
                  IN PWSTR pProtocol,
                  IN ULONG dEaLength,
                  IN PFILE_FULL_EA_INFORMATION pEaInfo,
                  OUT PHANDLE phHandle,
                  OUT PFILE_OBJECT *ppObject )
{
   UNICODE_STRING uName;                                             // local name
   OBJECT_ATTRIBUTES ObjectAttrib;                                   // local object attribute
   IO_STATUS_BLOCK IoStatusBlock;                                    // local io status return
   NTSTATUS dStatus;                                                 // current status

   RtlInitUnicodeString ( &uName, pProtocol );                       // get device name
   InitializeObjectAttributes( &ObjectAttrib,                        // return object attribute
                           &uName,                                   // resource name
                           OBJ_CASE_INSENSITIVE,                     // attributes
                           NULL,                                     // root directory
                           NULL );                                   // security descriptor
   dStatus = ZwCreateFile (
                           phHandle,                                 // return file handle
                           GENERIC_READ | GENERIC_WRITE,             // desired access
                           &ObjectAttrib,                            // local object attribute
                           &IoStatusBlock,                           // local io status
                           0L,                                       // initial allocation size
                           FILE_ATTRIBUTE_NORMAL,                    // file attributes
                           FILE_SHARE_READ | FILE_SHARE_WRITE,       // share access
                           FILE_OPEN_IF,                             // create disposition
                           0L,                                       // create options
                           pEaInfo,                                  // eabuffer
                           dEaLength );                              // ealength
   if ( NT_SUCCESS ( dStatus ) )                                     // check for valid return
   {
      dStatus  = ObReferenceObjectByHandle (                         // reference file object
                              *phHandle,                             // handle to open file
                              GENERIC_READ | GENERIC_WRITE,          // access mode
                              NULL,                                  // object type
                              KernelMode,                            // access mode
                              (PVOID)ppObject,                       // pointer to object
                              NULL );                                // handle information
      if ( !NT_SUCCESS ( dStatus ) )
         ZwClose ( *phHandle );                                      // close handle
   }
   return ( dStatus );
}


// **************************************************************************


NTSTATUS TdiCall (
                  IN PIRP pIrp,
                  IN PDEVICE_OBJECT pDeviceObject,
                  IN OUT PIO_STATUS_BLOCK pIoStatusBlock )
{
   KEVENT kEvent;                                                    // signaling event
   NTSTATUS dStatus = STATUS_INSUFFICIENT_RESOURCES;                 // local status

   KeInitializeEvent ( &kEvent, NotificationEvent, FALSE );          // reset notification event
   pIrp->UserEvent = &kEvent;                                        // pointer to event
   pIrp->UserIosb = pIoStatusBlock;                               // pointer to status block
   dStatus = IoCallDriver ( pDeviceObject, pIrp );                   // call next driver
   if ( dStatus == STATUS_PENDING )                                  // make all request synchronous
   {
      (void)KeWaitForSingleObject (
                     (PVOID)&kEvent,                                 // signaling object
                     Executive,                                      // wait reason
                     KernelMode,                                     // wait mode
                     TRUE,                                           // alertable
                     NULL );                                         // timeout
   }
   dStatus = pIoStatusBlock->Status;                          
   return ( dStatus );                                               // return with status
}

// **************************************************************************

NTSTATUS TdiClose (
                  IN HANDLE hHandle,
                  IN PFILE_OBJECT pObject )
{
   if ( pObject )                                                    // validate pointers
      ObDereferenceObject( pObject );                                // release the object
   if ( hHandle )
      ZwClose ( hHandle );                                           // close handle
   return ( STATUS_SUCCESS );
}
手把手教你用DAPLink给树莓派Pico烧录程序(附VS Code调试配置) 本文详细介绍了如何使用DAPLink调试器为树莓派Pico烧录程序,并配置VS Code进行高效调试。从硬件连接到软件环境搭建,再到实战演练和常见问题解决,提供了一套完整的开发流程指南,帮助开发者快速掌握树莓派Pico的调试技巧。 阅读详情

相关推荐

CH347实战指南:在VS Code中集成openocd与ARM-GCC打造高效ARM开发环境

本文详细介绍了如何在VS Code中集成openocd与ARM-GCC,打造高效的ARM开发环境。通过使用CH347调试器,开发者可以享受开源工具链带来的零成本、跨平台和高定制化优势,显著提升开发效率。文章提供了从硬件准备到软件配置的全流程指南,并包含常见问题解决方案和进阶技巧。

weixin_27743991的博客 281

应用层和驱动层的同步与异步的处理逻辑及底层实现

应用层的实现: 1ReadFile、WriteFile、DeviceIoControl等,这些都有两种操作方式,一种是同步,一种是异步。 操作设备的Win32API主要是这3个函数ReadFile、WriteFile、DeviceIoControl 以DeviceIOControl为例,它的同步&异步操作如下: 同步操作时,它的内部会创建一个IRP_MJ_DEV

程序员人生 3024

共封装光学(CPO):下一代互联革命

Nvidia:产品:Quantum-X Q3450(115.2T,144×800G,2025H2上市)、Spectrum 6800(409.6T,512×800G,2026H2上市);技术路线:TSMC COUPE封装、MRM调制器、光栅耦合、外部激光源(Lumentum/Ayar Labs供应);战略定位:以横向扩展CPO验证供应链,最终聚焦纵向扩展场景(Feynman架构)。

存储随笔 4975

TDIfw在windows 10 1903的测试

最近看了一下TDI的网络过滤驱动,在Vista之后就不支持了,但是据说windows7还是能用,于是想试试在win10上还能不能玩。需要注意的是在win10上的TCP和UDP设备对象的驱动对象变成了tdx,于是有了下面的代码。 #include <Ntifs.h> #include <ntimage.h> #include <ntstrsafe.h> #include <Tdikrnl.h> #define MEM_TAG 'YCAI' #define

被遗弃的庸才博客 805

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 223

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规审计的考试指南,包含选择题、判断题、简答题和案例分析题。选择题考察《个人信息保护法》的关键条款,如敏感信息处理、跨境传输、委托处理等合规要求。判断题测试对个人信息处理规则的理解,如撤回同意、公开信息处理等。简答题要求阐述审计流程、个人权利、委托处理义务等内容。案例分析题以互联网企业为例,分析违规行为并提出整改建议,涉及数据收集、第三方共享、自动化决策等问题。全文旨在帮助中级审计人员掌握个人信息保护的法律规定和审计实务,提升合规审计能力。

qq_41525079的博客 549

TDI [Zz]

#define MY_PORT   7609   HANDLE hTdiTransport = NULL;                    // handle to tdi transport   PFILE_OBJECT pTdiTransportObject = NULL;        // pointer to tdi transport object   dStatus = Tdi

LionD8' Blog 个人作品 www.360kdj.com 360KDJ股票实验室 5872

Mac开发环境一键配置指南|从零到生产力

类别工具包管理Homebrew终端版本管理容器编辑器效率用一键脚本的话,2小时内可以搞定全部环境。有问题评论区交流~

在代码的世界里,每天进步1% 625

驱动开发:内核封装TDI网络通信接口

已经带大家看过了如何通过WSK接口实现套接字通信,但WSK实现的通信是内核与内核模块之间的,而如果需要内核与应用层之间通信则使用TDK会更好一些因为它更接近应用层,本章将使用TDK实现,TDI全称传输驱动接口,其主要负责连接。更接近于应用层,在早期Win系统中常用于实现过滤防火墙,同样经过封装后也可实现通信功能,本章将运用TDI接口实现驱动与应用层之间传输字符串,结构体,多线程收发等技术。运行应用层服务端,并运行驱动程序,则会验证该驱动是否合法,如果合法则加载不合法则拒绝;再来是驱动层代码,如下所示;

微软技术分享 2万+

Halcon Socket TCP通讯:从算子调用到工业视觉系统集成

本文详细介绍了Halcon Socket TCP通讯在工业视觉系统中的应用与优化技巧。从基础算子调用到高并发处理,再到与PLC、机器人及MES系统的集成实战,提供了全面的解决方案和性能优化建议,帮助开发者高效实现工业视觉系统的通讯需求。

weixin_33502772的博客 248

华为OD机试真题 新系统2026-04-01 C语言 实现【计算数列位置N的值】

1、输入M、N两个数,则按照以下规则形成一个数列; 2、数列的前M个元素的值为1到M; 3、从M+1个元素开始,计算的逻辑为: 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;

MISAYAONE的博客 591

TDI Code 3

 IntroductionWelcome to the fifth installment of the driver development series. The title of this article is a little bit misleading. Yes, we will be writing a TDI Client for demonstration purpose

清风专栏 3085

【深度学习驱动流体力学】OpenFOAM目录流体力学求解器汇总介绍

下面这些目录结构和其中的求解器和工具展示了OpenFOAM作为一个功能强大且广泛应用的开源CFD软件框架的多样性和灵活性。每个求解器都专门用于解决不同类型的流体动力学问题,从基础的流动模拟到复杂的多相流动和燃烧模拟等各种应用场景。

源代码杀手的博客 1186

TDI code 2

www.pudn.com > 在内核中建立sokcet.zip > TDI.C   // //////////////////////////////////////////////////////////////////////////    // Module:        TDI.C    // Description:   This module contains all the T

清风专栏 1626

36、R语言中的回归模型与机器学习算法

本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能

yhn456789的博客 122

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TDI code 1

2009-01-13 15:36////// NewbieCoder[0GiNr]//// 15:36 2009-1-13//// http://0ginr.com////#include #include #define XHR_IS_BIG_COW_TAG XHR_#define TCP_DEVICE_NAME_W L"//Device//TCP"NTS

清风专栏 1071

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2026年7月15日技术关注:ChatGPT搜索、Windows更新与GitHub开发工具

🔥个人主页:❄️个人专栏:🌟让复杂的事情更简单,让重复的工作自动化。

分享 Windows 系统部署、镜像封装、终端管理、故障排查与运维自动化实践,涵盖 Sysinternals、PowerShell 和 AI 工具应用。记录真实问题、探索过程与解决方法,也分享 AI 时代的学习心得和实践经验,让技术更易理解 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于TDI驱动的个人防火墙程序设计与实现

基于TDI(Transport Driver Interface)驱动的个人防火墙系统,能够在Windows内核层拦截网络数据包,实现访问控制、流量监控和安全防护功能。系统包含内核驱动程序和用户态控制程序两部分。

ghie9090的博客 411

TDI网络过滤驱动之tdifw实现原理分析

网络数据包的过滤(包括connect,sendto,recvfrom等)。防火墙规则策略的管理。本地网络连接状态的查询。其中防火墙规则策略的管理应用以及网络状态信息的查询实现的比较简单,主要是响应用户层的各种//防火墙规则策略CTL_CODE。

xsinlink的博客 857

大模型“安全对齐”不是算法问题,而是工程负债——用DevSecLLMOps方法论清零3类技术债

破解大模型“安全对齐”困局,需系统性治理工程负债。本文提出DevSecLLMOps方法论,面向生产环境落地大模型工程化安全与对齐策略,清零数据、评估、部署三类技术债,提升鲁棒性与合规性。值得收藏。

PoliSeed的博客 188

AI生成代码正在悄悄毁掉你的系统稳定性:3个被90%团队忽略的可维护性断层及修复清单

快速识别并修复AI生成代码的隐性可维护性风险。基于AI代码可维护性分析,揭示命名混乱、逻辑耦合、文档缺失3大断层,提供自动化检测+重构模板+团队规范三步修复法,适用于中大型敏捷团队。提升长期系统稳定性,值得收藏。

InstrIsle的博客 65

JTAG基础知识

前言 本知识翻译收集来自http://www.fpga4fun.com,版权归原网站所有。 1.什么是JTAG:Joint Test Action Group;联合测试工作组 JTAG是一种IEEE标准用来解决板级问题,开发于上个世纪80年代。今天JTAG被用来烧录、debug、探查端口。当然,最原始的使用是边界测试。 边界测试: 举个栗子你有两个芯片,这两个芯片之间连接了很多很多的线,怎么确...

HBX_1024的博客 2690

jtag访问arm内核寄存器

jtag的原理图 jtag接口访问arm Device ID code register的步骤 jtag接口访问arm Device ID code register的功能验证的testbench jtag接口访问arm Device ID code register的功能验证的波形图 jtag相关注意细节 jtag访问arm内核寄存器的步骤 与DTR相关的协处理器指令介绍 最后通过封装成veril

学而不思则罔,思而不学则殆 9961

Introduction to the Transport Device Interface

IntroductionWelcome to the fifth installment of the driver development series. The title of this article is a little bit misleading. Yes, we will be writing a TDI Client for demonstration purposes h

Augusdi的专栏 2662

用AI做技术债务量化:代码复杂度与变更风险的自动评估体系

技术债务(Technical Debt)是软件工程中一个被广泛讨论但难以量化的概念。大多数团队对技术债务的评估停留在主观判断层面:资深工程师在Code Review时凭经验指出"这块代码需要重构",架构师在技术评审会议上口头列举"XX模块设计不合理"。这种主观评估有两个致命缺陷:一是不可重复——不同评估者对同一代码的判断差异可能高达50%;二是不可追踪——团队无法量化地证明"债务是否在减少"。技术债务量化的核心挑战在于将"代码质量"这个模糊概念分解为可测量、可对比、可追踪的指标。

jiang_style的博客 4700
上一篇: NDIS and TDI Hooking, Part II
下一篇: Introduction to the Transport Device Interface
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值