windows环境之下如何添加NVMe VSC 命令

work with NVMe driver
Vendor Specific Command
笔者刚开始使用pass through发送VSC的命令总是不能成功,最后发现是这个问题。
windows Inbox Driver 的pass through 机制要求如果要支持VSCcommand, 那么必须要有Command Support and Effects log,这个log里面填写所有主控芯片支持的命令。因此在设置一个新的命令之前需要在主控中实现Command Support and Effects log。
1. 首先在Identify里面需要将Log Page Attributes (LPA)的bit 1 置为1以告诉Host,我们支持Command Support and Effects log, 主机上电后会先发送Identify command,主机会解析收到的回复内容
2.后面主机会发行get log page command 来取走Command Support and Effects log.
3.主机解析完所有的Command Support and Effects log,就知道了你的主控芯片支持的命令列表,不在此列表中的命令使用pass through的时候都会被driver挡掉,DeviceIoControl函数的返回值为1(INVALID FUNCTION)
4. 在这之后你就可以愉快地发送命令了
5. DeviceIOControl函数的用法

    PVOID   buffer = NULL;
    ULONG   bufferLength = 0;
    ULONG   returnedLength = 
Windows平台上向设备发送NVMe命令,通常可以通过以下几种方法实现: 1. **使用Windows驱动程序框架(WDF)**: - 编写一个内核模式驱动程序,使用Windows驱动程序框架(WDF)来与NVMe设备进行通信。通过WDF驱动程序,可以直接访问设备的硬件资源,并发送NVMe命令。 2. **使用Windows存储类驱动程序**: - Windows提供了一个存储类驱动程序(StorPort),可以通过StorPort接口发送NVMe命令。StorPort驱动程序是专门为高性能存储设备设计的,能够提供更低的延迟和更高的吞吐量。 3. **使用用户模式驱动程序框架(UMDF)**: - 虽然UMDF主要用于用户模式驱动程序,但也可以通过一些间接的方法与NVMe设备通信。不过,这种方法通常不如内核模式驱动程序高效。 4. **使用第三方库**: - 有一些第三方库和工具可以简化与NVMe设备的通信。例如,NVMe CLI(Command Line Interface)工具可以用于发送NVMe命令,但它主要是在Linux平台上使用。Windows上可以使用类似的工具或库,或者通过PowerShell脚本调用这些工具。 5. **直接访问硬件寄存器**: - 在某些情况下,可以通过直接访问PCIe配置空间和内存映射的I/O寄存器来发送NVMe命令。这种方法需要深入了解硬件架构,并且通常需要管理员权限。 以下是一个简单的示例,展示如何使用Windows驱动程序框架(WDF)发送NVMe命令: ```c #include <ntddk.h> #include <wdf.h> DRIVER_INITIALIZE DriverEntry; EVT_WDF_DRIVER_DEVICE_ADD MyDriverEvtDeviceAdd; NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath ) { WDF_DRIVER_CONFIG config; NTSTATUS status; WDF_DRIVER_CONFIG_INIT(&config, MyDriverEvtDeviceAdd); status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE); return status; } NTSTATUS MyDriverEvtDeviceAdd( _In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit ) { NTSTATUS status; WDFDEVICE device; WDF_IO_QUEUE_CONFIG ioQueueConfig; UNREFERENCED_PARAMETER(Driver); status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &device); if (NT_SUCCESS(status)) { WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchSequential); ioQueueConfig.EvtIoRead = MyDriverEvtIoRead; ioQueueConfig.EvtIoWrite = MyDriverEvtIoWrite; status = WdfIoQueueCreate(device, &ioQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE); } return status; } VOID MyDriverEvtIoRead( _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length ) { UNREFERENCED_PARAMETER(Queue); UNREFERENCED_PARAMETER(Length); // 处理NVMe读取命令 WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 0); } VOID MyDriverEvtIoWrite( _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length ) { UNREFERENCED_PARAMETER(Queue); UNREFERENCED_PARAMETER(Length); // 处理NVMe写入命令 WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 0); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值