nomer na hard disk
4 отговора
216 прегледа
nomer na hard disk
Niakoi ima li ideia kak moga da drypna
nomera na hard diska i nomera na dynoto?
[линк]
nomera na hard diska i nomera na dynoto?
[линк]
Re: nomer na hard disk
Ей тука го има. Ако се разтърсиш го има и на по-човешки езици из нета, ама сорса си е същия
Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Re: nomer na hard disk
Пробвах го кода оба4е ми трябва нещо по универсално , щото на един компютър не искаше да работи , защото системата не поддържала SMART features , каквато и да е тази характеристика !
Ако някой е намерил нещо друго .....
благодаря предварително :)
Ако някой е намерил нещо друго .....
благодаря предварително :)
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.