IOCTL_SFFDISK_QUERY_DEVICE_PROTOCOL IOCTL (sffdisk.h)

用户模式应用程序使用此 IOCTL 检索将卡标识为 SD 卡或 MMC 卡的协议值。 有关此命令的说明,请参阅 安全数字 I/O (SDIO) 规范。

若要执行此操作,请使用以下参数 (Microsoft Windows SDK文档) 中所述调用 DeviceIoControl 函数。

bRet = DeviceIoControl (
    (HANDLE)  hDevice, 
    (DWORD)  dwIoControlCode, 
    (PUCHAR)  lpInBuffer,
    (DWORD)  nInBufferSize, 
    (PUCHAR)  lpOutBuffer,
    (DWORD)  nOutBufferSize, 
    (LPDWORD)  lpBytesReturned,
    (LPOVERLAPPED)  lpOverlapped 
  );

参数

hDevice
SD 堆栈中卷的句柄。
dwIoControlCode
包含操作的控制代码。 此值标识要执行的特定操作以及要执行该操作的设备类型。 对此操作使用IOCTL_SFFDISK_QUERY_DEVICE_PROTOCOL。
lpInBuffer
不用于此 IOCTL。 调用方应传入 NULL
nInBufferSize
不用于此 IOCTL。 调用方应传入值 0。
lpOutBuffer
指向用户提供的缓冲区中包含结果数据的 SFFDISK_QUERY_DEVICE_PROTOCOL_DATA 结构的指针。 SFFDISK_QUERY_DEVICE_PROTOCOL_DATA 结构的 ProtocolGUID 成员包含一个 GUID,该 GUID 将卡标识为 SD 卡或 MMC 卡。 如果操作失败,并且 GetLastError 返回错误代码STATUS_BUFFER_TOO_SMALL,则输出缓冲区不够大,无法保存结果数据。
nOutBufferSize
包含 lpOutBuffer 参数指向的输出缓冲区的大小(以字节为单位)。
lpBytesReturned
指向变量的指针,该变量接收 lpOutBuffer 指向的缓冲区中存储的结果数据的大小(以字节为单位)。

如果输出缓冲区太小而无法保存返回数据,则输出时它将包含值零,调用将失败, GetLastError 将返回ERROR_INSUFFICIENT_BUFFER错误代码。 万一。

如果 lpOverlapped (非重叠 I/O) 为 NULL,则调用方无法在输入时向 lpBytesReturned 参数分配 NULL。 如果 lpOverlapped 不是 NULL (重叠的 I/O) ,则调用方可以将 NULL 分配给 lpBytesReturned 参数。

如果这是重叠操作,可以通过调用 GetOverlappedResult 函数检索返回的字节数。 如果 hDevice 与 I/O 完成端口相关联,可以通过调用 GetQueuedCompletionStatus 函数来获取返回的字节数。 有关 GetOverlappedResultGetQueuedCompletionStatus 函数的说明,请参阅 Windows SDK 文档。

lpOverlapped
指向 OVERLAPPED 结构的指针,如 Windows SDK 文档中所述。

如果调用方使用 FILE_FLAG_OVERLAPPED 标志打开设备, 则 lpOverlapped 必须指向有效的 OVERLAPPED 结构。 在这种情况下,系统将 DeviceIoControl 作为重叠的异步操作执行。 如果调用方使用 FILE_FLAG_OVERLAPPED 标志打开设备,并且 lpOverlappedNULL,则该函数以不可预知的方式失败。

如果调用方在未指定FILE_FLAG_OVERLAPPED标志的情况下打开设备,则系统将忽略 lpOverlapped 中的值,并且 DeviceIoControl 函数在操作完成或发生错误之前不会返回。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

TBD

输出缓冲区

TBD

输出缓冲区长度

TBD

输入/输出缓冲区

TBD

输入/输出缓冲区长度

TBD

状态块

如果操作成功, DeviceIoControl 将返回非零值。

如果操作失败, DeviceIoControl 将返回零。 要获得更多的错误信息,请调用 GetLastError。

要求

要求
Header sffdisk.h (包括 Sffdisk.h)