tdi code

本文介绍了一个使用 TDI (Transport Driver Interface) 的示例程序,展示了如何为 UDP 和 TCP 协议打开运输层接口,并获取地址信息。通过具体的 C 语言代码片段,解释了 TDI 的关键函数,如 TdiOpenTransport 和 TdiCall 的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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 );
}
select t.med_type 就医方式 , t.BKKP_SN 记账流水号, t.ipt_otp_no 住院门诊号, t.mdtrt_id 就诊号, t.setl_id 结算单号, t.MEDRCDNO 病历号, t.FIX_BLNG_ADMDVS 定点归属医保区划, t.POOLAREA_NO 统筹区编号, t.INSU_ADMDVS 参保所属医保区划, t.refd_setl_flag 退费标志, t.sp_psn_type_name 特殊人员类型名称, t.LIST_TYPE_name 目录类别名称, t.PAY_LOC_NAME 支付地点类别名称, t.adm_time 入院时间, t.dscg_time 出院时间, t.ipt_days 住院天数, t.fixmedins_code 医院编号, t.fixmedins_name 医院名称, t.psn_no 个人编码, t.psn_name 姓名, t.age 年龄, t.gend_name 性别, t.certno 身份证, t.brdy 出生日期, t.INSUTYPE_name 参保险种名称, t.main_diag_code 主诊断编码, t.main_diag_name 主诊断名称, t.second_diag_code 副诊断编码, t.second_diag_name 副诊断名称, t.DSCG_MAINDIAG_CODE 住院主诊断代码, t.DSCG_MAINDIAG_NAME 住院主诊断名称, t.MAIN_COND_DSCR 主要病情描述, t.DISE_NO 病种编码, t.DISE_NAME 病种名称, t.ADM_DEPT_NAME 入院科室, t.DSCG_DEPT_NAME 出院科室, t.BILG_DEPT_CODG 开单科室编码, t.BILG_DEPT_NAME 开单科室名称, t.ACORD_DEPT_CODG 受单科室编码, t.ACORD_DEPT_NAME 受单科室名称, t.CHFPDR_CODE 主诊医师代码, t.CHFPDR_name 主诊医师姓名, t.BILG_DR_CODE 开单医师代码, t.BILG_DR_NAME 开单医生姓名, t.ACORD_DR_CODE 受单医师代码, t.ACORD_DR_NAME 受单医师姓名, t.CHRGITM_LV_name 支付类别名称, t.MED_CHRGITM_name 医疗收费项目类别名称, t.SETL_TIME 结算时间, trunc(t.FEE_OCUR_TIME) 费用发生时间, t.hilist_code 医保项目编码, t.hilist_name 医保项目名称, t.medins_list_codg 医院项目编码, t.medins_list_name 医院项目名称, t.pric 单价, t.cnt 数量, t.det_item_fee_sumamt 金额, t.reimbursement_prop 报销比例, t.inscp_amt 符合医保范围金额 from mx_detail_gaoxin_2023_2024 t,( --002207000060000-220700006 室壁运动分析 --002207000040000-220700004 组织多普勒显象(TDI) select t.setl_id,trunc(t.fee_ocur_time)fee_ocur_time from mx_detail_gaoxin_2023_2024 t where t.hilist_code in ('002207000060000-220700006','002207000040000-220700004') and t.fixmedins_code in ('H44170200004') intersect --002206000040000-220600004 心脏彩色多普勒超声 select t.setl_id,trunc(t.fee_ocur_time)fee_ocur_time from mx_detail_gaoxin_2023_2024 t where t.hilist_code in ('002206000040000-220600004') and t.fixmedins_code in ('H44170200004') )b where t.setl_id = b.setl_id and trunc(t.fee_ocur_time) = b.fee_ocur_time and t.hilist_code in ('002207000060000-220700006','002207000040000-220700004','002206000040000-220600004') and t.fixmedins_code in ('H44170200004') 与select t.med_type 就医方式 , t.BKKP_SN 记账流水号, t.ipt_otp_no 住院门诊号, t.mdtrt_id 就诊号, t.setl_id 结算单号, t.MEDRCDNO 病历号, t.FIX_BLNG_ADMDVS 定点归属医保区划, t.POOLAREA_NO 统筹区编号, t.INSU_ADMDVS 参保所属医保区划, t.refd_setl_flag 退费标志, t.sp_psn_type_name 特殊人员类型名称, t.LIST_TYPE_name 目录类别名称, t.PAY_LOC_NAME 支付地点类别名称, t.adm_time 入院时间, t.dscg_time 出院时间, t.ipt_days 住院天数, t.fixmedins_code 医院编号, t.fixmedins_name 医院名称, t.psn_no 个人编码, t.psn_name 姓名, t.age 年龄, t.gend_name 性别, t.certno 身份证, t.brdy 出生日期, t.INSUTYPE_name 参保险种名称, t.main_diag_code 主诊断编码, t.main_diag_name 主诊断名称, t.second_diag_code 副诊断编码, t.second_diag_name 副诊断名称, t.DSCG_MAINDIAG_CODE 住院主诊断代码, t.DSCG_MAINDIAG_NAME 住院主诊断名称, t.MAIN_COND_DSCR 主要病情描述, t.DISE_NO 病种编码, t.DISE_NAME 病种名称, t.ADM_DEPT_NAME 入院科室, t.DSCG_DEPT_NAME 出院科室, t.BILG_DEPT_CODG 开单科室编码, t.BILG_DEPT_NAME 开单科室名称, t.ACORD_DEPT_CODG 受单科室编码, t.ACORD_DEPT_NAME 受单科室名称, t.CHFPDR_CODE 主诊医师代码, t.CHFPDR_name 主诊医师姓名, t.BILG_DR_CODE 开单医师代码, t.BILG_DR_NAME 开单医生姓名, t.ACORD_DR_CODE 受单医师代码, t.ACORD_DR_NAME 受单医师姓名, t.CHRGITM_LV_name 支付类别名称, t.MED_CHRGITM_name 医疗收费项目类别名称, t.SETL_TIME 结算时间, trunc(t.FEE_OCUR_TIME) 费用发生时间, t.hilist_code 医保项目编码, t.hilist_name 医保项目名称, t.medins_list_codg 医院项目编码, t.medins_list_name 医院项目名称, t.pric 单价, t.cnt 数量, t.det_item_fee_sumamt 金额, t.reimbursement_prop 报销比例, t.inscp_amt 符合医保范围金额 from mx_detail_gaoxin_2023_2024 t,( --002207000060000-220700006 室壁运动分析 --002207000040000-220700004 组织多普勒显象(TDI) select t.setl_id,trunc(t.fee_ocur_time)fee_ocur_time from mx_detail_gaoxin_2023_2024 t where t.hilist_code in ('002207000060000-220700006','002207000040000-220700004') and t.fixmedins_code in ('H44170200004') intersect --002206000040000-220600004 心脏彩色多普勒超声 select t.setl_id,trunc(t.fee_ocur_time)fee_ocur_time from mx_detail_gaoxin_2023_2024 t where t.hilist_code in ('002206000040000-220600004') and t.fixmedins_code in ('H44170200004') )b where t.setl_id = b.setl_id and t.fee_ocur_time = b.fee_ocur_time and t.hilist_code in ('002207000060000-220700006','002207000040000-220700004','002206000040000-220600004') and t.fixmedins_code in ('H44170200004')出来的结果为什么不一样
最新发布
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值