<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:clearspace="http://www.jivesoftware.com/xmlns/clearspace/rss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Intel Communities: Message List - Sending IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD</title>
    <link>http://communities.intel.com/community/tech/solidstate?view=discussions</link>
    <description>Most recent forum messages</description>
    <language>en</language>
    <pubDate>Sat, 16 Jun 2012 05:06:49 GMT</pubDate>
    <generator>Jive SBS 5.0.2.0  (http://jivesoftware.com/products/clearspace/)</generator>
    <dc:date>2012-06-16T05:06:49Z</dc:date>
    <dc:language>en</dc:language>
    <item>
      <title>Sending IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD</title>
      <link>http://communities.intel.com/message/159224?tstart=0#159224</link>
      <description>&lt;!-- [DocumentBodyStart:08a75ad5-9b44-4e94-9297-ebf0ae8bda00] --&gt;&lt;div class="jive-rendered-content"&gt;&lt;p&gt;Hi All, (Kindly guide me if I am at wrong place)&lt;/p&gt;&lt;p&gt;My aim is to detect Solid State Drives in systems with raid configuration. Using smartmontools' following command I observe bit 434 (217) shows value 1 for SSD: smartctl -i -r ataioctl,2 /dev/csmi0,0&lt;/p&gt;&lt;p&gt;Attempting to read the same 512 bytes of data I have attempted to send IDENTIFY DEVICE commands in following 2 ways: &lt;/p&gt;&lt;p&gt;Method 1 has info-&amp;gt;IoctlHeader.ReturnCode = 3 which means CSMI_SAS_STATUS_INVALID_PARAMETER.(CSMI buffer provided is too small)&lt;/p&gt;&lt;p&gt;Method 2 fails with DeviceIoControl() set GetLastError() as 87 (ERROR_INVALID_PARAMETER), Can you help me in understanding what could be wrong and am I on the right track? &lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp; portNumber = 0;&lt;/p&gt;&lt;p&gt;_stprintf_s(DeviceName, (sizeof(char)*128),_T("\\\\.\\Scsi%u:"),portNumber);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;handle = CreateFile(DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,&amp;nbsp; NULL,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPEN_EXISTING, NULL, NULL);&lt;/p&gt;&lt;p&gt;if (handle == INVALID_HANDLE_VALUE)&lt;/p&gt;&lt;p&gt;{ &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Unable to open handle to device , Error %u\n", GetLastError());&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/p&gt;&lt;p&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt; CSMI_SAS_STP_PASSTHRU_BUFFER* info = (CSMI_SAS_STP_PASSTHRU_BUFFER *) &lt;/p&gt;&lt;p&gt;calloc(1, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER));&lt;/p&gt;&lt;p&gt;info-&amp;gt;IoctlHeader.HeaderLength = sizeof(IOCTL_HEADER);&lt;/p&gt;&lt;p&gt;info-&amp;gt;IoctlHeader.Timeout = CSMI_SAS_TIMEOUT;&lt;/p&gt;&lt;p&gt;info-&amp;gt;IoctlHeader.ControlCode = CC_CSMI_SAS_STP_PASSTHRU;&lt;/p&gt;&lt;p&gt;info-&amp;gt;IoctlHeader.Length = sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER) -&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(IOCTL_HEADER);&lt;/p&gt;&lt;p&gt;info-&amp;gt;IoctlHeader.ReturnCode = 0;&lt;/p&gt;&lt;p&gt;memcpy(&amp;amp;info-&amp;gt;IoctlHeader.Signature, CSMI_SAS_SIGNATURE, sizeof(CSMI_SAS_SIGNATURE));&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;bSuccess = DeviceIoControl(handle, IOCTL_SCSI_MINIPORT, info, &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER), &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; info, sizeof(CSMI_SAS_STP_PASSTHRU_BUFFER),&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;bytesReturned, NULL);&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;////////////////////////////////////////////////////////&lt;/p&gt;&lt;p&gt;METHOD 2&lt;/p&gt;&lt;p&gt;/////////////////////////////////////////////////////////&lt;/p&gt;&lt;p&gt;&amp;nbsp; handle = CreateFile(L"\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE,&amp;nbsp; FILE_SHARE_READ | FILE_SHARE_WRITE,&lt;/p&gt;&lt;p&gt;&amp;nbsp; NULL,&lt;/p&gt;&lt;p&gt;&amp;nbsp; OPEN_EXISTING,&lt;/p&gt;&lt;p&gt;&amp;nbsp; NULL,&lt;/p&gt;&lt;p&gt;&amp;nbsp; NULL);&lt;/p&gt;&lt;p&gt;&amp;nbsp; if (handle == INVALID_HANDLE_VALUE)&lt;/p&gt;&lt;p&gt;&amp;nbsp; { &lt;/p&gt;&lt;p&gt;&amp;nbsp; printf("Unable to open handle to device , Error %u\n", GetLastError());&lt;/p&gt;&lt;p&gt;&amp;nbsp; return 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; //Allocate memory for ATA_PASS_THROUGH_EX and clear the contents &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData = (PATA_PASS_THROUGH_EX) VirtualAlloc(NULL, dataSize, MEM_COMMIT, PAGE_READWRITE); &lt;/p&gt;&lt;p&gt;&amp;nbsp; ZeroMemory(pATAData,dataSize); &lt;/p&gt;&lt;p&gt;&amp;nbsp; //Fill in the IDENTIFY DEVICE query data &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;Length = sizeof(ATA_PASS_THROUGH_EX); &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX); &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;DataTransferLength = 512; &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;AtaFlags = ATA_FLAGS_DATA_IN; &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;TimeOutValue = 10; //Seconds&lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData-&amp;gt;CurrentTaskFile[6] = 0xEC; /* send the command*/ &lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; status = DeviceIoControl( handle, &lt;/p&gt;&lt;p&gt;IOCTL_ATA_PASS_THROUGH, &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData, &lt;/p&gt;&lt;p&gt;&amp;nbsp; dataSize, /* input buffer and size */ &lt;/p&gt;&lt;p&gt;&amp;nbsp; pATAData, &lt;/p&gt;&lt;p&gt;&amp;nbsp; dataSize, /* output buffer and size */ &lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;amp;bytescopied, /* bytes copied to output buffer*/ &lt;/p&gt;&lt;p&gt;&amp;nbsp; NULL ); /* no overlapping */&lt;/p&gt;&lt;p style="min-height: 8pt; height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thank you,&lt;/p&gt;&lt;p&gt;Pradeep&lt;/p&gt;&lt;/div&gt;&lt;!-- [DocumentBodyEnd:08a75ad5-9b44-4e94-9297-ebf0ae8bda00] --&gt;</description>
      <pubDate>Sat, 16 Jun 2012 05:06:49 GMT</pubDate>
      <author>webadmin@intel.com</author>
      <guid>http://communities.intel.com/message/159224?tstart=0#159224</guid>
      <dc:date>2012-06-16T05:06:49Z</dc:date>
      <clearspace:dateToText>11 months, 1 week ago</clearspace:dateToText>
      <clearspace:objectType>0</clearspace:objectType>
    </item>
  </channel>
</rss>

