int gRadix = 16;
PADAPTERINFO g_AdapterInfo = NULL;
-BOOLEAN
-ata_power_mode(
- int bus_id,
- int dev_id,
- int power_mode
- );
-
void print_help() {
printf("Usage:\n"
" atactl -<switches> c|s<controller id>:b<bus id>:d<device id>[:l<lun>]\n"
" d [XXX] lock ATA/SATA bus for device removal for XXX seconds or\n"
" for %d seconds if no lock timeout specified.\n"
" can be used with -h, -m or standalone.\n"
- " D [XXX] disable device (turn into sleep mode) and lock ATA/SATA bus \n"
- " for device removal for XXX seconds or\n"
- " for %d seconds if no lock timeout specified.\n"
- " can be used with -h, -m or standalone.\n"
- " pX change power state to X, where X is\n"
- " 0 - active, 1 - idle, 2 - standby, 3 - sleep\n"
" r (R)eset device\n"
" ba (A)ssign (B)ad-block list\n"
" bl get assigned (B)ad-block (L)ist\n"
#define CMD_ATA_MODE 0x04
#define CMD_ATA_RESET 0x05
#define CMD_ATA_BBLK 0x06
-#define CMD_ATA_POWER 0x07
HANDLE
ata_open_dev(
return TRUE;
} // end ata_send_ioctl()
-int
-ata_send_scsi(
- HANDLE h,
- PSCSI_ADDRESS addr,
- PCDB cdb,
- UCHAR cdbLength,
- PVOID Buffer,
- ULONG BufferLength,
- BOOLEAN DataIn,
- PSENSE_DATA senseData,
- PULONG returned
- )
-{
- ULONG status;
- PSCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
- ULONG data_len = BufferLength;
- ULONG len;
-
- len = BufferLength + offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf);
-
- sptwb = (PSCSI_PASS_THROUGH_WITH_BUFFERS)GlobalAlloc(GMEM_FIXED, len);
- if(!sptwb) {
- return FALSE;
- }
- memset(sptwb, 0, offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf));
-
- sptwb->spt.Length = sizeof(SCSI_PASS_THROUGH);
- sptwb->spt.PathId = addr->PathId;
- sptwb->spt.TargetId = addr->TargetId;
- sptwb->spt.Lun = addr->Lun;
- sptwb->spt.CdbLength = cdbLength;
- sptwb->spt.SenseInfoLength = 24;
- sptwb->spt.DataIn = Buffer ? (DataIn ? SCSI_IOCTL_DATA_IN : SCSI_IOCTL_DATA_OUT) : 0;
- sptwb->spt.DataTransferLength = BufferLength;
- sptwb->spt.TimeOutValue = 10;
- sptwb->spt.DataBufferOffset =
- offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
- sptwb->spt.SenseInfoOffset =
- offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);
- memcpy(&sptwb->spt.Cdb, cdb, cdbLength);
-
- if(Buffer && !DataIn) {
- memcpy(&sptwb->ucSenseBuf, Buffer, BufferLength);
- }
-
- status = DeviceIoControl(h,
- IOCTL_SCSI_PASS_THROUGH,
- sptwb,
- (Buffer && !DataIn) ? len : sizeof(SCSI_PASS_THROUGH),
- sptwb,
- (Buffer && DataIn) ? len : offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf),
- returned,
- FALSE);
-
- if(Buffer && DataIn) {
- memcpy(Buffer, &sptwb->ucDataBuf, BufferLength);
- }
- if(senseData) {
- memcpy(senseData, &sptwb->ucSenseBuf, sizeof(sptwb->ucSenseBuf));
- }
-
- GlobalFree(sptwb);
-
- if(!status) {
- status = GetLastError();
- return FALSE;
- }
- return TRUE;
-} // end ata_send_scsi()
-
IO_SCSI_CAPABILITIES g_capabilities;
UCHAR g_inquiry_buffer[2048];
GETTRANSFERMODE IoMode;
PSENDCMDOUTPARAMS pout;
PIDENTIFY_DATA ident;
- PINQUIRYDATA scsi_ident;
char buff[sizeof(SENDCMDOUTPARAMS)+/*sizeof(IDENTIFY_DATA)*/2048];
char mode_str[12];
- //ULONG bus_id = (dev_id >> 24) & 0xff;
+ ULONG bus_id = (dev_id >> 24) & 0xff;
BOOLEAN found = FALSE;
SENDCMDINPARAMS pin;
int io_mode = -1;
char lun_str[10];
HKEY hKey2;
ULONGLONG max_lba = -1;
- USHORT chs[3] = { 0 };
+ USHORT chs[3];
if(dev_id != -1) {
dev_id &= 0x00ffffff;
} else {
mode_str[0] = 0;
}
- printf(" b%lu [%s]\n",
+ printf(" b%u [%s]\n",
i,
mode_str
);
if(l_dev_id == dev_id || dev_id == -1) {
- scsi_ident = (PINQUIRYDATA)&(inquiryData->InquiryData);
- if(!memcmp(&(scsi_ident->VendorId[0]), UNIATA_COMM_PORT_VENDOR_STR, 24)) {
+ if(!memcmp(&(inquiryData->InquiryData[8]), UNIATA_COMM_PORT_VENDOR_STR, 24)) {
// skip communication port
goto next_dev;
}
}
- if(!g_extended) {
- printf(" b%lu:d%d%s %24.24s %4.4s ",
- i,
- inquiryData->TargetId,
- lun_str,
- /*(inquiryData->DeviceClaimed) ? "Y" : "N",*/
- (g_extended ? (PUCHAR)"" : &scsi_ident->VendorId[0]),
- (g_extended ? (PUCHAR)"" : &scsi_ident->ProductRevisionLevel[0])
- );
- } else {
- printf(" b%lu:d%d%s ",
- i,
- inquiryData->TargetId,
- lun_str
- );
- }
-
if(status) {
+ if(!g_extended) {
+ printf(" b%u:d%d%s %24.24s %4.4s ",
+ i,
+ inquiryData->TargetId,
+ lun_str,
+ /*(inquiryData->DeviceClaimed) ? "Y" : "N",*/
+ (g_extended ? (PUCHAR)"" : &inquiryData->InquiryData[8]),
+ (g_extended ? (PUCHAR)"" : &inquiryData->InquiryData[8+24])
+ );
+ } else {
+ printf(" b%u:d%d%s ",
+ i,
+ inquiryData->TargetId,
+ lun_str
+ );
+ }
if(io_mode == -1) {
- io_mode = ata_cur_mode_from_ident(ident, IDENT_MODE_ACTIVE);
+ io_mode = ata_cur_mode_from_ident(ident);
}
+ } else {
+ goto next_dev;
+
}
if(io_mode != -1) {
ata_mode_to_str(mode_str, io_mode);
}
printf("\n");
- if(g_extended) {
- if(status) {
-
- BOOLEAN BlockMode_valid = TRUE;
- BOOLEAN print_geom = FALSE;
-
- switch(ident->DeviceType) {
- case ATAPI_TYPE_DIRECT:
- if(ident->Removable) {
- printf(" Floppy ");
- } else {
- printf(" Hard Drive ");
- }
- break;
- case ATAPI_TYPE_TAPE:
- printf(" Tape Drive ");
- break;
- case ATAPI_TYPE_CDROM:
- printf(" CD/DVD Drive ");
- BlockMode_valid = FALSE;
- break;
- case ATAPI_TYPE_OPTICAL:
- printf(" Optical Drive ");
- BlockMode_valid = FALSE;
- break;
- default:
+ if(status && g_extended) {
+
+ BOOLEAN BlockMode_valid = TRUE;
+ BOOLEAN print_geom = FALSE;
+
+ switch(ident->DeviceType) {
+ case ATAPI_TYPE_DIRECT:
+ if(ident->Removable) {
+ printf(" Floppy ");
+ } else {
printf(" Hard Drive ");
- print_geom = TRUE;
- //MOV_DD_SWP(max_lba, ident->UserAddressableSectors);
- max_lba = ident->UserAddressableSectors;
- if(ident->FeaturesSupport.Address48) {
- max_lba = ident->UserAddressableSectors48;
- }
- //MOV_DW_SWP(chs[0], ident->NumberOfCylinders);
- //MOV_DW_SWP(chs[1], ident->NumberOfHeads);
- //MOV_DW_SWP(chs[2], ident->SectorsPerTrack);
- chs[0] = ident->NumberOfCylinders;
- chs[1] = ident->NumberOfHeads;
- chs[2] = ident->SectorsPerTrack;
- if(!max_lba) {
- max_lba = (ULONG)(chs[0])*(ULONG)(chs[1])*(ULONG)(chs[2]);
- }
- }
- if(io_mode != -1) {
- printf(" %.12s\n", mode_str);
- }
- for (j = 0; j < 40; j += 2) {
- MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->ModelNumber)[j]);
}
- printf(" Mod: %40.40s\n", SerNum);
- for (j = 0; j < 8; j += 2) {
- MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->FirmwareRevision)[j]);
+ break;
+ case ATAPI_TYPE_TAPE:
+ printf(" Tape Drive ");
+ break;
+ case ATAPI_TYPE_CDROM:
+ printf(" CD/DVD Drive ");
+ BlockMode_valid = FALSE;
+ break;
+ case ATAPI_TYPE_OPTICAL:
+ printf(" Optical Drive ");
+ BlockMode_valid = FALSE;
+ break;
+ default:
+ printf(" Hard Drive ");
+ print_geom = 1;
+ //MOV_DD_SWP(max_lba, ident->UserAddressableSectors);
+ max_lba = ident->UserAddressableSectors;
+ if(ident->FeaturesSupport.Address48) {
+ max_lba = ident->UserAddressableSectors48;
}
- printf(" Rev: %8.8s\n", SerNum);
- for (j = 0; j < 20; j += 2) {
- MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->SerialNumber)[j]);
+ //MOV_DW_SWP(chs[0], ident->NumberOfCylinders);
+ //MOV_DW_SWP(chs[1], ident->NumberOfHeads);
+ //MOV_DW_SWP(chs[2], ident->SectorsPerTrack);
+ chs[0] = ident->NumberOfCylinders;
+ chs[1] = ident->NumberOfHeads;
+ chs[2] = ident->SectorsPerTrack;
+ if(!max_lba) {
+ max_lba = (ULONG)(chs[0])*(ULONG)(chs[1])*(ULONG)(chs[2]);
}
- printf(" S/N: %20.20s\n", SerNum);
-
- if(BlockMode_valid) {
- if(ident->MaximumBlockTransfer) {
- printf(" Multi-block mode: %u block%s\n", ident->MaximumBlockTransfer, ident->MaximumBlockTransfer == 1 ? "" : "s");
- } else {
- printf(" Multi-block mode: N/A\n");
- }
- }
- if(print_geom) {
- printf(" C/H/S: %u/%u/%u \n", chs[0], chs[1], chs[2]);
- printf(" LBA: %I64u \n", max_lba);
- if(max_lba < 2) {
- printf(" Size: %lu kb\n", (ULONG)(max_lba/2));
- } else
- if(max_lba < 2*1024*1024) {
- printf(" Size: %lu Mb\n", (ULONG)(max_lba/2048));
- } else
- if(max_lba < (ULONG)2*1024*1024*1024) {
- printf(" Size: %lu.%lu (%lu) Gb\n", (ULONG)(max_lba/2048/1024),
- (ULONG)(((max_lba/2048)%1024)/10),
- (ULONG)(max_lba*512/1000/1000/1000)
- );
- } else {
- printf(" Size: %lu.%lu (%lu) Tb\n", (ULONG)(max_lba/2048/1024/1024),
- (ULONG)((max_lba/2048/1024)%1024)/10,
- (ULONG)(max_lba*512/1000/1000/1000)
- );
- }
+ }
+ if(io_mode != -1) {
+ printf(" %.12s\n", mode_str);
+ }
+ for (j = 0; j < 40; j += 2) {
+ MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->ModelNumber)[j]);
+ }
+ printf(" Mod: %40.40s\n", SerNum);
+ for (j = 0; j < 8; j += 2) {
+ MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->FirmwareRevision)[j]);
+ }
+ printf(" Rev: %8.8s\n", SerNum);
+ for (j = 0; j < 20; j += 2) {
+ MOV_DW_SWP(SerNum[j], ((PUCHAR)ident->SerialNumber)[j]);
+ }
+ printf(" S/N: %20.20s\n", SerNum);
+
+ if(BlockMode_valid) {
+ if(ident->MaximumBlockTransfer) {
+ printf(" Multi-block mode: %u block%s\n", ident->MaximumBlockTransfer, ident->MaximumBlockTransfer == 1 ? "" : "s");
+ } else {
+ printf(" Multi-block mode: N/A\n");
}
- len = 0;
- if((hKey2 = ata_get_bblist_regh(ident, DevSerial, TRUE))) {
- if(RegQueryValueEx(hKey2, DevSerial, NULL, NULL, NULL, &len) == ERROR_SUCCESS) {
- printf(" !!! Assigned bad-block list !!!\n");
- }
- RegCloseKey(hKey2);
+ }
+ if(print_geom) {
+ printf(" C/H/S: %u/%u/%u \n", chs[0], chs[1], chs[2]);
+ printf(" LBA: %I64u \n", max_lba);
+ if(max_lba < 2) {
+ printf(" Size: %u kb\n", max_lba/2);
+ } else
+ if(max_lba < 2*1024*1024) {
+ printf(" Size: %u Mb\n", max_lba/2048);
+ } else
+ if(max_lba < (ULONG)2*1024*1024*1024) {
+ printf(" Size: %u.%u (%u) Gb\n", (ULONG)(max_lba/2048/1024),
+ (ULONG)(((max_lba/2048)%1024)/10),
+ (ULONG)(max_lba*512/1000/1000/1000)
+ );
+ } else {
+ printf(" Size: %u.%u (%u) Tb\n", (ULONG)(max_lba/2048/1024/1024),
+ (ULONG)((max_lba/2048/1024)%1024)/10,
+ (ULONG)(max_lba*512/1000/1000/1000)
+ );
}
- } else {
- switch(scsi_ident->DeviceType) {
- case DIRECT_ACCESS_DEVICE:
- if(scsi_ident->RemovableMedia) {
- printf(" Floppy ");
- } else {
- printf(" Hard Drive ");
- }
- break;
- case SEQUENTIAL_ACCESS_DEVICE:
- printf(" Tape Drive ");
- break;
- case PRINTER_DEVICE:
- printf(" Printer ");
- break;
- case PROCESSOR_DEVICE:
- printf(" Processor ");
- break;
- case WRITE_ONCE_READ_MULTIPLE_DEVICE:
- printf(" WORM Drive ");
- break;
- case READ_ONLY_DIRECT_ACCESS_DEVICE:
- printf(" CDROM Drive ");
- break;
- case SCANNER_DEVICE:
- printf(" Scanner ");
- break;
- case OPTICAL_DEVICE:
- printf(" Optical Drive ");
- break;
- case MEDIUM_CHANGER:
- printf(" Changer ");
- break;
- case COMMUNICATION_DEVICE:
- printf(" Comm. device ");
- break;
+ }
+ len = 0;
+ if(hKey2 = ata_get_bblist_regh(ident, DevSerial, TRUE)) {
+ if(RegQueryValueEx(hKey2, DevSerial, NULL, NULL, NULL, &len) == ERROR_SUCCESS) {
+ printf(" !!! Assigned bad-block list !!!\n");
}
- printf("\n");
+ RegCloseKey(hKey2);
}
+
}
memcpy(&g_ident, ident, sizeof(IDENTIFY_DATA));
}
} else {
if(AdapterInfo->AdapterInterfaceType == PCIBus) {
slotData.u.AsULONG = AdapterInfo->slotNumber;
- printf(" PCI Bus/Dev/Func: %lu/%lu/%lu%s\n",
+ printf(" PCI Bus/Dev/Func: %u/%u/%u%s\n",
AdapterInfo->SystemIoBusNumber, slotData.u.bits.DeviceNumber, slotData.u.bits.FunctionNumber,
AdapterInfo->AdapterInterfaceType == AdapterInfo->OrigAdapterInterfaceType ? "" : " (ISA-Bridged)");
printf(" VendorId/DevId/Rev: %#04x/%#04x/%#02x\n",
if(AdapterInfo->AdapterInterfaceType == Isa) {
printf(" ISA Bus\n");
}
- printf(" IRQ: %ld\n", AdapterInfo->BusInterruptLevel);
+ printf(" IRQ: %d\n", AdapterInfo->BusInterruptLevel);
}
}
ata_close_dev(h);
int bus_id,
int dev_id,
int lock,
- int persistent_hide,
- int power_mode
+ int persistent_hide
)
{
char dev_name[64];
if(dev_id == -1) {
return FALSE;
}
-
- if(power_mode) {
- ata_power_mode(bus_id, dev_id, power_mode);
- }
-
if(lock < 0) {
lock = DEFAULT_REMOVAL_LOCK_TIMEOUT;
}
}
len = GetFileSize(hf, NULL);
- if(!len || len == INVALID_FILE_SIZE)
+ if(!len || len == -1)
goto exit;
bblist = (char*)GlobalAlloc(GMEM_FIXED, len*8);
}
j++;
BB_Msg[sizeof(BB_Msg)-1] = 0;
k=0;
- while((a = BB_Msg[k])) {
+ while(a = BB_Msg[k]) {
if(a == ' ' || a == '\t' || a == '\r') {
k++;
continue;
continue;
}
k0 = k;
- while((a = BB_Msg[k])) {
+ while(a = BB_Msg[k]) {
if(a == ' ' || a == '\t' || a == '\r') {
BB_Msg[k] = '\t';
}
return retval;
} // end ata_bblk()
-BOOLEAN
-ata_power_mode(
- int bus_id,
- int dev_id,
- int power_mode
- )
-{
- char dev_name[64];
- HANDLE h;
- ULONG status;
- ULONG returned;
- SCSI_ADDRESS addr;
- CDB cdb;
- SENSE_DATA senseData;
-
- if(dev_id == -1) {
- return FALSE;
- }
- if(!power_mode) {
- return TRUE;
- }
-
- sprintf(dev_name, "\\\\.\\Scsi%d:", bus_id);
- h = ata_open_dev(dev_name);
- if(!h)
- return FALSE;
- addr.PortNumber = bus_id;
- addr.PathId = (UCHAR)(dev_id >> 16);
- addr.TargetId = (UCHAR)(dev_id >> 8);
- addr.Lun = (UCHAR)(dev_id);
-
- memset(&cdb, 0, sizeof(cdb));
- cdb.START_STOP.OperationCode = SCSIOP_START_STOP_UNIT;
- cdb.START_STOP.Immediate = 1;
- cdb.START_STOP.PowerConditions = power_mode;
- cdb.START_STOP.Start = (power_mode != StartStop_Power_Sleep);
-
- printf("Changing power state to ...\n");
-
- status = ata_send_scsi(h, &addr, &cdb, 6,
- NULL, 0, FALSE,
- &senseData, &returned);
- ata_close_dev(h);
- return TRUE;
-} // end ata_power_mode()
-
int
ata_num_to_x_dev(
char a
char* argv[]
)
{
- //ULONG Flags = 0;
+ ULONG Flags = 0;
int i, j;
char a;
int bus_id = -1;
int mode=-1;
int list_bb=0;
int persistent_hide=0;
- int power_mode=StartStop_Power_NoChg;
printf("Console ATA control utility for Windows NT3.51/NT4/2000/XP/2003\n"
"Version 0." UNIATA_VER_STR ", Copyright (c) Alexander A. Telyatnikov, 2003-2012\n"
if(!argv[i])
continue;
if((a = argv[i][0]) != '-') {
- for(j=0; (a = argv[i][j]); j++) {
+ for(j=0; a = argv[i][j]; j++) {
switch(a) {
case 'a' :
case 's' :
g_bb_list=argv[i];
j = strlen(argv[i])-1;
break;
- case 'p' :
- if(cmd && (cmd != CMD_ATA_FIND) && (cmd != CMD_ATA_HIDE)) {
- print_help();
- }
- switch(argv[i][j+1]) {
- case '0':
- case 'a':
- // do nothing
- break;
- case '1':
- case 'i':
- power_mode = StartStop_Power_Idle;
- break;
- case '2':
- case 's':
- power_mode = StartStop_Power_Standby;
- break;
- case '3':
- case 'p':
- power_mode = StartStop_Power_Sleep;
- break;
- default:
- j--;
- }
- j++;
- if(power_mode && !cmd) {
- cmd = CMD_ATA_POWER;
- }
- break;
- case 'D' :
- power_mode = StartStop_Power_Sleep;
- if(cmd && (cmd != CMD_ATA_HIDE)) {
- print_help();
- }
case 'd' :
- if(cmd && (cmd != CMD_ATA_FIND) && (cmd != CMD_ATA_HIDE) && (cmd != CMD_ATA_POWER)) {
+ if(cmd && (cmd != CMD_ATA_FIND) && (cmd != CMD_ATA_HIDE)) {
print_help();
}
- if(!cmd) {
- cmd = CMD_ATA_HIDE;
- }
i++;
if(!argv[i]) {
print_help();
ata_scan(bus_id, dev_id, lock, persistent_hide);
} else
if(cmd == CMD_ATA_HIDE) {
- ata_hide(bus_id, dev_id, lock, persistent_hide, power_mode);
+ ata_hide(bus_id, dev_id, lock, persistent_hide);
} else
if(cmd == CMD_ATA_BBLK) {
ata_bblk(bus_id, dev_id, list_bb);
- } else
- if(cmd == CMD_ATA_POWER) {
- ata_power_mode(bus_id, dev_id, power_mode);
} else {
print_help();
}