
                    ---begin 'hdid.c'---
                    #include <stdio.h>
                    #include <windows.h>
                    #include <winioctl.h>
                     
                    BYTE buf1[0x400],buf2[0x400];
                    char s[256];
                     
                    int main(int argc,char **argv)
                    {
                    HANDLE h;
                    DWORD dw,i;
                    PSENDCMDINPARAMS pInParam;
                    PSENDCMDOUTPARAMS pOutParam;
                    int c;
                     
                    if(argc<=1)
                    {
                      puts("Usage: hdid <device>");
                      return 0;
                    }
                    sprintf(s,"\\\\.\\%s",argv[1]);
                    h = CreateFile(s,MAXIMUM_ALLOWED,
                      FILE_SHARE_READ|FILE_SHARE_WRITE,
                      NULL,OPEN_EXISTING,0,NULL);
                    if(h==INVALID_HANDLE_VALUE)
                    {
                      printf("Unable to open (%08X)\n",GetLastError());
                      return 1;
                    }
                     
                    pInParam = (PSENDCMDINPARAMS) buf1;
                    pInParam->cBufferSize = IDENTIFY_BUFFER_SIZE;
                    pInParam->bDriveNumber = 0;
                    pInParam->irDriveRegs.bFeaturesReg = 0;
                    pInParam->irDriveRegs.bCommandReg = ID_CMD;
                    pInParam->irDriveRegs.bSectorCountReg = 1;
                    pInParam->irDriveRegs.bSectorNumberReg = 0;
                    pInParam->irDriveRegs.bCylLowReg = SMART_CYL_LOW;
                    pInParam->irDriveRegs.bCylHighReg = SMART_CYL_HI;
                    pInParam->irDriveRegs.bDriveHeadReg = 0;
                     
                    dw = 0;
                    if(!DeviceIoControl(h,SMART_RCV_DRIVE_DATA,
                     
                    buf1,sizeof(SENDCMDINPARAMS)-1,buf2,sizeof(SENDCMDINPARAMS)-1+0x200,
                      &dw,NULL))
                    {
                      printf("IOCTL failed (%08X)\n",GetLastError());
                      return 2;
                    }
                    CloseHandle(h);
                    swab(buf2,buf1,dw);
                    for(i=0;i<dw;i++)
                    {
                      c = buf1[i];
                      if(c<0x20) c = ' ';
                      putch(c);
                    }
                    return 0;
                    }
                    ---end 'hdid.c'---