<div dir="ltr"><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">Hi Team,</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
<br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">By referring PT_IOCTL.Doc and WDK SPTI Sample, I am developing an application to send IOCTLs</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
using _NVME_PASS_THROUGH_IOCTL structure.</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
I am facing some problem.</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">DeviceIoControl routine returning Error code 1 (Incorrect Function).</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
<br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">Code shown below :</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
<br></div><div class="gmail_default"><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif">PNVME_PASS_THROUGH_IOCTL pInBuffer = NULL;</font></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif">PNVME_PASS_THROUGH_IOCTL pOutBuffer = NULL;</font></div>
<div class="gmail_default"><font color="#000066" face="tahoma, sans-serif">ULONG ByteSizeTX =4096;<br></font></div></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
<br></div><div class="gmail_default"><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif">/* Allocate input buffer to accommodate size of NVME_PASS_THRUGH_IOCTL only */</font></div><div class="gmail_default">
<font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>InputBufLen = sizeof(NVME_PASS_THROUGH_IOCTL);</font></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>pInBuffer = (PNVME_PASS_THROUGH_IOCTL) malloc(InputBufLen); </font></div>
<div class="gmail_default"><span style="color:rgb(0,0,102);font-family:tahoma,sans-serif">/* Allocate output buffer to accommodate size of NVME_PASS_THRUGH_IOCTL and data */</span><br></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>OutputBufLen = sizeof(NVME_PASS_THROUGH_IOCTL)+ ByteSizeTX - 1;</font></div>
<div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>pOutBuffer = (PNVME_PASS_THROUGH_IOCTL) malloc(OutputBufLen); </font></div></div><div class="gmail_default">
<div class="gmail_default"><font color="#000066" face="tahoma, sans-serif">if (pInBuffer == NULL || pOutBuffer == NULL)</font></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>return;</font></div>
<div class="gmail_default"><span class="" style="color:rgb(0,0,102);font-family:tahoma,sans-serif;white-space:pre"> </span><span style="color:rgb(0,0,102);font-family:tahoma,sans-serif">/* Zero out the buffers */</span><br>
</div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>memset(pInBuffer, 0, InputBufLen);</font></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><span class="" style="white-space:pre"> </span>memset(pOutBuffer, 0, OutputBufLen);</font></div>
<div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><br></font></div><div class="gmail_default"><font color="#000066" face="tahoma, sans-serif"><div class="gmail_default">pInBuffer->SrbIoCtrl.HeaderLength = sizeof(SRB_IO_CONTROL);</div>
<div class="gmail_default">memcpy((UCHAR*)(&pInBuffer->SrbIoCtrl.Signature[0]), NVME_SIG_STR, NVME_SIG_STR_LEN);</div><div class="gmail_default">pInBuffer->SrbIoCtrl.Timeout = NVME_PT_TIMEOUT;</div><div class="gmail_default">
pInBuffer->SrbIoCtrl.ControlCode = (ULONG)NVME_PASS_THROUGH_SRB_IO_CODE;</div><div class="gmail_default">pInBuffer->SrbIoCtrl.Length = InputBufLen - sizeof(SRB_IO_CONTROL);</div><div class="gmail_default"><br></div>
<div class="gmail_default">pInBuffer->NVMeCmd[0]=ADMIN_IDENTIFY;</div><div class="gmail_default">pInBuffer->NVMeCmd[1]=0;</div><div class="gmail_default">pInBuffer->NVMeCmd[10]= 1; //Return corresponding controller data structure</div>
<div class="gmail_default"><br></div><div class="gmail_default">pInBuffer->DataBufferLen = 0;</div><div class="gmail_default">pInBuffer->ReturnBufferLen = sizeof(NVME_PASS_THROUGH_IOCTL) + ByteSizeTX - 1;</div><div class="gmail_default">
<span class="" style="white-space:pre"> </span></div><div class="gmail_default"><br></div><div class="gmail_default"><span class="" style="white-space:pre"> </span></div><div class="gmail_default"><span class="" style="white-space:pre"> </span>status = DeviceIoControl(</div>
<div class="gmail_default"><span class="" style="white-space:pre"> </span> fileHandle, /* Handle to \\.\scsi device via CreateFile */</div><div class="gmail_default"><span class="" style="white-space:pre"> </span> IOCTL_SCSI_MINIPORT, /* IO control function to a miniport driver */</div>
<div class="gmail_default"><span class="" style="white-space:pre"> </span> pInBuffer , /* Input buffer with data sent to driver */</div><div class="gmail_default"><span class="" style="white-space:pre"> </span> InputBufLen, /* Length of data sent to driver (in bytes) */</div>
<div class="gmail_default"><span class="" style="white-space:pre"> </span> pOutBuffer, /* Output buffer with data received from driver */</div><div class="gmail_default"><span class="" style="white-space:pre"> </span> OutputBufLen, /* Length of data received from driver */</div>
<div class="gmail_default"><span class="" style="white-space:pre"> </span> &Count, /* Bytes placed in DataBuffer */</div><div class="gmail_default"><span class="" style="white-space:pre"> </span> NULL); </div>
</font></div></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)"> </div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
Kindly let me know your valuable inputs about this behavior.</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
Note: I am getting proper handle from CreateFile for my NVMe Device.</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">
Regards,</div><div class="gmail_default" style="font-family:tahoma,sans-serif;font-size:small;color:rgb(0,0,102)">Sai</div></div>