Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Температура винта, Как получить SMART параметры винта? 
:(
    Опции темы
Dark Wanderer
  Дата 25.10.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



Здравствуйте. Подскажите как можно получить SMART атрибуты винта? А именно температуру. Буду благодарен за любую помощь. :sample

Это сообщение отредактировал(а) Dark Wanderer - 25.10.2004, 17:08
--------------------
  
PM MAIL   Вверх
Alex
Дата 25.10.2004, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Вот пример может натолкнет на решение проблемы:
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Поличение серийного номера IDE диска.

Функция получает серийный номер первого физического диска IDE (не серийный номер тома!).
Используется S.M.A.R.T. API, а под Windows NT/2K/XP запрос производится не напрямую к диску, а через miniport драйвер контроллера, что позволяет читать серийный номер не имея прав администратора.
Функция может не работать, если первый контролер в системе не ATA или если первое устройство не является винчестером, который поддерживает SMART (современные винчестеры поддерживают).
Если Вы хотите получить другие параметры диска/других дисков, то смотрите пример IdeInfo2 с моего сайта.
На Windows 9x требует наличия драйвера smartvsd.vxd (должен быть в стандартной поставке), просто скопируйте его в \windows\system\iosubsys и перезагрузите компьютер.

Зависимости: Windows, SysUtils
Автор: Alex Konshin, [email protected], Boston, USA
Copyright: http://home.earthlink.net/~akonshin/index.htm
Дата: 30 декабря 2002 г.
***************************************************** }

Код
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( '\\.\Scsi0:', 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.  


Автор: Alex Konshin, [email protected], Boston, USA


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Dark Wanderer
Дата 25.10.2004, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



Спасибо за помощь. Я понял что искать.


Это сообщение отредактировал(а) Dark Wanderer - 25.10.2004, 21:10
--------------------
  
PM MAIL   Вверх
p0s0l
Дата 26.10.2004, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Самому было интересно, поэтому вот что накатал:
Код
uses ioctl;

function GetHDDTemp (HDDNum : byte) : integer;
var
 h : THandle;
 scop : PSendCmdOutParams;
 scip : TSendCmdInParams;
 i : integer;
 da : PDriveAttribute;

begin
 Result := -1;
 GetMem (scop, SizeOf(TSendCmdOutParams)+READ_ATTRIBUTE_BUFFER_SIZE-1);
 h := GetPhysicalDriveHandle(HDDNum, GENERIC_READ or GENERIC_WRITE);
 DoReadAttributesCmd(h, scip, scop^, HDDNum);
 i := 2;
 repeat
   da := @scop.bBuffer[i];
   if da.bAttrID = $C2 then
   begin
     Result := da.bAttrValue;
     Break;
   end;
   Inc(i, SizeOf(da^));
 until scop.bBuffer[i] = 0;
 CloseHandle(h);
 FreeMem (scop);
end;

// пример юза:
 ShowMessage ("Температура ' + IntToStr(GetHDDTemp(0)));
Если возвращает -1, значит, либо SMART не поддерживается, либо такого датчика нет, либо № устройства неправильный...
Модуль ioctl.pas от Alex Konshin можно скачать тут:
http://home.earthlink.net/~akonshin/files/IdeInfo2.zip
(там в архиве нужный модуль и пример IdeInfo2 - получение серийных номеров)




--------------------
С уважением, г-н Посол.
PM   Вверх
Dark Wanderer
Дата 26.10.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



За второй пример спасибо, но температура уменя 166, может она в
фаренгейтах или ещё в чем :thumbs-up
--------------------
  
PM MAIL   Вверх
p0s0l
Дата 26.10.2004, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Мдя... Посмотри AIDA'ой SMART-показания (Хранение данных->SMART), там поле C2 - Temperature, какие там показания ? И сравни их с тем, что получаются в da:
например, da.bWorstValue - наихудшее значение...
(или не в Аиде, дак в Сандре или подобной проге)..

PS: может у тебя винт подыхает ? :)
PPS: а у меня нормально показывает - то же самое, что и АИДА - 36 (единицы не указаны...)


--------------------
С уважением, г-н Посол.
PM   Вверх
Dark Wanderer
Дата 26.10.2004, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



У меня есть две проги :HDD Temperature и SMART Monitor и оба показывают 42.
--------------------
  
PM MAIL   Вверх
p0s0l
Дата 26.10.2004, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Распиши полностью то что содержится в da...
(Там 5-6 полей)...
Т.е. перед Break выведи куда-нибудь все поля и тут их покажи...



--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 26.10.2004, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Еще лучше сделай так:
Код

function GetHDDSmart (HDDNum : byte) : string;
var
 h : THandle;
 scop : PSendCmdOutParams;
 scip : TSendCmdInParams;
 i : integer;
 da : PDriveAttribute;

begin
 Result := '';
 GetMem (scop, SizeOf(TSendCmdOutParams)+READ_ATTRIBUTE_BUFFER_SIZE-1);
 FillChar(scop.bBuffer, READ_ATTRIBUTE_BUFFER_SIZE, 0);
 h := GetPhysicalDriveHandle(HDDNum, GENERIC_READ or GENERIC_WRITE);
 DoReadAttributesCmd(h, scip, scop^, HDDNum);
 for i := 0 to READ_ATTRIBUTE_BUFFER_SIZE-1 do
   Result := Result + IntToHex(scop.bBuffer[i], 2) + ' ';
 CloseHandle(h);
 FreeMem (scop);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Text := GetHDDSmart(0);
end;
В Memo1 выведутся все Smart-атрибуты, их покажи, плиз...



--------------------
С уважением, г-н Посол.
PM   Вверх
Dark Wanderer
Дата 26.10.2004, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



Вот, что получил в мемо

10 00 01 0B 00 64 64 00 00 00 00 00 00 00 02 05 00 64 64 00 00 00 00 00 00 00 03 07 00 66 66 0F 01 08 01 05 00 00 04 12 00 64 64 42 07 00 00 00 00 00 05 33 00 64 64 00 00 00 00 00 00 00 07 0B 00 64 64 00 00 00 00 00 00 00 08 05 00 64 64 00 00 00 00 00 00 00 09 12 00 64 64 7B 0F 00 00 00 00 00 0A 13 00 64 64 00 00 00 00 00 00 00 0C 32 00 64 64 6F 06 00 00 00 00 00 C0 32 00 63 63 50 07 00 00 00 00 00 C1 12 00 63 63 50 07 00 00 00 00 00 C2 02 00 94 94 25 00 0D 00 37 00 00 C4 32 00 64 64 00 00 00 00 00 00 00 C5 22 00 64 64 00 00 00 00 00 00 00 C6 08 00 64 64 00 00 00 00 00 00 00 C7 0A 00 C8 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C4 06 01 1B 03 00 01 00 01 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F6

Текущая температура 36

Это сообщение отредактировал(а) Dark Wanderer - 26.10.2004, 19:27
--------------------
  
PM MAIL   Вверх
p0s0l
Дата 26.10.2004, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Ага. Смотри, на каждый атрибут - по 12 байт. Вначале 10 00 - это какая-то фигня, не знаю к чему это (на длину не походит :-\ )...
Вначале атрибут 01 (read error rate), потом 02 (Throughput perf), 03 (spin up time) и т.д.
Идём до C2 - это и есть температура:
Код
C2 02 00 98 98 24 00 0D 00 37 00 00

Если расписать по полям:
bAttrId = $C2
wStatusFlag = $02 ( = ON_LINE_COLLECTION)
bAttrValue = $98 = 152 - нормализованное значение, это число и выводит GetHDDTemp
bWorstValue = $98 = 152 - наихудшее значение
bRawValue = $24 = 36 - ненормализованное значение

Т.е. программы выводили ненормализованное значение. А я выводил нормализованное, потому как у меня для атрибута температуры такое получается:
Код
C2 22 00 24 31 24 00 00 00 00 00 00
Т.е. у меня ненормализованное значение равняется нормализованному...
Значится, получается, что нужно выводить ненормализованное значение. Для этого в GetHDDTemp надо эту строчку переделать так:
Код
     Result := da.bRawValue[0];


Еще, ради интереса, можешь ли показать, то что тебе выведет это:
Код
function GetHDDSmart (HDDNum : byte) : string;
var
 h : THandle;
 scop : PSendCmdOutParams;
 scip : TSendCmdInParams;
 i, j : integer;
 at : PAttrThreshold;

begin
 Result := '';
 GetMem (scop, SizeOf(TSendCmdOutParams)+READ_ATTRIBUTE_BUFFER_SIZE-1);
 FillChar(scop.bBuffer, READ_THRESHOLD_BUFFER_SIZE, 0);
 h := GetPhysicalDriveHandle(HDDNum, GENERIC_READ or GENERIC_WRITE);

 j := 0;
 DoReadThresholdsCmd(h, scip, scop^, HDDNum);
 for i := 2 to READ_THRESHOLD_BUFFER_SIZE-1 do
 begin
   Result := Result + IntToHex(scop.bBuffer[i], 2) + ' ';
   j := (j+1) mod sizeof(at^);
   if j = 0 then Result := Result + #13#10;
 end;

 CloseHandle(h);
 FreeMem (scop);
end;
Только чтобы это сработало, допиши одну строчку в Ioctl.pas (Алекс К. забыл видимо сделать это). В Interface-часть Ioctl.pas вставь такое:
Код
function DoReadThresholdsCmd( hDevice : THandle; SCIP : TSendCmdInParams; var SCOP : TSendCmdOutParams; bDriveNum : Byte ) : BOOL;



--------------------
С уважением, г-н Посол.
PM   Вверх
Dark Wanderer
Дата 26.10.2004, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



Вывелось вот это:

01 3C 00 00 00 00 00 00 00 00 00 00
02 32 00 00 00 00 00 00 00 00 00 00
03 18 00 00 00 00 00 00 00 00 00 00
04 00 00 00 00 00 00 00 00 00 00 00
05 05 00 00 00 00 00 00 00 00 00 00
07 43 00 00 00 00 00 00 00 00 00 00
08 14 00 00 00 00 00 00 00 00 00 00
09 00 00 00 00 00 00 00 00 00 00 00
0A 3C 00 00 00 00 00 00 00 00 00 00
0C 00 00 00 00 00 00 00 00 00 00 00
C0 32 00 00 00 00 00 00 00 00 00 00
C1 32 00 00 00 00 00 00 00 00 00 00
C2 00 00 00 00 00 00 00 00 00 00 00
C4 00 00 00 00 00 00 00 00 00 00 00
C5 00 00 00 00 00 00 00 00 00 00 00
C6 00 00 00 00 00 00 00 00 00 00 00
C7 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 D8

Спасибо за помощь, не подскажешь где ты(вы) нарыл инфу?
--------------------
  
PM MAIL   Вверх
p0s0l
Дата 26.10.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Я (не мы :)) я сделал поиск в инете по SMART, наткнулся на тот сайт и закачал тот архив, на который уже давал ссылку, ну а там просто: смотри Ioctl.pas - какие функции там, какие структуры, флаги и константы :)...
Большинство интуитивно понятно (но как видишь, не совсем до конца понятно :))



--------------------
С уважением, г-н Посол.
PM   Вверх
Dark Wanderer
Дата 26.10.2004, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 25.10.2004
Где: Кишинёв

Репутация: нет
Всего: нет



:) Огромное спасибо. Это я для своей проги. Для админов. Пишу свой
Shell под Виндозу. Ещё раз спасибо за оперативную помощь и что
потратил столько времени ! :)

Это сообщение отредактировал(а) Dark Wanderer - 26.10.2004, 20:14
--------------------
  
PM MAIL   Вверх
Гость_FREE
Дата 19.1.2005, 16:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть по этому поводу один глюек в коде!!
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1638 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.