HDDfabrikano fonk. bazı hddlerde neden null değer döndürür?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
yuksel2004
Üye
Mesajlar: 61
Kayıt: 26 May 2005 08:55
Konum: Bursa

HDDfabrikano fonk. bazı hddlerde neden null değer döndürür?

Mesaj gönderen yuksel2004 »

Arkadaşlar aşağıdaki fonksiyonla hdd fabrika nosunu alabiliyorum ancak Samsung sabit disklerde bu fonksiyon boş değer döndürüyor.Nedeni hakkında bir bilgisi olan varmı acaba.

Kod: Tümünü seç

function hddfabrikano():string; 
const IDENTIFY_BUFFER_SIZE = 512; 
type 
  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; 
  TSendCmdInParams = packed record 
    // Buffer size in bytes 
    cBufferSize  : DWORD; 
    // Structure with drive register values. 
    irDriveRegs  : TIDERegs; 
    // Physical drive number to send command to (0,1,2,3). 
    bDriveNumber : BYTE; 
    bReserved    : Array[0..2] of Byte; 
    dwReserved   : Array[0..3] of DWORD; 
    bBuffer      : Array[0..0] of Byte;  // Input buffer. 
  end; 
  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    : DWORD; 
    wMultSectorStuff           : Word; 
    ulTotalAddressableSectors  : DWORD; 
    wSingleWordDMA             : Word; 
    wMultiWordDMA              : Word; 
    bReserved                  : Array[0..127] of BYTE; 
  end; 
  PIdSector = ^TIdSector; 
  TDriverStatus = packed record 
    // Error code from driver, or 0 if no error. 
    bDriverError : Byte; 
    // Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR. 
    bIDEStatus   : Byte; 
    bReserved    : Array[0..1] of Byte; 
    dwReserved   : Array[0..1] of DWORD; 
  end; 
  TSendCmdOutParams = packed record 
    // Size of bBuffer in bytes 
    cBufferSize  : DWORD; 
    // Driver status structure. 
    DriverStatus : TDriverStatus; 
    // Buffer of arbitrary length in which to store the data read from the drive. 
    bBuffer      : Array[0..0] of BYTE; 
  end; 

  var 
    hDevice : THandle; 
    cbBytesReturned : DWORD; 
    ptr : PChar; 
    SCIP : TSendCmdInParams; 
    aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte; 
    IdOutCmd  : TSendCmdOutParams absolute aIdOutCmd; 

  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 := ''; // return empty string on error 
  if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000 
    begin 
      // warning! change name for other drives: ex.: second drive '\\.\PhysicalDrive1\' 
      hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, 
        FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); 
    end 
  else // Version Windows 95 OSR2, Windows 98 
    hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); 
  if hDevice=INVALID_HANDLE_VALUE then Exit; 
  try 
    FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0); 
    FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0); 
    cbBytesReturned := 0; 
    // Set up data structures for IDENTIFY command. 
    with SCIP do 
    begin 
      cBufferSize  := IDENTIFY_BUFFER_SIZE; 
//      bDriveNumber := 0; 
      with irDriveRegs do 
      begin 
        bSectorCountReg  := 1; 
        bSectorNumberReg := 1; 
//      if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0 
//      else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4); 
        bDriveHeadReg    := $A0; 
        bCommandReg      := $EC; 
      end; 
    end; 
    if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1, 
      @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit; 
  finally 
    CloseHandle(hDevice); 
  end; 
  with PIdSector(@IdOutCmd.bBuffer)^ do 
  begin 
    ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) ); 
    (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0; 
    Result := PChar(@sSerialNumber); 
  end; 
end; 
Teşekkürler.Kolay gelsin.
Unutmayalım ki bu hayat bir demodur ve tam sürüm kullanabilmek için lisans ücreti ödemememiz düşünülemez.
ertemsoft
Üye
Mesajlar: 129
Kayıt: 19 Nis 2005 01:22
İletişim:

Mesaj gönderen ertemsoft »

selam

Eğer işletim sistemi w9x se(win95,98) bu kod bazı işletim sistemin de
çalışmıyor. Birde disk IDE mi SCSI mi ? ben SCSI de denemedim ama
IDE lerde (XP işletim sistemi olan) şuana kadar çalıştı.
Bilgi Paylaştıkça Çoğalır
aseka

Mesaj gönderen aseka »

--
En son aseka tarafından 18 Mar 2008 08:58 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
aseka

Mesaj gönderen aseka »

--
En son aseka tarafından 18 Mar 2008 08:58 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
yuksel2004
Üye
Mesajlar: 61
Kayıt: 26 May 2005 08:55
Konum: Bursa

Mesaj gönderen yuksel2004 »

Arkadaşlar bhsedilen kodlardan ide olanı çalışıyor ama ssci olanını çalıştıramadı.Yetersiz parametre hatası veriyor.Siz çalıştırdıysanız yada nasıl açlıştırılacağını biliyorsanız buraya yazarsanız sevinirim.Herkese koılay gelsin.
Unutmayalım ki bu hayat bir demodur ve tam sürüm kullanabilmek için lisans ücreti ödemememiz düşünülemez.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

hocam yeni konu aşçamk istemedim

ama bu link ler çalışmıyor
Sayfa bulunamıyor
Aradığınız sayfa kaldırılmış, adı değiştirilmiş veya geçici bir süre için kullanılamıyor olabilir.
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7586
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Yeni hostinge geçmeden kaynaklanan bir durum. Dün yüklemeye çalıştım ama bir sıkıntı çıktı. İnşallah bir mani olmaz ise bu hafta sonu dosyalar devreye girecek.

Kolay gelsin.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1269
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

teşekkür ederim hocam

bı dosyalar bana biraz acil lazım da
elinde olan bi arkadaş mail atarsa sevinirim

e-mail adresim : erkan@aseyazilim.com
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Cevapla