how to send nvme command

  • Thread starter Thread starter lhllacp
  • Start date Start date
L

lhllacp

Guest
code:

the “PhysicalDrive1” is nvme disk




HANDLE handle = CreateFileA("\\\\.\\PhysicalDrive1",GENERIC_READ| GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if (handle != INVALID_HANDLE_VALUE)
{
return GetLastError();
}

PSTORAGE_PROTOCOL_COMMAND protocolCommand;
int bufferLength = FIELD_OFFSET(STORAGE_PROTOCOL_COMMAND, Command) + STORAGE_PROTOCOL_COMMAND_LENGTH_NVME + sizeof(NVME_ERROR_INFO_LOG);
char *buffer = (char *)malloc(sizeof(char) * bufferLength);

ZeroMemory(buffer, bufferLength);
protocolCommand = (PSTORAGE_PROTOCOL_COMMAND)buffer;

protocolCommand->Version = STORAGE_PROTOCOL_STRUCTURE_VERSION;
protocolCommand->Length = sizeof(STORAGE_PROTOCOL_COMMAND);
protocolCommand->ProtocolType = ProtocolTypeNvme;
protocolCommand->Flags = STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST;
protocolCommand->CommandLength = STORAGE_PROTOCOL_COMMAND_LENGTH_NVME;
protocolCommand->ErrorInfoLength = sizeof(NVME_ERROR_INFO_LOG);
protocolCommand->DataFromDeviceTransferLength = 4096;
protocolCommand->TimeOutValue = 10;
protocolCommand->ErrorInfoOffset = FIELD_OFFSET(STORAGE_PROTOCOL_COMMAND, Command) + STORAGE_PROTOCOL_COMMAND_LENGTH_NVME;
protocolCommand->DataFromDeviceBufferOffset = protocolCommand->ErrorInfoOffset + protocolCommand->ErrorInfoLength;
protocolCommand->CommandSpecific = STORAGE_PROTOCOL_SPECIFIC_NVME_NVM_COMMAND;

PNVME_COMMAND command = (PNVME_COMMAND)protocolCommand->Command;

command->CDW0.OPC = NVME_NVM_COMMAND_FLUSH;


//
// Send request down.
//
DWORD returnedLength = 0;
bool result = DeviceIoControl(handle,
IOCTL_STORAGE_PROTOCOL_COMMAND,
buffer,
bufferLength,
buffer,
bufferLength,
&returnedLength,
NULL
);
return GetLastError();



the code can not send flush command to nvme disk? thanks ! how to send command?

Continue reading...
 
Back
Top