I want to read Extended Error Log from HDD and I am sending READ_LOG_EXT(0x2F) command to HDD to read error log data, which in my case stored in 5 number of sectors. So I want to read five number of sector with the code below. But I don’t know how to read more that one sector the code below. Here I am getting only one sector; help me to read multiple sectors …
#include <stdio.h>
#include <windows.h>
#include
#include <conio.h>
#include <winioctl.h>
#include <ntddscsi.h>
ATA_PASS_THROUGH_EX ATAData;
ATA_OUTPUT_BUFFER ATAOut;typedef struct _ATA_OUTPUT_BUFFER
{
ATA_PASS_THROUGH_EX pSCOP;
BYTE output_buff[512];
}ATA_OUTPUT_BUFFER,*PATA_OUTPUT_BUFFER;
int main()
{
HANDLE hSMARTIOCTL;
int i,status,dataSize,flag=0;
DWORD cbBytesReturned=0;
BYTE bIDCmd;
BYTE bDfpDriveMap = 0;
dataSize=512;
for(i=1;i<2;i++)
{
if ((hSMARTIOCTL = OpenSMART(i)) != INVALID_HANDLE_VALUE) // Try to get a handle to SMART IOCTL, report failure and exit if can’t.
{
memset(ATAOut.output_buff, 0, sizeof(512));
//Allocate memory for
ATA_PASS_THROUGH_EX and clear the contents
if ( DoIDENTIFY(hSMARTIOCTL, &ATAData,&ATAOut,bIDCmd, i, &cbBytesReturned))
{
DisplayIdInfo((PIDSECTOR) ATAOut.output_buff,bIDCmd,i);
}
else
{
printf(“Identify Command Error %d\n”,GetLastError());
}
}
}
}
HANDLE OpenSMART(int n)
{
HANDLE hSMARTIOCTL = 0;
char szT1[256]={0};
printf(" ---------------------------------------- \n");
printf(" << Device Discover >>\n");
printf(" ---------------------------------------- \n\n");
wsprintf(szT1,“\\.\PHYSICALDRIVE%d”,n);
if ((hSMARTIOCTL = CreateFile(szT1,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL)) == INVALID_HANDLE_VALUE)
printf(“Unable to open physical drive, error code: 0x%lX\n”, GetLastError());
else
printf(“Physical drive %d opened successfully\n\n”,n);
return hSMARTIOCTL;
}
BOOL DoIDENTIFY(HANDLE hSMARTIOCTL, PATA_PASS_THROUGH_EX pSCIP,PATA_OUTPUT_BUFFER pSCOP, BYTE bIDCmd, BYTE bDriveNum, PDWORD lpcbBytesReturned)
{
int val;
// Set up data structures for IDENTIFY command.
pSCIP->AtaFlags = ATA_FLAGS_DATA_IN | ATA_FLAGS_48BIT_COMMAND;
pSCIP->Length= sizeof(ATAData);
pSCIP->DataTransferLength= IDENTIFY_BUFFER_SIZE;
pSCIP->TimeOutValue= 10;
pSCIP->DataBufferOffset= offsetof(ATA_OUTPUT_BUFFER,output_buff);
pSCIP->PreviousTaskFile[0]=0;
pSCIP->PreviousTaskFile[1]=1;
pSCIP->PreviousTaskFile[2]=0;
pSCIP->PreviousTaskFile[3]=0;
pSCIP->PreviousTaskFile[4]=0;
pSCIP->PreviousTaskFile[5]=0xA0 | ((bDriveNum & 1) << 4); // Compute the drive number.
//pSCIP->PreviousTaskFile[6]=0;
pSCIP->PreviousTaskFile[7] = 0;
pSCIP->CurrentTaskFile[0]=0;
pSCIP->CurrentTaskFile[1]=1;
pSCIP->CurrentTaskFile[2]=0x3;
pSCIP->CurrentTaskFile[3]=0;
pSCIP->CurrentTaskFile[4]=0;
pSCIP->CurrentTaskFile[5]=0xA0 | ((bDriveNum & 1) << 4); // Compute the drive number.
pSCIP->CurrentTaskFile[6]=0X2F;
pSCIP->CurrentTaskFile[7] = 0; // The command can either be IDE identify or ATAPI identify.
pSCIP->TargetId=bDriveNum;
val=DeviceIoControl(hSMARTIOCTL, IOCTL_ATA_PASS_THROUGH,
pSCIP,sizeof(ATAOut),pSCOP, sizeof(ATAOut),
lpcbBytesReturned, NULL);
return val;
}</ntddscsi.h></winioctl.h></conio.h></windows.h></stdio.h>