Merevlemezek, particiok II.: Sorozatszam

Merevlemezek, particiok II.: Sorozatszam
2005-09-11T21:02:53+02:00
2005-11-02T21:50:00+01:00
2022-10-27T15:00:42+02:00
T_1
Ez a téma ennek folytatása.

Adott egy gép, benne két merevlemez. Az előző témában "sopronig maszok" segítségével odáig eljutottam, hogy az egyes particiókról el tudom dönteni, hogy melyik merevlemezen vannak. (HardDiskN).
Ettől függetlenül a merevlemezekről le tudom kérdezni a sorozatszámot SCSI_MINIPORT-on keresztül. Ettől eltérő megoldást sehol sem találtam.
A problémám az, hogy a kettőt hogyan tudnám összekapcsolni.
\\.\ScsiN... kontra \\.\PhysicalDriveN (HarddiskN)
Valaki?

Előre is köszi!
Mutasd a teljes hozzászólást!
De, ha ez valójában merevlemez, akkor melyik betújelű meghajtók vannak rajta?


elkezdesz végigmenni a meghajtók betűjelén (c,d,e) és a GetIdeDiskSerialNumber -t alkalmazod mindegyiken (persze 1 kicsit módítani kell)... ekkor visszakapod mindegyik partició fizikai lemezének sorozatszámát, majd ami egyforma, az egy winyón van...
Mutasd a teljes hozzászólást!

  • [off]
    törölve
    [/off]
    Mutasd a teljes hozzászólást!
  • hi
    pontosan mit akarsz? :)
    Mutasd a teljes hozzászólást!
  • A programomat aktiváltatni szeretném. Ehhez a merevlemez fizikai azonosítóját használnám fel.
    A fizikai azonosítót le tudom kérni, de gond van, ha több merevlemez is van a gépben.

    A fizikai azonosítót ez alapján kérem le:
    CreateFile("\\.\Scsi0:", ...)

    De, ha ez valójában merevlemez, akkor melyik betújelű meghajtók vannak rajta?

    A Windowsba épített Disk Management pont azt nyújtja, amire szükségem lenne:
    Felrajzolja a fizikai lemezeket és bejelöli a logikai meghatókat rajta.
    Mutasd a teljes hozzászólást!
  • szerintem elég lenne 1 tömbbe beírni a merevlemezek serial-ját és azt elmenteni vhova...

    IDE SN:

    // (c) Alex Konshin mailto:alexk@mtgroup.ru 30 jul 2000 program IdeSN; // PURPOSE: Simple console application that extract first IDE disk serial number. {$APPTYPE CONSOLE} uses Windows, SysUtils; // only for Win32Platform and SysErrorMessage //------------------------------------------------------------- function GetIdeDiskSerialNumber : 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( '\\.\G:', // Note: '\\.\C:' required administrative permissions. 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 := 0; 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 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 := 0; 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; //============================================================= var s : String; rc : DWORD; begin s := GetIdeDiskSerialNumber; if s='' then begin rc := GetLastError; if rc=0 then WriteLn('IDE drive is not support SMART feature') else WriteLn(SysErrorMessage(rc)); end else WriteLn('Disk serial number: ''', s,''''); end.

    SCSI SN:


    // Alex Konshin mailto:alexk@mtgroup.ru 17 jul 2000 program ScsiSN; // PURPOSE: Simple console application that display SCSI harddisk serial number {$APPTYPE CONSOLE} uses Windows, SysUtils; //------------------------------------------------------------- function GetDeviceHandle( sDeviceName : String ) : THandle; begin Result := CreateFile( PChar('\\.\'+sDeviceName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ) end; //------------------------------------------------------------- function ScsiHddSerialNumber( DeviceHandle : THandle ) : String; {$ALIGN ON} type TScsiPassThrough = record Length : Word; ScsiStatus : Byte; PathId : Byte; TargetId : Byte; Lun : Byte; CdbLength : Byte; SenseInfoLength : Byte; DataIn : Byte; DataTransferLength : ULONG; TimeOutValue : ULONG; DataBufferOffset : DWORD; SenseInfoOffset : ULONG; Cdb : Array[0..15] of Byte; end; TScsiPassThroughWithBuffers = record spt : TScsiPassThrough; bSenseBuf : Array[0..31] of Byte; bDataBuf : Array[0..191] of Byte; end; {ALIGN OFF} var dwReturned : DWORD; len : DWORD; Buffer : Array[0..SizeOf(TScsiPassThroughWithBuffers)+SizeOf(TScsiPassThrough)-1] of Byte; sptwb : TScsiPassThroughWithBuffers absolute Buffer; begin Result := ''; FillChar(Buffer,SizeOf(Buffer),#0); with sptwb.spt do begin Length := SizeOf(TScsiPassThrough); CdbLength := 6; // CDB6GENERIC_LENGTH SenseInfoLength := 24; DataIn := 1; // SCSI_IOCTL_DATA_IN DataTransferLength := 192; TimeOutValue := 2; DataBufferOffset := PChar(@sptwb.bDataBuf)-PChar(@sptwb); SenseInfoOffset := PChar(@sptwb.bSenseBuf)-PChar(@sptwb); Cdb[0] := $12; // OperationCode := SCSIOP_INQUIRY; Cdb[1] := $01; // Flags := CDB_INQUIRY_EVPD; Vital product data Cdb[2] := $80; // PageCode Unit serial number Cdb[4] := 192; // AllocationLength end; len := sptwb.spt.DataBufferOffset+sptwb.spt.DataTransferLength; if DeviceIoControl( DeviceHandle, $0004d004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil ) and ((PChar(@sptwb.bDataBuf)+1)^=#$80) then SetString( Result, PChar(@sptwb.bDataBuf)+4, Ord((PChar(@sptwb.bDataBuf)+3)^) ); end; //============================================================= var hDevice : THandle = 0; sSerNum, sDeviceName : String; begin sDeviceName := ParamStr(1); if sDeviceName='' then begin WriteLn; WriteLn('Display SCSI-2 device serial number.'); WriteLn; WriteLn('Using:'); WriteLn; WriteLn(' ScsiSN C:'); if Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000 WriteLn(' ScsiSN PhysicalDrive0'); WriteLn(' ScsiSN Cdrom0'); WriteLn(' ScsiSN Tape0'); WriteLn; Exit; end; hDevice := GetDeviceHandle(sDeviceName); if hDevice=INVALID_HANDLE_VALUE then WriteLn('Error on GetDeviceHandle: ',SysErrorMessage(GetLastError)) else try sSerNum := ScsiHddSerialNumber(hDevice); if sSerNum='' then WriteLn('Error on DeviceIoControl: ',SysErrorMessage(GetLastError)) else WriteLn('Device '+sDeviceName+' serial number = "',sSerNum,'"'); finally CloseHandle(hDevice); end; end.
    Mutasd a teljes hozzászólást!
  • ja, és az a lemezkezelő a particiós táblát kérdezi le, és valószínűleg a partició fájlrendszeréből számolja ki a windowsos meghajtó (alias partició) betűjelét

    a particiós táblát ezekkel a unitokkal tudod lekérdezni: ext 2 & partition table (ebben van ext2 olvasó unit is asszem :))

    és így kell használni:

    ... uses partition, ... ... var PartitionList: TPartitionList; ... begin ... PartitionList:= TPartitionList.Create; PartitionList.Scanfloppy := false; /sztem ez nem kell neked PartitionList.NT_Scan; ... end;

    remélem a többit kitalálod . Sok sikert
    Mutasd a teljes hozzászólást!
  • bár ahogy elnézem, ez is tudja úgy, ahogy neked kell csak most vettem észre
    Mutasd a teljes hozzászólást!
  • szerintem elég lenne 1 tömbbe beírni a merevlemezek serial-ját és azt elmenteni vhova...


    Köszi, de ez nem egészen jó ötlet:
    1. Pl. a program telepítésekor két merevlemez van benne. Az egyiket bűntudat nélkül el lehet távolítani bármikorMáris csorbul a lista.
    Erre ugyan megoldást jelenthet, hogy legalább egy eltárolt sorozatszámot meg kell találni, de...
    2. Túl sok adat
    Ha ezt szeretném felhasználni az aktivációs kulcs generálásánál (tiszta magyar ), akkor a méretre nagyon figyelni kell.
    Ezen még az sem segíteni, ha CRC-t, vagy MD5-öt generálnék belőle, mert, ha egyet (merevlemezt) kivesznek a gépből, akkor máris dől az egész.
    Mutasd a teljes hozzászólást!
  • és valószínűleg a partició fájlrendszeréből számolja ki a windowsos meghajtó (alias partició) betűjelét


    Sajnos ez sem egészen jó.
    Win2000 és XP esetében össze-vissza rendezgetheted a betűjeleket.
    (kivéve rendszer part.)
    Pl:
    C: HDD0/1
    D: HDD1/3
    E: HDD1/1
    F: HDD0/2
    Mutasd a teljes hozzászólást!
  • De, ha ez valójában merevlemez, akkor melyik betújelű meghajtók vannak rajta?


    elkezdesz végigmenni a meghajtók betűjelén (c,d,e) és a GetIdeDiskSerialNumber -t alkalmazod mindegyiken (persze 1 kicsit módítani kell)... ekkor visszakapod mindegyik partició fizikai lemezének sorozatszámát, majd ami egyforma, az egy winyón van...
    Mutasd a teljes hozzászólást!
  • Köszi, meggyőztél!

    Már csak egy (komoly) problémám van:
    Ahhoz, hogy ezek az információk mindig lekérdezhetőek legyenek "adminisztrátori jogkörrel" kell bejelentkezni.
    De ez már egy másik történet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd