по порядковому номеру можно получить функциями
FindFirstVolume
FindNextVolume
возможно как то так:
Код: Выделить всё
hdf=FindFirstVolume((LPTSTR)str,255);
if(hdf!=INVALID_HANDLE_VALUE){
do cout<<str<<endl;
while(FindNextVolume(hdf,(LPTSTR)str,255)!=0);
FindVolumeClose(hdf);
}
функцией GetLogicalDrives можно получить набор бит,в котором 1 значит что соответствующая букваиспользуется типа:
1001... соответствует что A используется B,C - несипользуются D - используется.
Затем функцией GetVolumeNameForVolumeMountPoint можно получить имя тома соответствующей бувкы, буква передается первым параметром ввиде" D:\",наверно как то так:
Код: Выделить всё
name = GetLogicalDrives();
for(i = 0;i < 26;i++){
if(((name>>i)&1)){
str0[0]=65+i;
str0[1] = ':';
str0[2] = '\\';
str0[3] = 0;
GetVolumeNameForVolumeMountPoint((LPTSTR)str0,(LPTSTR)str,255);
cout <<str0[0]<<" "<<str<<endl;
}
}
надо сравнить имя тома котрое получено функциями FindFirstVolume, FindNextVolume с именем полученным от GetVolumeNameForVolumeMountPoint - в первом случае имена идут по порядку,во втором они привязаны к логическим именам, значит можно получить соотвествие логического имени и номера.Записать в файл думаю непроблема. Про
определенного жесткого диска возможно можно определить по имени тома(неуверен тут)
Вот вобщем кое-что:
Код: Выделить всё
#include "windows.h"
#include <iostream>
#define _WIN32_WINNT 0x0500
using std::cout;
using std::endl;
HANDLE (WINAPI * FindFirstVolume )(LPTSTR,DWORD);
BOOL (WINAPI * FindNextVolume )(HANDLE,LPTSTR,DWORD);
BOOL (WINAPI * FindVolumeClose )(HANDLE);
BOOL (WINAPI * GetVolumeNameForVolumeMountPoint)(LPCTSTR,LPTSTR,DWORD);
int main(){
HANDLE hdf;
HMODULE hmod;
DWORD name;
int i,n,j;
char str[26][255],str1[26][255];
char str0[26][4];
if((hmod = LoadLibrary(TEXT("Kernel32.dll")))){
FindFirstVolume =(HANDLE(WINAPI *)(LPTSTR,DWORD)) GetProcAddress(hmod,"FindFirstVolumeA");
FindNextVolume =(BOOL (WINAPI *)(HANDLE,LPTSTR,DWORD))GetProcAddress(hmod,"FindNextVolumeA");
FindVolumeClose =(BOOL (WINAPI *)(HANDLE)) GetProcAddress(hmod,"FindVolumeClose");
GetVolumeNameForVolumeMountPoint = (BOOL(WINAPI *)(LPCTSTR,LPTSTR,DWORD))
GetProcAddress(hmod,"GetVolumeNameForVolumeMountPointA");
if(!(FindFirstVolume&&FindNextVolume&&FindVolumeClose&&GetVolumeNameForVolumeMountPoint)){
cout<<"error Load from kernel32.dll"<<endl;
return 2;
}
/////////////////////////////////
hdf=FindFirstVolume((LPTSTR)str[(n=0)],255);
if(hdf!=INVALID_HANDLE_VALUE){
do
cout<<str[n]<<endl;
while(FindNextVolume(hdf,(LPTSTR)str[++n],255)!=0);
FindVolumeClose(hdf);
}
else{
cout<<"Error FindFirstVolume"<<endl;
return 3;
}
/////////////////////////////////
name = GetLogicalDrives();
for(i=j=0;i<26;i++){
if(((name>>i)&1)){
str0[j][0]=65+i;
str0[j][1]=':';
str0[j][2]='\\';
str0[j][3]=0;
GetVolumeNameForVolumeMountPoint((LPTSTR)str0[j],(LPTSTR)str1[j],255);
cout<<str0[j][0]<<" "<<str1[j]<<endl;
j++;
}
}
}
else{
cout<<"error Load kernel32.dll"<<endl;
return 1;
}
return 0;
}
написано криво тока поди ))