nomer na hard disk

4 отговора 216 прегледа
#1

nomer na hard disk

Niakoi ima li ideia kak moga da drypna
nomera na hard diska i nomera na dynoto?

[линк]
Отговор
в отговор на FrancescoTotti #2

Re: nomer na hard disk

Ей тука го има. Ако се разтърсиш го има и на по-човешки езици из нета, ама сорса си е същия

Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Отговор
в отговор на FrancescoTotti #4

Re: nomer na hard disk

Пробвах го кода оба4е ми трябва нещо по универсално , щото на един компютър не искаше да работи , защото системата не поддържала SMART features , каквато и да е тази характеристика !
Ако някой е намерил нещо друго .....
благодаря предварително :)

Отговор
в отговор на Leshnik #5

Re: nomer na hard disk

(********************************************************************************)

(* *)
(* The contents of this file are subject to the Mozilla Public License Version *)
(* 1.1 (the "License"); you may not use this file except in compliance with the *)
(* License. You may obtain a copy of the License at [линк] *)
(* *)
(* Software distributed under the License is distributed on an "AS IS" basis, *)
(* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for *)
(* the specific language governing rights and limitations under the License. *)
(* *)
(* The Developer of this unit is Vassil Nazarov *)
(* [линк] *)
(* *)
(********************************************************************************)

Unit HWInfo;

Interface

Uses Windows, SysUtils;

Const

// Ripped from NT DDK sources
FILE_DEVICE_DISK =$00000007;
IOCTL_DISK_BASE =FILE_DEVICE_DISK;
FILE_READ_ACCESS =$0001; // file & pipe
FILE_WRITE_ACCESS =$0002; // file & pipe
IDENTIFY_BUFFER_SIZE =512;


METHOD_BUFFERED =$0;
//SMART_RCV_DRIVE_DATA = CTL_CODE(IOCTL_DISK_BASE, $0022, METHOD_BUFFERED, FILE_READ_ACCESS OR FILE_WRITE_ACCESS);

FILE_DEVICE_SCSI =$0000001b;
IOCTL_SCSI_MINIPORT_IDENTIFY =((FILE_DEVICE_SCSI Shl 16)+$0501);
IOCTL_SCSI_MINIPORT =$0004D008; // see NTDDSCSI.H for definition

ID_CMD=$EC; // Returns ID sector for ATA.

TDriveCount=4;

Type
TDriveNum=0..Pred(TDriveCount);

THDDInfo=Packed Record
ModelNumber: Array[0..39] Of Char; //40
FirmwareRevision: Array[0..7] Of Char; //08
SerialNumber: Array[0..19] Of Char; //20
HWCacheSectorSize: Word; //02 The cache size in 512 byte sectors.
Cylinders: Word; //02
Heads: Word; //02
Sectors: Word; //02
End; //76

_IDEREGS=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=_IDEREGS;
PIDEREGS=^IDEREGS;
LPIDEREGS=PIDEREGS;

_SENDCMDINPARAMS=Packed 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..2] Of Byte; // Reserved for future expansion.
dwReserved: Array[0..3] Of Cardinal; // For future use.
bBuffer: Array[0..1] Of Byte; // Input buffer.
End;
SENDCMDINPARAMS=_SENDCMDINPARAMS;
PSENDCMDINPARAMS=^SENDCMDINPARAMS;
LPSENDCMDINPARAMS=PSENDCMDINPARAMS;


_DRIVERSTATUS=Packed Record
bDriverError: Byte; // Error code from driver, or 0 if no error.
bIDEError: Byte; // Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR.
bReserved: Word; // Reserved for future expansion.
dwReserved: int64; // Reserved for future expansion.
End;
DRIVERSTATUS=_DRIVERSTATUS;
PDRIVERSTATUS=^DRIVERSTATUS;
LPDRIVERSTATUS=PDRIVERSTATUS;

_SENDCMDOUTPARAMS=Packed Record
cBufferSize: Cardinal; // Size of bBuffer in bytes
DriverStatus: DRIVERSTATUS; // Driver status structure.
bBuffer: Array[0..1] Of Byte; // Buffer of arbitrary length in which to store the data read from the drive.
End;
SENDCMDOUTPARAMS=_SENDCMDOUTPARAMS;
PSENDCMDOUTPARAMS=^SENDCMDOUTPARAMS;
LPSENDCMDOUTPARAMS=PSENDCMDOUTPARAMS;

_IDENTIFY_DATA=Packed Record
GeneralConfiguration: Word; // 00 00
NumberOfCylinders: Word; // 02 1
Reserved1: Word; // 04 2
NumberOfHeads: Word; // 06 3
UnformattedBytesPerTrack: Word; // 08 4
UnformattedBytesPerSector: Word; // 0A 5
SectorsPerTrack: Word; // 0C 6
VendorUnique1: Array[0..2] Of Word; // 0E 7-9
SerialNumber: Array[0..19] Of Char; // 14 10-19
BufferType: Word; // 28 20
BufferSectorSize: Word; // 2A 21
NumberOfEccBytes: Word; // 2C 22
FirmwareRevision: Array[0..7] Of Char; // 2E 23-26
ModelNumber: Array[0..39] Of Char; // 36 27-46
MaximumBlockTransfer: Byte; // 5E 47
VendorUnique2: Byte; // 5F
DoubleWordIo: Word; // 60 48
Capabilities: Word; // 62 49
Reserved2: Word; // 64 50
VendorUnique3: Byte; // 66 51
PioCycleTimingMode: Byte; // 67
VendorUnique4: Byte; // 68 52
DmaCycleTimingMode: Byte; // 69
TranslationFieldsValid: Word; // 6A 53
Reserved3: Word;
NumberOfCurrentCylinders: Word; // 6C 54
NumberOfCurrentHeads: Word; // 6E 55
CurrentSectorsPerTrack: Word; // 70 56
CurrentSectorCapacity: Cardinal; // 72 57-58
CurrentMultiSectorSetting: Word; // 59
UserAddressableSectors: Cardinal; // 60-61
SingleWordDMASupport: Word; // 62
SingleWordDMAActive: Word;
MultiWordDMASupport: Word; // 63
MultiWordDMAActive: Word;
AdvancedPIOModes: Word; // 64
Reserved4: Word;
MinimumMWXferCycleTime: Word; // 65
RecommendedMWXferCycleTime: Word; // 66
MinimumPIOCycleTime: Word; // 67
MinimumPIOCycleTimeIORDY: Word; // 68
Reserved5: Array[0..1] Of Word; // 69-70
ReleaseTimeOverlapped: Word; // 71
ReleaseTimeServiceCommand: Word; // 72
MajorRevision: Word; // 73
MinorRevision: Word; // 74
Reserved6: Array[0..49] Of Word; // 75-126
SpecialFunctionsEnabled: Word; // 127
Reserved7: Array[0..127] Of Word; // 128-255
End;
IDENTIFY_DATA=_IDENTIFY_DATA;
PIDENTIFY_DATA=^IDENTIFY_DATA;

_SRB_IO_CONTROL=Packed Record
HeaderLength: Cardinal;
Signature: Array[0..7] Of Byte;
Timeout: Cardinal;
ControlCode: Cardinal;
ReturnCode: Cardinal;
Length: Cardinal;
End;
SRB_IO_CONTROL=_SRB_IO_CONTROL;
PSRB_IO_CONTROL=^SRB_IO_CONTROL;
// end of NT DDK rip

Function Get_ATAPI_HDDInfo(Const DriveNum: TDriveNum; Var HDDInf: THDDInfo): Boolean;

IMPLEMENTATION

uses Classes;


Function Get_ATAPI_HDDInfo(Const DriveNum: TDriveNum; Var HDDInf: THDDInfo): Boolean;
Var Length: Integer;
Buffer: Array Of Byte;
P: PSRB_IO_CONTROL;
Pin: PSENDCMDINPARAMS;
i,Drv: Cardinal;
HDrv: THandle;
pOut: PSENDCMDOUTPARAMS;
pId: PIDENTIFY_DATA;
B: Byte;
//S: String;
Begin
Result:=False;
LENGTH:=SizeOf(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE;
SetLength(Buffer, sizeof(SRB_IO_CONTROL)+LENGTH);
P:=@(Buffer[0]);
Pin:=@(Buffer[SizeOf(SRB_IO_CONTROL)]);

Case DriveNum Of
0,1: Begin
i:=0;
Drv:=DriveNum;
End;
2: Begin
i:=1;
Drv:=0;
End;
3: Begin
i:=1;
Drv:=1;
End;
End; //Case


HDrv:=CreateFile(PChar('\\.\Scsi'+IntToStr(i)+':'), // drive to open
//HDrv:=CreateFile(PChar('\\.\Scsi'+IntToStr(DriveNum)+':'), // drive to open
//HDrv:=CreateFile(PChar('\\.\PhysicalDrive'+IntToStr(DriveNum)), // drive to open
GENERIC_READ Or GENERIC_WRITE,
FILE_SHARE_READ Or FILE_SHARE_WRITE,
Nil, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
0); // do not copy file attributes

If (HDrv<>INVALID_HANDLE_VALUE) Then Begin
ZeroMemory(Buffer, SYSTEM.Length(Buffer));

P.HeaderLength:=SizeOf(SRB_IO_CONTROL);
P.Timeout:=1000;
P.Length:=LENGTH;
P.ControlCode:=IOCTL_SCSI_MINIPORT_IDENTIFY;
Move('SCSIDISK', P.Signature[0], 8);

pin.irDriveRegs.bCommandReg:=ID_CMD;
pin.bDriveNumber:=Drv;

If DeviceIoControl(HDrv,
IOCTL_SCSI_MINIPORT,
@(Buffer[0]),
SizeOf(SRB_IO_CONTROL)+SizeOf(SENDCMDINPARAMS)-1,
@(Buffer[0]),
SizeOf(SRB_IO_CONTROL)+LENGTH,
i,
NiL) Then Begin
CloseHandle(HDrv);
pOut:=@(Buffer[SizeOf(SRB_IO_CONTROL)]);
pId:=@(pOut.bBuffer[0]);
If (pId.ModelNumber[0]<>#0) Then Begin //Disk data is valid.

For i:=0 To 19 Do Begin
B:=WordRec(PWordArray(@pid.ModelNumber[0])).Hi;
WordRec(PWordArray(@pid.ModelNumber[0])).Hi:=WordRec(PWordArray(@pid.ModelNumber[0])).Lo;
WordRec(PWordArray(@pid.ModelNumber[0])).Lo:=B;
End;
For i:=0 To 3 Do Begin
B:=WordRec(PWordArray(@pid.FirmwareRevision[0])).Hi;
WordRec(PWordArray(@pid.FirmwareRevision[0])).Hi:=WordRec(PWordArray(@pid.FirmwareRevision[0])).Lo;
WordRec(PWordArray(@pid.FirmwareRevision[0])).Lo:=B;
End;
For i:=0 To 9 Do Begin
B:=WordRec(PWordArray(@pid.SerialNumber[0])).Hi;
WordRec(PWordArray(@pid.SerialNumber[0])).Hi:=WordRec(PWordArray(@pid.SerialNumber[0])).Lo;
WordRec(PWordArray(@pid.SerialNumber[0])).Lo:=B;
End;
//S:= 'ModelNumber.....: '+pid.ModelNumber+#13#10;
//S:=S+'FirmwareRevision: '+pid.FirmwareRevision+#13#10;
//S:=S+'SerialNumber....: '+pid.SerialNumber+#13#10;
//S:=S+'CacheSize.......: '+IntToStr(pId.BufferSectorSize*512)+#13#10;
//S:=S+'Cylinders.......: '+IntToStr(pId.NumberOfCylinders)+#13#10;
//S:=S+'Heads...........: '+IntToStr(pId.NumberOfHeads)+#13#10;
//S:=S+'Sectors.........: '+IntToStr(pId.SectorsPerTrack)+#13#10;
//MessageBox(0, PChar(S), '', MB_OK);

Move(pid.ModelNumber[0], HDDInf.ModelNumber[0], SizeOf(HDDInf.ModelNumber));
Move(pid.FirmwareRevision[0], HDDInf.FirmwareRevision[0], SizeOf(HDDInf.FirmwareRevision));
Move(pid.SerialNumber[0], HDDInf.SerialNumber[0], SizeOf(HDDInf.SerialNumber));
HDDInf.HWCacheSectorSize:=pid.BufferSectorSize;
HDDInf.Cylinders:=pid.NumberOfCylinders;
HDDInf.Heads:=pid.NumberOfHeads;
HDDInf.Sectors:=pid.SectorsPerTrack;

Result:=True;

End;
End
Else Begin
CloseHandle(HDrv);
RaiseLastOSError;
End;

End
Else
RaiseLastOSError;

End;




End.


Отговор