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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2011, 11:38   #1
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
Вопрос

Вот это код дает но не оригинальный:

Код:
char VolumeName[255], FileSystem[255];
unsigned long SerialNumber, MCLength, SystemFlags;
AnsiString VolumeSerial;

if (GetVolumeInformation("C:\\", VolumeName, 254, &SerialNumber, &MCLength, &SystemFlags, FileSystem, 254))
{
VolumeSerial = AnsiString(SerialNumber);
}
Как узнать оригинальный???

Вот такой к примеру должен вывести
Серийный номер WD-WCANM6590361 Но как???

Что не кто не знает???

Научитесь пользоваться кнопкой правка! Nitro2025

Последний раз редактировалось NITRO2025; 01.09.2011 в 08:34.
VintProg вне форума Ответить с цитированием
Старый 31.08.2011, 14:23   #2
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

твой код дает тебе идентификацию тома, присвоенный разделу виндой
Код:
hdparm -i /dev/sdb

/dev/sdb:

 Model=ST31500341AS, FwRev=CC1H, SerialNo=9VS27F47
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=2930275055
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-4,5,6,7
можно посмотреть исходники hdparm
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.08.2011, 14:25   #3
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Можно все по подробней???
VintProg вне форума Ответить с цитированием
Старый 31.08.2011, 14:49   #4
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Не помню в какой ветке, но можно пошерстить реестр.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 31.08.2011, 15:04   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Можно все по подробней???
Мне право неудобно, но есть же и гугл и википедия. Hdparm есть в каждом уважающем себя дистрибутиве линукса... Соответственно и сорцы достать не проблема, даже не скачивая и не устанавливая ничего дополнительно... ну если только /dev/brain подмонтировать.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.09.2011, 06:19   #6
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Блин мне надо не утилиту!!! А код на C++...
VintProg вне форума Ответить с цитированием
Старый 01.09.2011, 08:47   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Блин мне надо не утилиту!!! А код на C++...
А что по вашему мнению содержится в исходниках этой утилиты?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2011, 00:33   #8
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Как узнать серийные номера физических жестких дисков ?

Код:
function GetIdeDiskSerialNumber(tomnum: integer) : String;
type
  TSrbIoControl = packed record
    HeaderLength : ULONG;
    Signature : Array[0..7] of Char;
    Timeout : ULONG; 
    ControlCode : ULONG;
    ReturnCode : ULONG; 
    Length : ULONG; 
  end; 
  SRB_IO_CONTROL = TSrbIoControl; 
  PSrbIoControl = ^TSrbIoControl; 

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

  TSendCmdInParams = packed record 
    cBufferSize : DWORD; // Buffer size in bytes 
    irDriveRegs : TIDERegs; // Structure with drive register values. 
    bDriveNumber : Byte; // Physical drive number to send command to (0,1,2,3).
    bReserved : Array[0..2] of Byte; // Reserved for future expansion.
    dwReserved : Array[0..3] of DWORD; // For future use. 
    bBuffer : Array[0..0] of Byte; // Input buffer. 
  end; 
  SENDCMDINPARAMS = TSendCmdInParams; 
  PSendCmdInParams = ^TSendCmdInParams; 

  TIdSector = packed record 
    wGenConfig : Word; 
    wNumCyls : Word; 
    wReserved : Word; 
    wNumHeads : Word; 
    wBytesPerTrack : Word;
    wBytesPerSector : Word; 
    wSectorsPerTrack : Word; 
    wVendorUnique : Array[0..2] of Word; 
    sSerialNumber : Array[0..19] of Char; 
    wBufferType : Word; 
    wBufferSize : Word;
    wECCSize : Word; 
    sFirmwareRev : Array[0..7] of Char; 
    sModelNumber : Array[0..39] of Char; 
    wMoreVendorUnique : Word; 
    wDoubleWordIO : Word; 
    wCapabilities : Word;
    wReserved1 : Word; 
    wPIOTiming : Word; 
    wDMATiming : Word; 
    wBS : Word; 
    wNumCurrentCyls : Word; 
    wNumCurrentHeads : Word;
    wNumCurrentSectorsPerTrack : Word; 
    ulCurrentSectorCapacity : ULONG; 
    wMultSectorStuff : Word; 
    ulTotalAddressableSectors : ULONG; 
    wSingleWordDMA : Word; 
    wMultiWordDMA : Word;
    bReserved : Array[0..127] of Byte; 
  end; 
  PIdSector = ^TIdSector; 

const 
  IDE_ID_FUNCTION = $EC;
  IDENTIFY_BUFFER_SIZE = 512; 
  DFP_RECEIVE_DRIVE_DATA = $0007c088; 
  IOCTL_SCSI_MINIPORT = $0004d008; 
  IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501; 
  DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE; 
  BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
  W9xBufferSize = IDENTIFY_BUFFER_SIZE+16; 
var 
  hDevice : THandle; 
  cbBytesReturned : DWORD; 
  pInData : PSendCmdInParams; 
  pOutData : Pointer; // PSendCmdInParams;
  Buffer : Array[0..BufferSize-1] of Byte; 
  srbControl : TSrbIoControl absolute Buffer; 

  procedure ChangeByteOrder( var Data; Size : Integer ); 
  var ptr : PChar; 
      i : Integer;
      c : Char; 
  begin 
    ptr := @Data; 
    for i := 0 to (Size shr 1)-1 do 
    begin 
      c := ptr^;
      ptr^ := (ptr+1)^; 
      (ptr+1)^ := c; 
      Inc(ptr,2); 
    end; 
  end; 

begin 
  Result := ''; 
  FillChar(Buffer,BufferSize,#0); 
  if Win32Platform=VER_PLATFORM_WIN32_NT then 
    begin // Windows NT, Windows 2000 
      // Get SCSI port handle
      hDevice := CreateFile( '\\.\Scsi0:', GENERIC_READ or GENERIC_WRITE, 
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); 
      if hDevice=INVALID_HANDLE_VALUE then Exit; 
      try
        srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
        System.Move('SCSIDISK',srbControl.Signature,8);
        srbControl.Timeout := 2;
        srbControl.Length := DataSize;
        srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
        pInData := PSendCmdInParams(PChar(@Buffer)+SizeOf(SRB_IO_CONTROL));
        pOutData := pInData; 
        with pInData^ do 
        begin 
          cBufferSize := IDENTIFY_BUFFER_SIZE; 
          bDriveNumber := tomnum;
          with irDriveRegs do 
          begin 
            bFeaturesReg := 0; 
            bSectorCountReg := 1; 
            bSectorNumberReg := 1; 
            bCylLowReg := 0;
            bCylHighReg := 0; 
            bDriveHeadReg := $A0; 
            bCommandReg := IDE_ID_FUNCTION; 
          end; 
        end; 
        if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT, @Buffer,
          BufferSize, @Buffer, BufferSize, cbBytesReturned, nil ) then Exit; 
      finally 
        CloseHandle(hDevice); 
      end; 
    end else
asmodey1 вне форума Ответить с цитированием
Старый 02.09.2011, 00:33   #9
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

И продолжение кода :
Код:
begin // Windows 95 OSR2, Windows 98 
      hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); 
      if hDevice=INVALID_HANDLE_VALUE then Exit; 
      try 
        pInData := PSendCmdInParams(@Buffer); 
        pOutData := PChar(@pInData^.bBuffer);
        with pInData^ do 
        begin 
          cBufferSize := IDENTIFY_BUFFER_SIZE; 
          bDriveNumber := tomnum;
          with irDriveRegs do 
          begin
            bFeaturesReg := 0; 
            bSectorCountReg := 1; 
            bSectorNumberReg := 1; 
            bCylLowReg := 0; 
            bCylHighReg := 0; 
            bDriveHeadReg := $A0;
            bCommandReg := IDE_ID_FUNCTION; 
          end; 
        end;
        if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA, pInData,
           SizeOf(TSendCmdInParams)-1, pOutData, W9xBufferSize,
           cbBytesReturned, nil ) then Exit; 
      finally 
        CloseHandle(hDevice); 
      end;
    end; 
    with PIdSector(PChar(pOutData)+16)^ do 
    begin 
      ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber)); 
      SetString(Result,sSerialNumber,SizeOf(sSerialNumber)); 
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s : String;
    rc : DWORD;
    i: integer;
begin
Memo2.Clear;
for i:=0 to 3 do
begin
  s := GetIdeDiskSerialNumber(i);
  if s='' then
    begin
      rc := GetLastError;
      if rc=0 then Memo2.Lines.Add('Disk '+IntToStr(i)+' IDE drive is not support SMART feature')
      else Memo2.Lines.Add('Disk '+IntToStr(i)+': '+SysErrorMessage(rc));
    end
  else Memo2.Lines.Add('Disk '+IntToStr(i)+' serial number: '+Trim(s));
end;
Memo2.SetFocus;
end;
asmodey1 вне форума Ответить с цитированием
Старый 02.09.2011, 13:12   #10
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

Ваш код выдаёт ошибку на Windows 7.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по букве тома определить физический серийный номер накопителя, а не номер тома @лександр Помощь студентам 6 23.09.2010 15:05
Серийный номер флешки best island Общие вопросы .NET 0 19.07.2010 01:47
Серийный номер физ. диска Jupiter Общие вопросы Delphi 14 19.06.2010 11:31
Серийный номер HDD Mikola-TEAM Win Api 1 25.05.2010 19:38
Серийный номер жесткого диска Dj_smart Паскаль, Turbo Pascal, PascalABC.NET 0 04.01.2009 21:19