Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как получить информацию о SCSI дисках?

Delphi , ОС и Железо , Диски

Как получить информацию о SCSI дисках?

Code:

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;
   if Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT/2000
     WriteLn('  ScsiSN PhysicalDrive0')
   else
     WriteLn('  ScsiSN C:');
   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: ',
       SysErrorMessageGetLastError))
else
WriteLn('Device ' + sDeviceName
   + ' serial number = "', sSerNum, '"');
finally
CloseHandle(hDevice);
end;
end.

For more information about SCSI commands:

ftp://ftp.t10.org/t10/drafts/scsi-1/

ftp://ftp.t10.org/t10/drafts/spc/

ftp://ftp.t10.org/t10/drafts/spc2/

Взято с Delphi Knowledge Base: h

Статья Как получить информацию о SCSI дисках? раздела ОС и Железо Диски может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Диски ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
20.04.2024 15:20:54/0.0033969879150391/2