Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2008, 17:48   #1
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию Серийный номер физ. диска

Подскажите пожалуйста как можно узнать серийник физического диска(винта,флешки), не раздела, а "Железа".
Jupiter вне форума Ответить с цитированием
Старый 29.04.2008, 18:01   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Кинь на форму Label1 и по нажатию кнопки:
Код:
var
 pathname:pchar;
 serial:dword;
 maxpath:dword;
 sysflags:dword;
 sizebuf:pchar;
begin
  sizebuf:='';
  sysflags:=0;
  maxpath:=0;
  pathname:=pchar('C:\');// Вместо 'C:\' всталяешь нужный диск
  getvolumeinformation(pathname, nil, MAX_PATH+1, @serial, maxpath,   sysflags, sizebuf, sizeof(sizebuf));
  label1.caption:=inttohex(hiword(serial), 4) + '-' + inttohex(loword(serial), 4)
end;
Карп преодолевший водопад становится драконом.

Последний раз редактировалось N!ckeL; 29.04.2008 в 18:04.
N!ckeL вне форума Ответить с цитированием
Старый 02.05.2008, 14:37   #3
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Это ведь серийный номер раздела, т.е. дисков C,D,E и т.д.
А нужен серийный номер Физического диска, того, на котором
находятся разделы C,D,E.
Если вместо
pathname:=pchar('C:\');
написать
pathname:=pchar('\\.\PHYSICALDRIVE0 ');
То getvolumeinformation возвращает ошибку.

Я как- то встречал программы которые выводили именно этот
серийный номер(для '\\.\PHYSICALDRIVE0'), а не серийный номер раздела.
А из Delphi его можно получить?

Последний раз редактировалось mihali4; 29.11.2009 в 19:49.
Jupiter вне форума Ответить с цитированием
Старый 02.05.2008, 18:23   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Jupiter, если Вас не пугает C, посмотрите вот здесь... Ну а как на дельфи с этим вопросом... не знаю. В принципе там просто несколько вызовов DeviceIoControl и определение нескольких типов и констант...
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 01:02   #5
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Спасибо B_N за ссылку, это хоть что- то.
Хотя C я, можно сказать, совсем незнаю, а понимаю только тот
код, который хоть немного похож на паскаль.
Выбора у меня нет, поэтому я начал переводить из C на паскаль.
Поскольку понятно далеко не всё, помогите пожалуйста перевести.

На сколько мне показалось, именно этот код выводит инфо о диске.
Вот код который я перевёл:
Код:
Type
GETVERSIONINPARAMS = Record
bVersion,               // Binary driver version.
bRevision,              // Binary driver revision.
bReserved,              // Not used.
bIDEDeviceMap : Byte;   // Bit map of IDE devices.
fCapabilities : Cardinal;          // Bit mask of driver capabilities.
dwReserved : array [0..4] Of Cardinal;
end;

IDEREGS = Record
bFeaturesReg,       // Used for specifying SMART "commands".
bSectorCountReg,    // IDE sector count register
bSectorNumberReg,   // IDE sector number register
bCylLowReg,         // IDE low order cylinder value
bCylHighReg,        // IDE high order cylinder value
bDriveHeadReg,      // IDE drive/head register
bCommandReg,        // Actual IDE command.
bReserved : Byte;          // reserved for future use.  Must be zero.
end;

PSENDCMDINPARAMS = ^SENDCMDINPARAMS;
SENDCMDINPARAMS = Record
cBufferSize : Cardinal;   //  Buffer size in bytes
irDriveRegs : IDEREGS;    //  Structure with drive register values.
bDriveNumber : Byte;       //  Physical drive number to send
                            //  command to (0,1,2,3).
bReserved : array [0..3] Of Byte;       //  Reserved for future expansion.
dwReserved : array [0..4] Of Cardinal; //  For future use.
bBuffer : array [0..1] Of Byte;    //  Input buffer.
end;

IDENTIFY_DATA = Record
GeneralConfiguration : Shortint;            // 00 00
NumberOfCylinders : Shortint;               // 02  1
Reserved1 : Shortint;                       // 04  2
NumberOfHeads : Shortint;                   // 06  3
UnformattedBytesPerTrack : Shortint;        // 08  4
UnformattedBytesPerSector : Shortint;       // 0A  5
SectorsPerTrack : Shortint;                 // 0C  6
VendorUnique1 : array [0..3] Of Shortint;   // 0E  7-9
SerialNumber : array [0..10] Of Shortint;   // 14  10-19
BufferType : Shortint;                      // 28  20
BufferSectorSize : Shortint;                // 2A  21
NumberOfEccBytes : Shortint;                // 2C  22
FirmwareRevisionarray : array[0..4] Of Shortint; // 2E  23-26
ModelNumber : array[0..20] Of Shortint;            // 36  27-46
MaximumBlockTransfer : Byte;                // 5E  47
VendorUnique2 : Byte;                       // 5F
DoubleWordIo : Shortint;                    // 60  48
Capabilities : Shortint;                    // 62  49
Reserved2 : Shortint;                       // 64  50
VendorUnique3 : Byte;                       // 66  51
PioCycleTimingMode : Byte;                  // 67
VendorUnique4 : Byte;                       // 68  52
DmaCycleTimingMode : Byte;                  // 69
    USHORT TranslationFieldsValid:1;  //здесь не знаю как перевести      // 6A  53
    USHORT Reserved3:15;
    USHORT NumberOfCurrentCylinders;        // 6C  54
    USHORT NumberOfCurrentHeads;            // 6E  55
    USHORT CurrentSectorsPerTrack;          // 70  56
    ULONG  CurrentSectorCapacity;           // 72  57-58
    USHORT CurrentMultiSectorSetting;       //     59
    ULONG  UserAddressableSectors;          //     60-61
    USHORT SingleWordDMASupport : 8;        //     62
    USHORT SingleWordDMAActive : 8;
    USHORT MultiWordDMASupport : 8;         //     63
    USHORT MultiWordDMAActive : 8;
    USHORT AdvancedPIOModes : 8;            //     64
    USHORT Reserved4 : 8;
    USHORT MinimumMWXferCycleTime;          //     65
    USHORT RecommendedMWXferCycleTime;      //     66
    USHORT MinimumPIOCycleTime;             //     67
    USHORT MinimumPIOCycleTimeIORDY;        //     68
    USHORT Reserved5[2];                    //     69-70
    USHORT ReleaseTimeOverlapped;           //     71
    USHORT ReleaseTimeServiceCommand;       //     72
    USHORT MajorRevision;                   //     73
    USHORT MinorRevision;                   //     74
    USHORT Reserved6[50];                   //     75-126
    USHORT SpecialFunctionsEnabled;         //     127
    USHORT Reserved7[128];                  //     128-255


Const
ID_CMD = $EC;
IDENTIFY_BUFFER_SIZE = 512;

SMART_GET_VERSION = CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
SMART_RCV_DRIVE_DATA = CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
                        // Этоти коды не работает на паскале.
                        // Как узнать значение этих констант?

Последний раз редактировалось Jupiter; 03.05.2008 в 01:46. Причина: Исправление текста
Jupiter вне форума Ответить с цитированием
Старый 03.05.2008, 01:12   #6
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Продолжение:

Код:
Function DriveInf : Boolean;
Var
HandDrive : Cardinal;
GetVersionParams : GETVERSIONINPARAMS;
cbBytesReturned : Cardinal;
CommandSize : Cardinal;
Command : PSENDCMDINPARAMS;
BytesReturned : Cardinal;
diskdata : array [0..256] Of Cardinal;

begin
Result := True;

// Получаем дескриптор диска
HandDrive := CreateFile(PChar('\\.\PhysicalDrive0'),
GENERIC_READ Or GENERIC_WRITE,
FILE_SHARE_DELETE Or FILE_SHARE_READ Or FILE_SHARE_WRITE,Nil,
OPEN_EXISTING,0,0);

  If HandDrive = INVALID_HANDLE_VALUE Then
  begin
  Result := False;
  Exit;
  end;

cbBytesReturned := 0;
                                               // Нет значения SMART_GET_VERSION
  If Not DeviceIoControl(HandDrive,SMART_GET_VERSION,Nil,0,
  @GetVersionParams,SizeOf(GetVersionParams),cbBytesReturned,Nil) Then
  begin
  Result := False;
  Exit;
  end;

CommandSize := SizeOf(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
  New(Command);

Command^.irDriveRegs.bCommandReg := ID_CMD;
BytesReturned := 0;
                                               // Нет значения SMART_RCV_DRIVE_DATA
  If Not DeviceIoControl(HandDrive,SMART_RCV_DRIVE_DATA,
  Command,SizeOf(SENDCMDINPARAMS),Command,CommandSize,
  BytesReturned,Nil) Then
  begin
  Result := False;
  Exit;
  end;


 // а дальше вообще ничего не понятно
 // как это перевести?
        	       // Print the IDENTIFY data
                DWORD diskdata [256];
                USHORT *pIdSector = (USHORT *)
                             (PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;

                for (int ijk = 0; ijk < 256; ijk++)
                   diskdata [ijk] = pIdSector [ijk];

                PrintIdeInfo (drive, diskdata);
                done = TRUE;
			}
	           // Done

CloseHandle (HandDrive);
Dispose(Command);

end;

Перевожу этот код: http://www.winsim.com/diskid32/diskid32.cpp

помогите пожалуйста перевести и исправить ошибки.

Заранее спасибо.

Последний раз редактировалось Jupiter; 03.05.2008 в 01:25. Причина: Нужно дописать текст
Jupiter вне форума Ответить с цитированием
Старый 03.05.2008, 01:24   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Jupiter Посмотреть сообщение
Код:
.............................
.............................
SMART_GET_VERSION = CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
SMART_RCV_DRIVE_DATA = CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
                        // Этоти коды не работает на паскале.
                        // Как узнать значение этих констант?
Константы посмотрите в аттаче, а из того, что успел заметить, - не путайте USHORT и ShortInt. USHORT - это беззнаковое целое размером 16 бит, аналог паскалевского word, а shortint, если память меня не подводит, это один байт со знаком.
Вложения
Тип файла: rar WinIoCtl.rar (25.6 Кб, 54 просмотров)
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 01:46   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Jupiter, не дублируйте посты. Собирайте порциями то, что непонятно, иначе получится страшная каша.

Эту
Код:
USHORT *pIdSector = (USHORT *)  
                             (PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;
запись можно перевести как
Код:
var pIdSector : ^word;
...............
pIdSector := pointer(Command.bBuffer)
(не помню точно, допускает ли паскаль присвоение нетипизированного пойнтера типизированному) В круглых скобках в C - просто приведение типов.
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 02:45   #9
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

А что означают
"(PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS)"

в этом коде
Код:
USHORT *pIdSector = (USHORT *)
                             (PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;
Поскольку я плохо понимаю C, я решил что именно в этой :
PIDENTIFY_DATA
структуре возвращаются данные о диске, в том числе и серийник.
Может ошибаюсь?
Может не ту процедуру начал переводить?
Jupiter вне форума Ответить с цитированием
Старый 03.05.2008, 04:03   #10
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Код:
..................
Const
ID_CMD = $EC;
IDENTIFY_BUFFER_SIZE =    512;

FILE_DEVICE_DISK =        $00000007;
IOCTL_DISK_BASE =         FILE_DEVICE_DISK;
METHOD_BUFFERED =         0;
FILE_READ_ACCESS =        $0001;
FILE_WRITE_ACCESS =       $0002;
это объявление констант на паскале.


это сишный код:
Код:
SMART_GET_VERSION = CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
Как этот код перевести на паскаль?
Что значит в C "CTL_CODE(" и значения через запятую?
Они складываются?

нужно объявить константу:
SMART_GET_VERSION
которая будет равняться
CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
Jupiter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нет диска в устройстве }{@TT@BЬ)Ч Операционные системы общие вопросы 7 20.01.2009 20:18
Скан диска ZYRGiX Win Api 7 30.12.2007 14:05
Дефрагментация диска Viteef Софт 8 06.12.2007 23:33
Имя и номер KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 10.08.2007 22:26