#include #include #include #include #include #include #include typedef struct { STORAGE_DEVICE_DESCRIPTOR sdd ; UCHAR buffer[1000] ; //てきとー } STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER ; void test2(int num) { char szDrive[MAX_PATH] ; sprintf(szDrive, "\\\\.\\PhysicalDrive%d", num) ; HANDLE hDrive = CreateFile(szDrive, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL) ; if (INVALID_HANDLE_VALUE != hDrive) { { // 型番とか STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER sddwb ; DWORD dwRetBytes = 0 ; STORAGE_PROPERTY_QUERY spq ; spq.PropertyId = StorageDeviceProperty ; spq.QueryType= PropertyStandardQuery ; if (DeviceIoControl(hDrive, IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), &sddwb, sizeof(sddwb), &dwRetBytes, 0)) { printf("VendorId = \"%s\"\n", sddwb.sdd.VendorIdOffset? &((char*)&sddwb.sdd)[sddwb.sdd.VendorIdOffset] : "NULL") ; printf("ProductId = \"%s\"\n", sddwb.sdd.ProductIdOffset ? &((char*)&sddwb.sdd)[sddwb.sdd.ProductIdOffset] : "NULL" ) ; printf("ProductRevision = \"%s\"\n", sddwb.sdd.ProductRevisionOffset ? &((char*)&sddwb.sdd)[sddwb.sdd.ProductRevisionOffset] : "NULL" ) ; printf("SerialNumber = \"%s\"\n", sddwb.sdd.SerialNumberOffset ? &((char*)&sddwb.sdd)[sddwb.sdd.SerialNumberOffset] : "NULL" ) ; } else { DWORD dwLastError = GetLastError() ; } } { // SMART STORAGE_PREDICT_FAILURE spf ; DWORD dwRetBytes ; if (DeviceIoControl(hDrive, IOCTL_STORAGE_PREDICT_FAILURE, &spf, sizeof(spf), &spf, sizeof(spf), &dwRetBytes, NULL)) { printf("PredictFailure = %08x\n", spf.PredictFailure) ; for (int i=0; i<360/12; i++) { for (int j=0; j<12; j++) { printf("%02x ", spf.VendorSpecific[2+12*i+j]) ; } printf("\n") ; } } else { DWORD dwLastError = GetLastError() ; } } CloseHandle(hDrive) ; } } int main(int argc, char* argv[]) { if (2 == argc) { test2(atoi(argv[1])) ; } return 0; }