最近在做一个硬盘加密的项目,需要向硬盘发送ATA指令,但怎么也发不成功,要不返回错误代码50:Not support,或者5:Access is denied.所以请求各位的帮助!先谢过大家了

解决方案 »

  1.   

    BOOL ATA_Read_Sector(CString driverName)
    {
    BOOL status;
    HANDLE hDev;
    ULONG rByte;
    PUCHAR dataBuffer = NULL; ULONG sectorSize = 512;
    ULONG alignmentMask = 0; hDev = CreateFile(  driverName,                            // Object Name: Point Physical HDD 0   
    0,                                  // Access Mode: 0 for Devices   
    FILE_SHARE_READ | FILE_SHARE_WRITE, // Shared Mode:   
    0,                                  // Security Attributes: NULL can not be inherited(繼承)   
    OPEN_EXISTING,                      // Creation Disposition   
    0,                                  // File flags and attributes   
    NULL);                              // Do not copy file attributes   
    if (hDev == INVALID_HANDLE_VALUE)   
    {      
    return FALSE;   
    }    dataBuffer = AllocateAlignedBuffer(sectorSize,alignmentMask); ATA_PASS_THROUGH_DIRECT_WITH_BUFFERS ab;
    memset(&ab, 0, sizeof(ab));  
    ab.aptd.Length = sizeof(ATA_PASS_THROUGH_DIRECT);   
    ab.aptd.TimeOutValue = 10;   
    unsigned size = offsetof(ATA_PASS_THROUGH_DIRECT_WITH_BUFFERS, ucSenseBuf);     
    ab.aptd.AtaFlags = ATA_FLAGS_DATA_IN;   
    ab.aptd.DataTransferLength = 512;   
    size += 512;   
    ab.aptd.DataBuffer = dataBuffer;
    ab.ucSenseBuf[0] = 0xcf;   
    ab.aptd.CurrentTaskFile[1] = 0x01;   
    ab.aptd.CurrentTaskFile[3] = 0x06;
    ab.aptd.CurrentTaskFile[4] = 0;
    ab.aptd.CurrentTaskFile[5] = 0; 
    ab.aptd.CurrentTaskFile[6] = 0x20;   
    status = DeviceIoControl( hDev,   
    IOCTL_ATA_PASS_THROUGH,   
    &ab,   
    size,   
    &ab,   
    size,   
    &rByte,   
    NULL);   
    if (!status) // 
    {   
    long err = GetLastError();     
    return FALSE;   
    }    return TRUE;
    }