Консультация № 137880
26.05.2008, 19:58
50.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты!
Необходимо написать программу, которая определит параметры (всё стандартно - ёмкость, свободное пространство, тип носителя, метка тома, файловая система и др.) всех жёстких дисков системы (пробежаться можно по IDE только устройствам - но если есть возможность проанализировать и Sata, было бы идеально, но это не обязательно).
Написать нужно в С++ либо Delphi, со вставками, где это необходимо, asm кода. Комментарии.

Обсуждение

давно
Посетитель
7438
7205
27.05.2008, 16:49
общий
это ответ
Здравствуйте, Mirimas!
В приложении консольная программа, которая показывает
информацию по всем дискам

Приложение:
//drive.cpp#include <windows.h>#include <winnetwk.h>#include <stdio.h>#include <stdlib.h>#include <conio.h>#include "drive.h"#pragma comment(lib,"mpr.lib")char szNetName[NETNAMELEN];UNIVERSAL_NAME_INFO uni;DWORD GetDriveInfo(char Drive, PDRIVEDATA pdd){ char Path[4]; BOOL fOk; DWORD NetNameLen; //Длина запроса при получении сетевого имени //Сформируем корневой путь устройства Path[0]=Drive; Path[1]=‘:‘; Path[2]=‘\\‘; Path[3]=0; //Получим тип диска: //DRIVE_REMOVABLE The disk can be removed from the drive. //DRIVE_FIXED The disk cannot be removed from the drive. //DRIVE_REMOTE The drive is a remote (network) drive. //DRIVE_CDROM The drive is a CD-ROM drive. //DRIVE_RAMDISK The drive is a RAM disk. pdd->DriveType = GetDriveType((char*)Path); //Тип диска if (pdd->DriveType < DRIVE_REMOVABLE) return RET_NO; //Нет дисковода с такой буквой //Запросим емкость диска fOk = GetDiskFreeSpace( Path, //Корневой путь устройства &pdd->SectPCluster, //Секторов на кластер &pdd->BytesPSect, //Байтов на сектор &pdd->FreeClusters, //Число свободных кластеров &pdd->TotalClusters); //Общее число кластеров if (fOk) { __asm { //Посчитаем общую ёмкость диска mov ecx, pdd mov eax, [ecx+4] //TotalClusters imul dword ptr[ecx+16] //SectPCluster push edx imul dword ptr[ecx+12] //BytesPSect mov [ecx+20],eax //Предварительно сохраним Total mov [ecx+24],edx pop eax imul dword ptr[ecx+12] //BytesPSect adc [ecx+24],eax //Добавим к результату Total //Посчитаем общий свободный объём mov eax, [ecx+8] //FreeClusters imul dword ptr[ecx+16] //SectPCluster push edx imul dword ptr[ecx+12] //BytesPSect mov [ecx+28],eax //Предварительно сохраним TotalFree mov [ecx+32],edx pop eax imul dword ptr[ecx+12] //BytesPSect adc [ecx+32],eax //Добавим к результату TotalFree } //Запросим информацию о томе fOk = GetVolumeInformation( Path, //Корневой путь устройства pdd->VolName, //Имя тома VOLNAMELEN, //Длина имени тома &pdd->VolSerial, //Серийный номер &pdd->VolMaxFileLen, //Максимальная длина имен файлов &pdd->VolSysFlags, //Флаги файловой системы pdd->VolFSName, //Имя файловой системы (FAT, NTFS...) VOLFSNAMELEN); if (fOk) { //Для сетевого диска опросим сетевое имя NetNameLen = NETNAMELEN; uni.lpUniversalName = szNetName; pdd->NetName[0]=0; if (DRIVE_REMOTE == pdd->DriveType) { if(NO_ERROR == WNetGetUniversalName( Path, //Корневой путь устройства UNIVERSAL_NAME_INFO_LEVEL, //Тип запрашиваемой информации &uni, //Сетевое имя &NetNameLen)) //Длина запроса при получении сетевого имени { lstrcpy(pdd->NetName, szNetName); } } } } if (fOk) return RET_OK; else return RET_DISK_NO;}int main(){ char *type[5] = {"Removable","Fixed","Network","CD-ROM","RamDisk"}; DRIVEDATA DriveData; char chDisk; char sz[32]; DWORD dwRet; for (chDisk=‘A‘; chDisk<=‘Z‘; chDisk++) { dwRet = GetDriveInfo(chDisk, &DriveData); if (RET_NO != dwRet) { printf("„ЁбЄ %c:\n",chDisk); //Диск printf("’ЁЇ ­®бЁвҐ«п: %s\n",type[DriveData.DriveType-2]); //Тип носителя if (RET_OK == dwRet) { printf("…¬Є®бвм: %s Ў ©в\n",_ui64toa(DriveData.Total,sz,10)); //Емкость printf("‘ў®Ў®¤­®: %s Ў ©в\n",_ui64toa(DriveData.TotalFree,sz,10)); //Свободно printf("?¬п д ©«®ў®© бЁб⥬л: %s\n",DriveData.VolFSName); //Имя файловой системы printf("Њ ЄбЁ¬ «м­ п ¤«Ё­  Ё¬Ґ­ д ©«®ў: %d\n",DriveData.VolMaxFileLen); //Максимальная длина имен файлов printf("‘ҐаЁ©­л© ­®¬Ґа ⮬ : %4.4x\n",DriveData.VolSerial); //Серийный номер тома printf("ЊҐвЄ  ⮬ : %s\n",DriveData.VolName); //Метка тома if (DRIVE_REMOTE == DriveData.DriveType) printf("‘ҐвҐў®Ґ Ё¬п ⮬ : %s\n",DriveData.NetName); } else printf("ЌҐв ­®бЁвҐ«п\n"); printf("\n"); } } getch(); return 0;}//drive.h#define VOLFSNAMELEN 16 //Длина имени файловой системы#define VOLNAMELEN 16 //Длина имени тома#define NETNAMELEN 32 //Длина сетевого имени#define RET_NO 0 //Отсутствует дисковод#define RET_OK 1 //Все ок#define RET_DISK_NO 2 //Отсутствует диск в дисководе#pragma pack(1)typedef struct _DriveData{ DWORD DriveType; //Тип устройства DWORD TotalClusters; //Общее число кластеров DWORD FreeClusters; //Число свободных кластеров DWORD BytesPSect; //Байтов на сектор DWORD SectPCluster; //Секторов на кластер __int64 Total; //Общая емкость __int64 TotalFree; //Всего свободно char VolFSName[VOLFSNAMELEN]; //Имя файловой системы (FAT, NTFS...) DWORD VolSysFlags; //Флаги файловой системы DWORD VolMaxFileLen; //Максимальная длина имен файлов DWORD VolSerial; //Серийный номер тома char VolName[VOLNAMELEN]; //Имя тома char NetName[NETNAMELEN]; //Сетевое имя} DRIVEDATA, *PDRIVEDATA;
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
27.05.2008, 18:50
общий
Спасибо Вам большое ещё раз.Разобрался, только билдер 6 жалуется на то, что не может открыть mpr.lib Залез в папку lib, там не оказалась такой библиотеки, где взять?
давно
Посетитель
7438
7205
28.05.2008, 09:56
общий
mpr.lib - библиотека импорта для mpr.dllНужна для функции <b>WNetGetUniversalName</b>,которая запрашивает сетевое имя тома.Если этого не делать, то она и не нужна.Взять можно <a href=http://rusfaq.ru/upload/729>здесь</a>.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
28.05.2008, 19:16
общий
Вывел ошибки:Build [Linker Error] ‘C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\MPR.LIB‘ contains invalid OMF record, type 0x21 (possibly COFF)
давно
Посетитель
7438
7205
28.05.2008, 19:46
общий
Да уж, формат у них, действительно разный...В таком случае просто убери строку#pragma comment(lib,"mpr.lib")Ссылка на WNetGetUniversalName есть в import32.lib,которая, наверняка, подключается автоматом...PS Кстати, мог бы и самостоятельно поискать в lib-ах и просмотреть HEX-редактором ...Я builder-ом практически не пользуюсь, пришлось искать, чтобы посмотреть...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
28.05.2008, 19:51
общий
Всё спасибо огромное
Форма ответа