IOCTL_SCSI_MINIPORT_HYBRID IOCTL (ntddscsi.h)
IOCTL_SCSI_MINIPORT_HYBRID 控制代码将混合磁盘控制请求发送到特定于 HBA 的微型端口驱动程序。 IOCTL_SCSI_MINIPORT_HYBRID 请求是 IOCTL_SCSI_MINIPORT的子 IOCTL。 此 IOCTL 由 StorPort 接收并重新格式化,然后作为 STORAGE_REQUEST_BLOCK(SRB)发送到微型端口,其函数类型为 SRB_FUNCTION_IO_CONTROL。 输入和输出数据包含在 SRB 数据块中。
IOCTL_SCSI_MINIPORT_HYBRID 供第三方应用程序或筛选器驱动器使用,这些驱动器管理加密或写通行为等安全功能。
主要代码
输入缓冲区
在 SRB 的 DataBuffer 成员中指定的缓冲区必须包含 SRB_IO_CONTROL 结构和 HYBRID_REQUEST_BLOCK 结构。 根据 HYBRID_REQUEST_BLOCK的 函数 成员,可以提供其他数据。
输入缓冲区长度
DataTransferLength 指示缓冲区的大小(以字节为单位),如果 HYBRID_REQUEST_BLOCK 的 DataBufferLength 成员为非零,则必须至少 sizeof (SRB_IO_CONTROL) + sizeof(HYBRID_REQUEST_BLOCK),以及函数数据的附加存储。
输出缓冲区
更新 SRB_IO_CONTROL 结构将返回到 SRB 中的数据缓冲区。
输出缓冲区长度
当为指定的 函数返回数据时,DataBufferOffset 和 DataBufferLengthHYBRID_REQUEST_BLOCK 成员是非零的。 为请求函数返回数据时,将更新 SRB 的 DataTransferLength 成员。
状态块
函数请求的结果状态在 SRB_IO_CONTROL的 ReturnCode 成员中设置。 以下是混合磁盘 IOCTL 状态代码。
返回代码 | 描述 |
---|---|
HYBRID_STATUS_SUCCESS | 函数成功完成。 |
HYBRID_STATUS_ILLEGAL_REQUEST | 请求包含无效的函数代码。 |
HYBRID_STATUS_INVALID_PARAMETER | 输入或输出参数的格式不正确。 |
HYBRID_STATUS_OUTPUT_BUFFER_TOO_SMALL | dataBufferLength 中给定的数据长度太小,无法包含请求输出。 |
言论
HYBRID_REQUEST_BLOCK 结构紧跟数据缓冲区中的 SRB_IO_CONTROL 结构。 HYBRID_REQUEST_BLOCK 在 ntddscsi.h 中定义如下。
typedef struct _HYBRID_REQUEST_BLOCK {
ULONG Version;
ULONG Size;
ULONG Function;
ULONG Flags;
ULONG DataBufferOffset;
ULONG DataBufferLength;
} HYBRID_REQUEST_BLOCK, *PHYBRID_REQUEST_BLOCK;
参数要求取决于混合磁盘请求的函数代码。 下表列出了每个函数所需的参数。
功能 | 输入参数 | 输出参数 |
---|---|---|
HYBRID_FUNCTION_GET_INFO |
HYBRID_REQUEST_BLOCK |
HYBRID_REQUEST_BLOCK + |
HYBRID_FUNCTION_DISABLE_CACHING_MEDIUM |
HYBRID_REQUEST_BLOCK |
|
HYBRID_FUNCTION_ENABLE_CACHING_MEDIUM |
HYBRID_REQUEST_BLOCK |
|
HYBRID_FUNCTION_SET_DIRTY_THRESHOLD |
HYBRID_REQUEST_BLOCK + HYBRID_DIRTY_THRESHOLDS |
|
HYBRID_FUNCTION_DEMOTE_BY_SIZE |
HYBRID_REQUEST_BLOCK + HYBRID_DEMOTE_BY_SIZE |
HYBRID_REQUEST_BLOCK 结构位于 SRB DataBuffer 中的 SRB_IO_CONTROL 结构之后。 请求中包含的任何函数数据在 DataBufferOffsetSRB_IO_CONTROL 结构开始时的偏移量中找到。
以下示例演示如何检索HYBRID_FUNCTION_SET_DIRTY_THRESHOLD请求的函数数据。
PSRB_IO_CONTROL srbIoCtl = (PSRB_IO_CONTROL)srb->DataBuffer;
PHYBRID_REQUEST_BLOCK hybridRequest = (PHYBRID_REQUEST_BLOCK)(srbIoCtl + 1);
PHYBRID_DIRTY_THRESHOLDS hybridDirtyThresholds = NULL;
if (hybridRequest->DataBufferOffset >= sizeof(SRB_IO_CONTROL) + sizeof(HYBRID_REQUEST_BLOCK))
{
if (hybridRequest->DataBufferLength >= sizeof(HYBRID_FUNCTION_SET_DIRTY_THRESHOLD))
{
hybridDirtyThresholds = (PHYBRID_DIRTY_THRESHOLDS)((PUCHAR)srbIoCtl + hybridRequest->DataBufferOffset);
}
else
{
srbIoCtl->ReturnCode = HYBRID_STATUS_INVALID_PARAMETER;
}
}
HYBRID_DIRTY_THRESHOLDS
HYBRID_FUNCTION_SET_DIRTY_THRESHOLD函数对其输入参数使用 HYBRID_DIRTY_THRESHOLDS 结构。 HYBRID_DIRTY_THRESHOLDS 在 ntddscsi.h 中定义如下。
typedef struct _HYBRID_DIRTY_THRESHOLDS {
ULONG Version;
ULONG Size;
ULONG DirtyLowThreshold;
ULONG DirtyHighThreshold;
} HYBRID_DIRTY_THRESHOLDS, *PHYBRID_DIRTY_THRESHOLDS;
- 版本
- 结构的版本。 设置为HYBRID_REQUEST_INFO_STRUCTURE_VERSION。
- 大小
- 结构的大小。 设置为 sizeof(HYBRID_DIRTY_THRESHOLDS)。
- DirtyLowThreshold
- 要同步到磁盘的混合磁盘缓存的小数低阈值。
- DirtyHighThreshold
- 要同步到磁盘的混合磁盘缓存的小数高阈值。
DirtyLowThreshold 和 DirtyHighThreshold 的值表示为阈值与分数基数之间的比率的较小部分。 分数基数由 HYBRID_INFORMATION 结构的 FractionBase 成员确定。
HYBRID_DEMOTE_BY_SIZE
HYBRID_FUNCTION_DEMOTE_BY_SIZE函数对其输入参数使用 HYBRID_DEMOTE_BY_SIZE 结构。 HYBRID_DEMOTE_BY_SIZE 在 ntddscsi.h 中定义,如下所示。
typedef struct _HYBRID_DEMOTE_BY_SIZE {
ULONG Version;
ULONG Size;
UCHAR SourcePriority;
UCHAR TargetPriority;
USHORT Reserved0;
ULONG Reserved1;
ULONGLONG LbaCount;
} HYBRID_DEMOTE_BY_SIZE, *PHYBRID_DEMOTE_BY_SIZE;
- 版本
- 结构的版本。 设置为HYBRID_REQUEST_INFO_STRUCTURE_VERSION。
- 大小
- 结构的大小。 设置为 sizeof(HYBRID_DEMOTE_BY_SIZE)。
- SourcePriority
- 要降级的数据的原始优先级。 此值必须 <= MaximumHybridPriorityLevel 中 从 HYBRID_FUNCTION_GET_INFO 函数请求返回的 HYBRID_INFORMATION 结构成员中的值。 此值必须 > 0。
- TargetPriority
- 要从 SourcePriority 级别降级的数据的目标优先级级别。 此值必须 < SourcePriority。
- Reserved0
- 保留。
- Reserved1
- 保留。
- LbaCount
- 要降级到新优先级的 LBA 数。
此 IOCTL 的 SRB_IO_CONTROL 结构在其 签名 成员中包含IOCTL_MINIPORT_SIGNATURE_HYBRDISK,以及 ControlCode 成员中的 IOCTL_SCSI_MINIPORT_HYBRID。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 8.1 开始可用。 |
标头 | ntddscsi.h (包括 Ntddscsi.h) |