NDIS小端口驱动(五)

news2024/12/22 9:11:40

在需要的时候,我们也许需要NDIS微型端口程序信息,下面会从多个方面来讨论如何查询NDIS微型端口驱动。

查询无连接微型端口驱动程序

若要查询无连接微型端口驱动程序维护的 OID,绑定协议调用 NdisOidRequest 并传递 一个NDIS_OID_REQUEST 结构,该结构指定对象 (OID) 正在查询,该对象指向 NDIS 最终写入所请求信息的缓冲区。

如果 NDIS 不响应微型端口驱动程序,则对 NdisOidRequest 的 调用会导致 NDIS 调用微型端口驱动程序的 MiniportOidRequest 函数,该函数将请求的信息返回到 NDIS。 MiniportOidRequest 可以通过调用 NdisMOidRequestComplete 以同步或异步方式完成。

NDIS 还可以自行调用微型端口驱动程序的 MiniportOidRequest 函数(例如,在微型端口驱动程序的 MiniportInitializeEx 函数返回NDIS_STATUS_SUCCESS)以查询微型端口驱动程序的功能、状态或统计信息之后。 下图演示了查询无连接微型端口驱动程序。

NDIS 代表微型端口驱动程序响应许多 OID 请求。 微型端口驱动程序在初始化期间和状态指示中报告其许多 OID 值。 

使用 OID_GEN_MAC_OPTIONS 调用 MiniportOidRequest 时,它必须返回一个位掩码,该位掩码指定微型端口驱动程序执行的可选操作。 标志集包括:

  • NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA。 此标志向协议驱动程序指示它可以通过任何方式访问指示的数据。 如果微型端口驱动程序指示数据来自板载共享内存,则它不得设置此标志;
  • NDIS_MAC_OPTION_NO_LOOPBACK。 如果设置了此标志,微型端口驱动程序不会环回传递给 MiniportSendNetBufferLists 的数据包 (数据包) 定向到同一计算机上的接收器,并且微型端口驱动程序预期 NDIS 执行环回。 如果 NDIS 执行数据包的环回,则数据包不会向下传递到微型端口驱动程序。 微型端口驱动程序始终设置此标志,除非 NIC 执行硬件环回;
  • NDIS_MAC_OPTION_RECEIVE_SERIALIZED。 如果设置了此标志,微型端口驱动程序不会指示任何新接收的数据包,直到之前收到的数据包已完全处理,包括传输数据。 大多数微型端口驱动程序(通过调用 NdisMIndicateReceiveNetBufferLists 指示数据包的驱动程序除外)都设置此标志;

微型端口驱动程序不得使用标志NDIS_MAC_OPTION_RESERVED,该标志保留供 NDIS 内部使用。

MiniportOidRequest 还会使用特定于媒体的 OID 进行查询,以确定 NIC 的当前地址。 例如,将使用 OID_802_3_CURRENT_ADDRESS 查询类型为 802.3 的 NIC 的微型端口驱动程序。

某些媒体类型的微型端口驱动程序将收到特定于媒体的其他 OID。 例如,使用 OID_802.3_MAXIMUM_LIST_SIZE 查询 NIC 类型为 802.3 的微型端口驱动程序。

查询面向连接的微型端口驱动程序

若要查询面向连接的微型端口驱动程序维护的信息对象,绑定协议调用 NdisCoOidRequest 并传递 NDIS_OID_REQUEST 结构,该结构指定正在查询的 OID对象,并提供 NDIS 最终将请求的信息写入其中的缓冲区。 调用 NdisCoOidRequest 会导致 NDIS 调用微型端口驱动程序的 MiniportCoOidRequest 函数,该函数将请求的信息返回给 NDIS。 MiniportCoOidRequest 可以通过调用 NdisCoOidRequestComplete 以同步或异步方式完成。

NDIS 还可以自行调用微型端口驱动程序的 MiniportCoOidRequest 函数(例如,在微型端口驱动程序的 MiniportInitializeEx 函数返回NDIS_STATUS_SUCCESS之后)来查询微型端口驱动程序的功能、状态或统计信息。 下图说明了如何查询面向连接的微型端口驱动程序。

 

面向连接的微型端口驱动程序必须能够提供有关特定 NIC 的所有虚拟连接( (VC) )以及每个 VC 的全局基础信息。 例如,如果将非 NULLNdisVcHandle 提供给 MiniportCoOidRequest 进行 OID_GEN_CO_RCV_CRC_ERROR查询,则微型端口驱动程序将返回指定 VC 上所有接收中遇到的 CRC 错误数。 对于具有 NULLNdisVcHandle 的同一请求,微型端口驱动程序返回通过 NIC 接收的所有传入接收时遇到的 CRC 错误总数。

以下列表包含面向连接的微型端口驱动程序的一组必需的常规操作 OID:

  • OID_GEN_CO_SUPPORTED_LIST
  • OID_GEN_CO_HARDWARE_STATUS
  • OID_GEN_CO_MEDIA_SUPPORTED
  • OID_GEN_CO_MEDIA_IN_USE
  • OID_GEN_CO_LINK_SPEED
  • OID_GEN_CO_VENDOR_ID
  • OID_GEN_CO_VENDOR_DESCRIPTION
  • OID_GEN_CO_VENDOR_DRIVER_VERSION
  • OID_GEN_CO_DRIVER_VERSION
  • OID_GEN_CO_MAC_OPTIONS
  • OID_GEN_CO_MEDIA_CONNECT_STATUS
  • OID_GEN_CO_MINIMUM_LINK_SPEED

微型端口驱动程序的 MiniportCoOidRequest 函数必须准备好对查询或设置做出相应的响应,以响应上述任何 OID。

使用 OID_GEN_CO_MAC_OPTIONS 调用 MiniportCoOidRequest 时,它必须返回指定微型端口驱动程序执行的可选操作的位掩码。 标志集包括:

  • NDIS_MAC_OPTION_NO_LOOPBACK。 如果设置了此标志,微型端口驱动程序不会环回传递给 MiniportCoSendNetBufferLists 的 数据包,该数据包定向到同一计算机上的接收器,并且微型端口驱动程序希望 NDIS 执行环回。 如果 NDIS 执行数据包的环回,则数据包不会向下传递到微型端口驱动程序。 微型端口驱动程序始终设置此标志,除非 NIC 执行硬件环回;
  • NDIS_MAC_ETOX_INDICATION。 如果设置了此标志,微型端口驱动程序会指示仅在 NIC 传输数据包后完成发送;

微型端口驱动程序不得使用保留供 NDIS 内部使用的 NDIS_MAC_OPTION_RESERVED 标志。

MiniportCoOidRequest 还将使用特定于媒体的 OID 进行查询,以确定 NIC 的当前地址。

直接从用户模式查询微型端口驱动程序

应用程序可以使用 IOCTL_NDIS_QUERY_GLOBAL_STATS 直接从微型端口驱动程序的 NIC 查询信息。 在此操作中,应用程序可以使用微型端口驱动程序支持的任何查询 OID。

查询 64 位统计信息 OID


对于某些统计信息 OID,每秒 1 GB (Gbps) 且速度较快的所有微型端口驱动程序都必须支持 64 位计数器。 所有每秒 100 兆字节 (Mbps) 和更快的微型端口驱动程序应支持此类 OID 的 64 位计数器。 

查询统计信息 OID 的请求者NDIS_OID_REQUEST InformationBufferLength 设置为 4 字节,)表示 32 位统计信息请求,或设置为 8 字节以指示 64 位统计信息请求。 在其响应中,微型端口驱动程序将 NDIS_OID_REQUEST BytesNeeded 设置为微型端口驱动程序支持的统计信息值的大小, 4对于 32 位或 8对于 64 位。 微型端口驱动程序将 NDIS_OID_REQUEST BytesWritten 设置为 InformationBufferLength 值的较小值和微型端口驱动程序支持的统计信息大小。

以下部分介绍了支持 64 位统计信息 OID 的微型端口驱动程序如何响应此类 OID 查询。

1. 64 位值的 64 位查询: NDIS_OID_REQUEST InformationBufferLength 大于或等于 8。

微型端口驱动程序:

  • 返回信息缓冲区中的 64 位值;
  • 将 NDIS_OID_REQUEST BytesWritten 设置为 8;
  • 从其 MiniportOidRequest 或 MiniportCoOidRequest 函数返回NDIS_STATUS_SUCCESS;

2. 64 位值的 32 位查询: NDIS_OID_REQUEST InformationBufferLength 大于或等于 4 且小于 8。

微型端口驱动程序:

  • 在信息缓冲区中,返回 64 位值的较低 32 位;
  • 将 NDIS_OID_REQUEST BytesWritten 设置为 4;
  • 将 NDIS_OID_REQUEST BytesNeeded 设置为 8;
  • 从其 MiniportOidRequest 或 MiniportCoOidRequest 函数返回NDIS_STATUS_SUCCESS;

3. 64 位值的长度无效查询: NDIS_OID_REQUEST InformationBufferLength 小于 4。

微型端口驱动程序:

  • 不返回信息缓冲区中的任何值;
  • 将 NDIS_OID_REQUEST BytesWritten 设置为 0;
  • 将 NDIS_OID_REQUEST BytesNeeded 设置为 8;
  • 从其 MiniportOidRequest 或 MiniportCoOidRequest 函数返回NDIS_STATUS_INVALID_LENGTH;
设置无连接微型端口驱动程序的信息

若要设置无连接微型端口驱动程序维护的 OID,绑定协议调用 NdisOidRequest 并传递一个 NDIS_OID_REQUEST 结构,该结构指定正在查询 的 OID ,该对象指向包含应设置对象的值的缓冲区。 调用 NdisOidRequest 会导致 NDIS 调用微型端口驱动程序的 MiniportOidRequest 函数,该函数使用提供的值设置对象。

对 MiniportOidRequest 的 调用可以同步或异步完成。 若要异步完成调用,微型端口驱动程序调用 NdisMOidRequestComplete。 下图演示了无连接微型端口驱动程序 (每个绑定) 的设置信息。

设置面向连接的微型端口驱动程序的信息

若要设置面向连接的微型端口驱动程序维护的 OID,绑定协议调用 NdisCoOidRequest 并传递一个 NDIS_OID_REQUEST 结构,该结构指定正在查询的 OID) (对象,该对象指向包含应设置对象的值的缓冲区。 调用 NdisCoOidRequest 会导致 NDIS 调用微型端口驱动程序的 MiniportCoOidRequest 函数,该函数使用提供的值设置 对象。

对 NdisCoOidRequest 的 调用可以同步或异步完成。 若要异步完成调用,微型端口驱动程序调用 NdisCoOidRequestComplete。 下图演示了面向连接的微型端口驱动程序中的设置信息。

设置微型端口驱动程序信息的场合

在初始化期间,将调用无连接微型端口驱动程序中的 MiniportOidRequest 函数和面向连接的微型端口驱动程序中的 MiniportCoOidRequest 函数。 还可以以下情况下调用函数:

  • 在硬件重置期间;
  • 如果协议调用 NdisCloseAdapterEx;

在硬件重置操作期间调用 MiniportOidRequest 或 MiniportCoOidRequest。 在这种情况下,将调用 MiniportOidRequest 或 MiniportCoOidRequest ,以将微型端口驱动程序重置为其地址的初始状态。

当微型端口驱动程序的 NIC 被协议的 NdisCloseAdapterEx 调用关闭时,NDIS 调用 MiniportOidRequest 或 MiniportCoOidRequest。 将请求此类微型端口驱动程序更新其寻址信息。

报告硬件状态

无连接微型端口驱动程序通过调用 NdisMIndicateStatusEx 指示硬件状态到上层的更改。 面向连接的微型端口驱动程序通过调用 NdisMCoIndicateStatusEx 来指示更改。

NdisM (Co) IndicateStatusEx 采用常规状态代码和缓冲区,其中包含媒体特定信息,进一步定义状态更改原因。 NDIS 将此状态更改报告给绑定协议驱动程序。 NDIS 不会解释或以其他方式截获状态代码。

微型端口驱动程序可以发出一个或多个此类调用。 但是,与早期版本的 NDIS 不同,微型端口驱动程序并不指示它已完成发送状态。 协议驱动程序或配置管理器可以记录状态或根据需要采取纠正措施。

NdisMCoIndicateStatusEx 采用任何有效的 NDIS_STATUS_Xxx 值。

微型端口驱动程序负责指示对协议或更高级别驱动程序有意义的状态代码。 协议驱动程序会忽略其不感兴趣或在其操作上下文中没有意义的任何状态值。

微型端口驱动程序不能在其 MiniportInitializeEx、 MiniportInterrupt、 MiniportHaltEx 或 MiniportShutdownEx 函数的上下文中指示状态。

上层驱动程序或 NDIS 还可以询问微型端口驱动程序的硬件状态。 当无 连接微型端口驱动程序的 MiniportOidRequest 函数或面向连接的微型端口驱动程序的 MiniportCoOidRequest 函数收到OID_GEN_HARDWARE_STATUS时,它将使用 NDIS_HARDWARE_STATUS 中定义的任何适用状态值进行响应。 这些状态值包括:

  • NdisHardwareStatusReady
  • NdisHardwareStatusInitializing
  • NdisHardwareStatusReset
  • NdisHardwareStatusClosing
  • NdisHardwareStatusNotReady

可以查询微型端口驱动程序,以便 NDIS 可以在 NDIS 驱动程序层之间同步操作,例如,通过确定 NIC 是否已准备好接受数据包。

指示连接状态

微型端口驱动程序调用 NdisMIndicateStatusEx 或 NdisMCoIndicateStatusEx 以指示媒体连接状态的更改。 微型端口驱动程序将以下状态指示之一传递给 NdisM (Co) IndicateStatus:

  • NDIS_STATUS_MEDIA_CONNECT:指示媒体连接状态从“已断开连接”更改为“已连接”。 当断开连接的适配器建立网络连接时,将发生媒体连接状态更改。 例如,适配器在无线适配器) (范围内或用户连接网络电缆时连接;
  • NDIS_STATUS_MEDIA_DISCONNECT:指示媒体连接状态从“已连接”更改为“已断开连接”。 当连接的适配器失去网络连接时,将发生媒体断开连接状态更改。 例如,适配器因无线适配器) (范围或用户拔下网线而失去连接;

除非另行指定,否则微型端口驱动程序应在检测到状态更改后两秒内指示媒体连接状态更改。

微型端口驱动程序可以在执行某些操作时检查媒体连接状态, 查看以下列表。 如果操作完成后的状态与操作开始前的状态相同,微型端口驱动程序不必报告操作期间可能发生的任何状态更改。

以下列表介绍了指示微型端口驱动程序的媒体连接状态更改的其他要求:

重 置: NDIS 调用 MiniportResetEx 来重置微型端口驱动程序。 微型端口驱动程序可以同步或异步完成重置。如果重置后的媒体连接状态不同,驱动程序应在完成重置后的两秒内指示状态。微型端口驱动程序在确定媒体连接状态之前不应完成重置操作;

停止: 当 NDIS 调用 MiniportHaltEx 时,微型端口驱动程序不得指示任何媒体连接状态更改;

正在初始化:NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数来初始化适配器。 在适配器初始化期间,微型端口驱动程序必须遵循以下准则:

  • 如果微型端口驱动程序在从 MiniportInitializeEx 返回后未指示媒体连接状态,则 NDIS 使用 NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES 结构的 MediaConnectState 成员的值来确定媒体连接状态。 当驱动程序从其 MiniportInitializeEx 函数调用 NdisMSetMiniportAttributes 时,微型端口驱动程序为 NDIS 提供此结构。注意 如果 MediaConnectState 成员设置为 MediaConnectStateUnknown,则 NDIS 将继续,就像适配器断开连接一样;
  • 如果在 NDIS 调用 MiniportInitializeEx 后连接了适配器,微型端口驱动程序可以在从 MiniportInitializeEx 返回后 5 秒内指示NDIS_STATUS_MEDIA_CONNECT;
  • 如果在 NDIS 调用 MiniportInitializeEx 后适配器断开连接,微型端口驱动程序应在从 MiniportInitializeEx 返回后 2 秒内指示NDIS_STATUS_MEDIA_DISCONNECT;
  • 初始化时,微型端口驱动程序应异步处理 OID_GEN_MEDIA_CONNECT_STATUS 或 OID_GEN_CO_MEDIA_CONNECT_STATUS 请求。 微型端口驱动程序在确定连接状态之前不应完成此类请求;
  • 媒体连接状态的确定不应延迟初始化。 如有必要,微型端口驱动程序应启动该过程以确定 MiniportInitializeEx 中的连接状态,并在以后完成该过程。 例如,微型端口驱动程序可以设置一个计时器来轮询适配器的连接状态;
  • 反序列化的微型端口驱动程序可以指示在初始化期间媒体断开连接,但序列化的微型端口驱动程序不应;

睡眠:微型端口驱动程序在收到将设备电源状态设置为 D1、D2 或 D3 的OID_PNP_SET_POWER 请求时进入网络睡眠状态。微型端口驱动程序不得在进入睡眠状态或处于睡眠状态时指示任何媒体连接状态发生更改;

醒来:微型端口驱动程序在收到将设备电源状态设置为 D0 的OID_PNP_SET_POWER请求时从睡眠状态唤醒。如果适配器在唤醒后的媒体连接状态与睡眠前的状态相同,微型端口驱动程序不应指示媒体连接状态更改。 如果连接状态发生更改,微型端口驱动程序应在唤醒后的两秒内指示新的连接状态。唤醒时,微型端口驱动程序应异步处理OID_GEN_MEDIA_CONNECT_STATUS或OID_GEN_CO_MEDIA_CONNECT_STATUS请求。 微型端口驱动程序在确定连接状态之前不应完成此类请求;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF多区域组网实验(华为)

思科设备参考:OSPF多区域组网实验(思科) 技术简介 OSPF多区域功能通过划分网络为多个逻辑区域来提高网络的可扩展性和管理性能。每个区域内部运行独立的SPF计算,而区域之间通过区域边界路由器进行路由信息交换。这种划分策略适用…

线性代数(二)

1.标量 标量也叫0D张量,一个标量就是一个数,它只有大小,没有方向。 import torch x torch.Tensor(3) print(x)2.向量 向量也叫1D张量。向量只有一个轴,沿着行的方向,或者沿着列的方向。向量一般指列向量。 import…

光伏储能EMS 风电智慧能量管理系统 -安科瑞王盼盼

安科瑞18721098782王盼盼 一:储能 EMS(Energy Management System) 储能 EMS:储能 EMS 是一个综合管理系统,用于整体管理和优化储能系统的运行。它基于电力系统的需求和需求响应,通过控制和协调储能设备的…

WPF中DataGrid实现多选框功能

1. 效果图 2. Model建立 public class RstModelCheck : ObservableObject {//为了显示Head1和Head2.而且View中绑定属性而非字段,否则不能显示。public string? Name { get; set; } public bool PlatenAll {get > _platenAll;set{SetProperty(ref _platenAl…

【代码随想录】【算法训练营】【第15天】 [102]二叉树的层序遍历 [226]翻转二叉树 [101]对称二叉树

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 15,一周中最困难的周三~ 题目详情 [102] 二叉树的层序遍历 题目描述 102 二叉树的层序遍历 解题思路 前提:二叉树的层级遍历 思路:利用队列的“先进先出…

C#利用WinForm实现可以查看指定目录文件下所有图片

目录 一、关于Winform 二、创建应用 三、功能实现 四、代码部分 一、关于Winform Windows 窗体是用于生成 Windows 桌面应用的 UI 框架。 它提供了一种基于 Visual Studio 中提供的可视化设计器创建桌面应用的高效方法。 利用视觉对象控件的拖放放置等功能,可…

信捷PLC 编程常用寄存器及编程技巧说明

最近在用信捷的PLC,分享下常用的寄存器和编程技巧说明。 技巧主要包括以下几个方面: 充分规划各个功能区:在编写程序时,需要充分规划各个功能区。 考虑伺服步进功能和气缸手动功能的应用,手动操作时,可…

C语言 | Leetcode C语言题解之第107题二叉树的层序遍历II

题目: 题解: int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {int** levelOrder malloc(sizeof(int*) * 2001);*returnColumnSizes malloc(sizeof(int) * 2001);*returnSize 0;if (!root) {return level…

个人感觉对Material设计有用的几个网址

(一) Modular and customizable Material Design UI components for Android GIthub: material-components-android (二) 学习Material设计 Material Design (三) 用于创建Material主题,支持导出多种格式 material-theme-builder

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标:能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法: document.querySelector(css选择…

一维前缀和[模版]

题目链接 题目: 分析: 因为要求数组中连续区间的和, 可以使用前缀和算法注意:下标是从1开始算起的, 真正下标0的位置是0第一步: 预处理出来一个前缀和数组dp dp[i] 表示: 表示[1,i] 区间所有元素的和dp[i] dp[i-1] arr[i]例如示例一中: dp数组为{1,3,7}第二步: 使用前缀数…

css特性(继承性、层叠性)

1.继承性 可以继承的常见属性(文字控制属性都可以继承) ps:可以通过调试器查看是否能够继承 注意:a标签的color会继承失效;h系列标签的font-size会继承失效 2.层叠性 后面的样式会覆盖前面的样式 给同一个标签设置不同的样式…

酷开科技以内容为契机,酷开系统向消费者需求的深度挖掘迈进一步

酷开系统还拥有强大的内容资源和推荐算法,能够根据消费者的兴趣爱好为其提供个性化的推荐服务。无论是电影、电视剧、综艺节目,还是新闻、体育、娱乐资讯,酷开系统都能帮助大家快速找到感兴趣的内容,并且通过智能推荐算法不断优化…

vue3插槽solt 使用

背景增加组件的复用性,个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件? 一、solt 原理 知其然知其所以然 Vue的插槽(slots)是一种分发内容的机制,允许你在组件模板中定义可插入的内容…

4月粽子行业线上市场销售数据分析

随着节日庆祝常态化,消费者对礼物消费的态度发生变化,这会影响粽子的消费模式和市场需求。再加上技术进步,如速冻粽子和真空粽子的推广,也极大地推动了粽子行业的发展,使得产品更易于保存和运输,从而满足了…

Spark-RDD-持久化详解

Spark概述 Spark-RDD概述 1.持久化与序列化的关系 在Spark中,持久化(Persistence)和序列化(Serialization)是两个关键概念,它们在RDD处理过程中起着重要作用,并且有一定的关联: &a…

Windows安装mingw32/w64

1.下载 MinGW-w64 WinLibs - GCCMinGW-w64 compiler for Windows Releases niXman/mingw-builds-binaries (github.com) MinGW-w64、UCRT 和 MSVCRT 是 Windows 平台上常用的 C/C 运行库,它们有以下不同点: MinGW-w64:是一个基于 GCC 的…

Transformer,革命性的深度学习架构

Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神经网络(RNN)和卷积神经网络(CNN)的序列建模常规,…

Golang | Leetcode Golang题解之第108题将有序数组转换为二叉搜索树

题目: 题解: func sortedArrayToBST(nums []int) *TreeNode {rand.Seed(time.Now().UnixNano())return helper(nums, 0, len(nums) - 1) }func helper(nums []int, left, right int) *TreeNode {if left > right {return nil}// 选择任意一个中间位置…

基于Vue的图片文件上传与压缩组件的设计与实现

摘要 随着前端技术的发展,系统开发的复杂度不断提升,传统开发方式将整个系统做成整块应用,导致修改和维护成本高昂。组件化开发作为一种解决方案,能够实现单独开发、单独维护,并能灵活组合组件,从而提升开…