//#include "mutant1.h" #include "windows.h" #include #include "Cfgmgr32.h" #include #include "Ntddscsi.h" #include #include #include //for _getch() #include using namespace std; //Ntddstor.h нет в сдк, а ддк подключать - не его нах, он исруцца меж собой typedef enum _STORAGE_PROPERTY_ID { StorageDeviceProperty = 0, StorageAdapterProperty, StorageDeviceIdProperty, StorageDeviceUniqueIdProperty, StorageDeviceWriteCacheProperty, StorageMiniportProperty, StorageAccessAlignmentProperty, StorageDeviceSeekPenaltyProperty, StorageDeviceTrimProperty, StorageDeviceWriteAggregationProperty } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; typedef enum _STORAGE_QUERY_TYPE { PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; typedef struct _STORAGE_PROPERTY_QUERY { STORAGE_PROPERTY_ID PropertyId; STORAGE_QUERY_TYPE QueryType; UCHAR AdditionalParameters[1]; } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) #define cmd_ReadSector10 0x28 #define cmd_Inquiry 0x12 #define errfunc(x, y) {cout << x << y; \ _getch();\ return; \ } const GUID USBINT_GUID = {0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}; //GUID_DEVINTERFACE_USB_DEVICE const wchar_t* VID_PID_DEVICE = L"vid_5588&pid_0013"; const wchar_t* STR_FOR_FIND = L"STORAGE\\REMOVABLEMEDIA\\"; const wchar_t* PATH_MOUNTVOL = L"SYSTEM\\MountedDevices\\"; const wchar_t* DOSDEV_NAME = L"\\DOSDEVICES\\"; void main() { HDEVINFO hDeviceList = INVALID_HANDLE_VALUE; //хэндл на список устройств SP_DEVINFO_DATA Devinfo; //инфа об устройстве из SetupDiEnumDeviceInfo DWORD errCode = 0, tmpsize = 0, tmpsize2 = 0, valtype = 0, countDev = 0; wchar_t wcStrTmp[512+1] = {0}; wchar_t wcStrTmp2[512+1] = {0}; wchar_t wcSerial[16+1] = {0}; wstring wsStrTmp; vector vData; DEVINST devInstParent = 0; //для хождений по иерархии с пом. CM_.. CONFIGRET ret_f = 0; BOOL b = FALSE; HKEY hKey = NULL; hDeviceList = SetupDiGetClassDevs(&USBINT_GUID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); //получаем список if(hDeviceList == INVALID_HANDLE_VALUE) errfunc("error! SetupDiGetClassDevs - ", GetLastError()) for (countDev = 0; countDev < 1000;) { memset(&Devinfo, 0, sizeof(SP_DEVINFO_DATA)); Devinfo.cbSize = sizeof(SP_DEVINFO_DATA); // Нужно установить. if (!SetupDiEnumDeviceInfo(hDeviceList, countDev, &Devinfo)) //Получаем информацию об очередном устройстве из списка. { errCode = GetLastError(); if(errCode == ERROR_NO_MORE_ITEMS) break; else errfunc("error! SetupDiEnumDeviceInfo - ", errCode) } //получаем строку с vidpid if ( !SetupDiGetDeviceRegistryProperty(hDeviceList, &Devinfo, SPDRP_HARDWAREID, NULL, (byte*)wcStrTmp, sizeof(wcStrTmp), &tmpsize) ) { if(!SetupDiDeleteDeviceInfo(hDeviceList, &Devinfo)) countDev++; continue; //пробуем следующее по списку } _wcslwr_s(wcStrTmp, 512); //в нижний регистр if(wcsstr(wcStrTmp, VID_PID_DEVICE) == NULL) //ищем наше устройство (по vidpid) { if(!SetupDiDeleteDeviceInfo(hDeviceList, &Devinfo)) countDev++; //если не нашли, то идем за следующим continue; } else { b = TRUE; //нашли b = SetupDiGetDeviceInstanceId(hDeviceList, &Devinfo, wcStrTmp, 512, &tmpsize); //сдесь виден серийник устройства if(b) { wsStrTmp = wcStrTmp; //с string будет удобнее и проще wsStrTmp = wsStrTmp.substr(wsStrTmp.rfind(L'\\') + 1); //откусываем серийник и сохраняем wcscpy_s(wcSerial, 17, wsStrTmp.c_str()); } break; } }//for if(!b) { cout << "no device"; _getch(); return; } else b = FALSE; for (int i = 0; i < 100; i++) //цикл для child { if(i == 0) ret_f = CM_Get_Child(&devInstParent, Devinfo.DevInst, 0); //идем вверх else ret_f = CM_Get_Child(&devInstParent, devInstParent, 0); //идем вверх if(ret_f != CR_SUCCESS) break; ret_f = CM_Get_Device_ID(devInstParent, wcStrTmp, 512, 0); if(ret_f != CR_SUCCESS) break; wcscpy_s(wcStrTmp2, wcStrTmp); _wcsupr_s(wcStrTmp2, 512); // в верхний регистр if(wcsstr(wcStrTmp2, STR_FOR_FIND) == NULL) //ищем нужный уровень по device tree continue; else { wsStrTmp = wcStrTmp; //с string будет удобнее и проще wsStrTmp = wsStrTmp.substr(wsStrTmp.rfind(L'\\') + 1); //откусываем рандомный id или как его там.. тома и сохраняем b = TRUE; } }//for if(!b) { cout << "error cm_.. - " << ret_f; _getch(); return; } else b = FALSE; SetupDiDeleteDeviceInfo(hDeviceList, &Devinfo); //удолим нах SetupDiDestroyDeviceInfoList(hDeviceList); //delete errCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\MountedDevices\\", 0, KEY_READ, &hKey); //открыли MountedDevices PATH_MOUNTVOL if(errCode != ERROR_SUCCESS) errfunc("error! RegOpenKeyEx - ", errCode) for(countDev = 0; ; countDev++) //перечисляем параметры { vData.assign(2048, 0); tmpsize2 = static_cast(vData.size()); tmpsize = 512; errCode = RegEnumValue(hKey, countDev, wcStrTmp, &tmpsize, NULL, &valtype, &vData[0], &tmpsize2); if(errCode != ERROR_SUCCESS && errCode != ERROR_NO_MORE_ITEMS) { RegCloseKey(hKey); errfunc("error! RegEnumValue - ", errCode) } else if(errCode == ERROR_NO_MORE_ITEMS) break; _wcsupr_s(wcStrTmp, 512); //в верхний регистр if(wcsstr(wcStrTmp, DOSDEV_NAME) == NULL) //ищем \DosDevice\x continue; else {//нашли, сейчас поищем в data наш "id" и, если найдем - сохраняем букву _wcsupr_s(reinterpret_cast(&vData[0]), tmpsize2*sizeof(wchar_t)); //в верхний регистр if(wcsstr(reinterpret_cast(&vData[0]), wsStrTmp.c_str()) == NULL) continue; else { wsStrTmp = wcStrTmp; wsStrTmp = wsStrTmp.substr(wsStrTmp.rfind(L'\\') + 1); //откусываем x: break; } }//find dosdevice }//for RegCloseKey(hKey); //буква диска найдена, серийник есть, все хэндлы за собой позакрывал - потыкаемся в устройство по spti.. wsStrTmp.insert(0, L"\\\\.\\"); //такой путь нужен для spti , либо L"\\\\.\\PhysicalDrive1" но его я не нашел //с пом-ю volume functions мона получить L"\\\\.\\Device\\Harddisk1\\DP(1)0-0+9\\ но по нему кажись не работало и толку от него..? struct scsi_st { SCSI_PASS_THROUGH_DIRECT t_spti; DWORD tmp; byte sensebuf[32]; } myspti; vData.assign(512, 0); memset(&myspti, 0, sizeof(scsi_st)); myspti.t_spti.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); myspti.t_spti.Lun = 0; myspti.t_spti.TargetId = 0; myspti.t_spti.PathId = 0; myspti.t_spti.CdbLength = 10; myspti.t_spti.DataIn = SCSI_IOCTL_DATA_IN; myspti.t_spti.SenseInfoLength = 32; myspti.t_spti.SenseInfoOffset = sizeof(SCSI_PASS_THROUGH_DIRECT) + sizeof(DWORD); myspti.t_spti.TimeOutValue = 10; //2 myspti.t_spti.DataTransferLength = 512; myspti.t_spti.DataBuffer = &vData[0]; myspti.t_spti.Cdb[0] = cmd_ReadSector10; //command myspti.t_spti.Cdb[1] = 0; myspti.t_spti.Cdb[2] = 0; //addr 3 myspti.t_spti.Cdb[3] = 0; //addr 2 myspti.t_spti.Cdb[4] = 0; //addr 1 myspti.t_spti.Cdb[5] = 0; //addr 0 myspti.t_spti.Cdb[6] = 0; myspti.t_spti.Cdb[7] = 0; //length data (in sectors) 1 myspti.t_spti.Cdb[8] = 0x01; //length data (in sectors) 0 - один сектор читаем myspti.t_spti.Cdb[9] = 0; // QueryDosDevice(L"K:", wcStrTmp, 512); //L"\\\\.\\PhysicalDrive1" L"\\\\.\\Device\\Harddisk1\\DP(1)0-0+9" HANDLE hDevice = CreateFile(wsStrTmp.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == INVALID_HANDLE_VALUE) errfunc("error! CreateFile - ", GetLastError()) tmpsize = 0; if(!DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT, &myspti, sizeof(scsi_st), &myspti, sizeof(scsi_st), &tmpsize, NULL)) errfunc("error! DeviceIoControl - ", GetLastError()) memset(&myspti, 0, sizeof(scsi_st)); myspti.t_spti.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); myspti.t_spti.CdbLength = 10; myspti.t_spti.DataIn = SCSI_IOCTL_DATA_IN; myspti.t_spti.SenseInfoLength = 32; myspti.t_spti.SenseInfoOffset = sizeof(SCSI_PASS_THROUGH_DIRECT) + sizeof(DWORD); myspti.t_spti.TimeOutValue = 10; //2 myspti.t_spti.DataTransferLength = 512; myspti.t_spti.DataBuffer = &vData[0]; myspti.t_spti.Cdb[0] = cmd_Inquiry; //command tmpsize = 0; if(!DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT, &myspti, sizeof(scsi_st), &myspti, sizeof(scsi_st), &tmpsize, NULL)) errfunc("error! DeviceIoControl 2 - ", GetLastError()) CloseHandle(hDevice); _getch(); }