Я новичок в программировании, так что не будь грубым ^^ ..
Я разрабатываю программу, которая будет использоваться для управления запоминающими устройствами.На Windows Xp и Windows 7.
Я уже сделал менеджер XP.И для этого я использовал эту функцию: Буква диска для идентификатора экземпляра устройства
Я пытаюсь понять, что делает эта функция .. Но напрасно .. Как я уже говорил,я новичок, и я не нашел ни одного учебника по этому поводу.
Итак, вот моя проблема: я использовал эту функцию для Windows XP, как вы можете видеть:
int _tmain(int argc, _TCHAR* argv[])
{
//char id_voulue[TAILLE_MAX2]= "USBSTOR\DISK&VEN_KINGSTON&PROD_READER__MICSD/M2&REV_0200\AA00000000135539&1";
WCHAR cDrive;
LPSTR dev_ID = "USBSTOR\\DISK&VEN_GENERIC-&PROD_COMPACT_FLASH&REV_1.01\\9&19571B1B&0&058F63646476&1"/*USBSTOR\\DISK&VEN_KINGSTON&PROD_READER_____SD/MS&REV_0200\\AA00000000135539&0"*/;
int code_erreur = 0;
//id_voulue[strlen(id_voulue) - 1] = 0x00;
//dev_ID = id_voulue;
if(!GetAllRemovableDisks())
{
code_erreur = -1 ;
}
cDrive = GetSpecificDrive(dev_ID);
printf("L'ID est : %s \n", dev_ID);
printf("La lettre correspondante est : %c \n", cDrive);
puts("\n\n");
system("pause");
return 0;
}
// My functions
struct tagDrives
{
WCHAR letter;
WCHAR volume[BUFFER_SIZE];
}g_drives[26];
BOOL GetAllRemovableDisks()
{
WCHAR caDrive[4];
WCHAR volume[BUFFER_SIZE];
int nLoopIndex;
DWORD dwDriveMask;
UINT g_count;
caDrive[0] = 'A';
caDrive[1] = ':';
caDrive[2] = '\\';
caDrive[3] = 0;
g_count = 0;
// Get all drives in the system.
dwDriveMask = GetLogicalDrives();
if(dwDriveMask == 0)
{
puts("Error - GetLogicalDrives failed\n");
return FALSE;
}
// Loop for all drives (MAX_DRIVES = 26)
for(nLoopIndex = 0; nLoopIndex< MAX_DRIVES; nLoopIndex++)
{
// if a drive is present,
if(dwDriveMask & 1)
{
caDrive[0] = 'A' + nLoopIndex;
// If a drive is removable
if(GetDriveType(caDrive) == DRIVE_REMOVABLE)
{
//Get its volume info and store it in the global variable.
if(GetVolumeNameForVolumeMountPoint(caDrive, volume, BUFFER_SIZE))
{
g_drives[g_count].letter = caDrive[0];
wcscpy(g_drives[g_count].volume, volume);
g_count ++;
}
}
}
dwDriveMask >>= 1;
}
// success if atleast one removable drive is found.
if(g_count == 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
WCHAR GetSpecificDrive(LPSTR lpDevID)
{
HDEVINFO hDevInfo;
GUID guid;
BYTE buffer[BUFFER_SIZE];
DWORD dwRequiredSize ;
WCHAR buf[BUFFER_SIZE];
DEVINST devInstParent;
DWORD dwIndex;
WCHAR volume[BUFFER_SIZE];
UINT nLength,nLoopIndex,g_count;
g_count = 26;
SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVINFO_DATA devInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail;
if(!lpDevID)
{
return 0;
}
// GUID_DEVINTERFACE_VOLUME is interface Guid for Volume class devices.
guid = GUID_DEVINTERFACE_VOLUME;
// Get device Information handle for Volume interface
hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL,
DIGCF_DEVICEINTERFACE |
DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE)
{
puts("Error - SetupDiGetClassDevs failed\n");
return 0;
}
// Loop until device interfaces are found.
for(dwIndex = 0; ;dwIndex ++)
{
ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
devInterfaceData.cbSize = sizeof(devInterfaceData);
// Get device Interface data.
if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex,&devInterfaceData))
{
break;
}
ZeroMemory(&devInfoData, sizeof(devInfoData));
devInfoData.cbSize = sizeof(devInfoData);
pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// Get device interface detail data to get
// Device Instance from SP_DEVINFO_DATA and
// Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA
SetupDiGetDeviceInterfaceDetail(hDevInfo,
&devInterfaceData,
pDevDetail, // SP_DEVICE_INTERFACE_DETAIL_DATA
BUFFER_SIZE,
&dwRequiredSize,
&devInfoData); // SP_DEVINFO_DATA
// Get the device instance of parent. This points to USBSTOR.
CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0);
CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0);
// Get the device instance of grand parent. This points to USB root.
CM_Get_Parent(&devInstParent,devInstParent, 0);
// Get the device ID of the USB root.
//CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0);
// If USB root device matches with the input device ID, it is the target
//device.
if( buf != NULL && compare(lpDevID,buf)==0)
{
// Append \ to the DevicePath of SP_DEVICE_INTERFACE_DETAIL_DATA
if(lpDevID[50] == buf[50] && lpDevID[55] == buf[55] && lpDevID[60] == buf[60])
{
nLength = wcslen(pDevDetail->DevicePath);
pDevDetail->DevicePath[nLength] = '\\';
pDevDetail->DevicePath[nLength] = '\\';
pDevDetail->DevicePath[nLength+1] = 0;
// Get Volume mount point for the device path.
if(GetVolumeNameForVolumeMountPoint(pDevDetail->DevicePath, volume, BUFFER_SIZE))
{
for(nLoopIndex=0; nLoopIndex< g_count; nLoopIndex++)
{
// Compare volume mount point with the one stored earlier.
// If both match, return the corresponding drive letter.
if(wcscmp(g_drives[nLoopIndex].volume, volume)==0)
{
SetupDiDestroyDeviceInfoList(hDevInfo);
return g_drives[nLoopIndex].letter;
}
}
}
}
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
puts("Error - No drives found in GetSpecificDrives\n");
return 0;
}
UINT compare(LPSTR lpDevID,WCHAR* buf)
{
UINT nombre_caractere1,
confirmation = 0,
i = 0;
nombre_caractere1 = strlen(lpDevID);
for(i=1 ; i <= nombre_caractere1 ; i++)
{
if(lpDevID[i]==buf[i])
{
confirmation += 1;
}
}
if(confirmation == nombre_caractere1)
{
return 0;
}
else
{
return -1;
}
}
Таким образом, этот код прекрасно работает на XP, но не на Windows Seven ... Кажется, что мы не начинаем в нужном месте в базе регистров.Во время моего сравнения я вижу, что моя переменная "buf" равна "HTREE \ ROOT \ 0", во втором цикле "buf" = "ACPI \ PNP0A08 \ 0", и до конца я снова вижу "buf"= "HTREE \ ROOT \ 0" ..
Может кто-нибудь объяснить мне, что происходит?Я действительно пытался понять.Я был на MSDN много, но, возможно, я глуп, потому что я не понимаю.