Win API function GetVolumeInformation
15 отговора
408 прегледа
Win API function GetVolumeInformation
Функцията GetVolumeInformation() връща серииния номер на всеки дял от HDD-то т.е. сериини номера които е назначила Операционната ситема на дяловете C:\, D:\,E:\,....., и т.н. включително и CD-ROM-а.
С коя функция мога да прочета серииния номер на диска от производителя който е хардуерно зададен и се съхранява в самото HDD естествено?
И другият ми въпрос е : Как мога да прочета серииния номер на процесора като става въпрос за същото по-горе, т.е. хардуерния номер от производителя?
Благодаря предварително.
С коя функция мога да прочета серииния номер на диска от производителя който е хардуерно зададен и се съхранява в самото HDD естествено?
И другият ми въпрос е : Как мога да прочета серииния номер на процесора като става въпрос за същото по-горе, т.е. хардуерния номер от производителя?
Благодаря предварително.
HDD serial number...
жалко че търсачката в архивите не работи - ама все пак пробвай - темата трябва да съдържа и това - но все пак ето ти работещ код
-------------------------------------------------------------------------------
---
Е т'ва е живот!
-------------------------------------------------------------------------------
function GetIdeSerialNumber(sDeviceName:string): string;
const IDENTIFY_BUFFER_SIZE = 512;
type
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;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize: DWORD;
// Structure with drive register values.
irDriveRegs: TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber: BYTE;
bReserved: array[0..2] of Byte;
dwReserved: array[0..3] of DWORD;
bBuffer: array[0..0] of Byte; // Input buffer.
end;
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: DWORD;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
bDriverError: Byte;
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
cBufferSize: DWORD;
DriverStatus: TDriverStatus;
bBuffer: array[0..0] of BYTE;
end;
var
hDevice: THandle;
cbBytesReturned: DWORD;
SCIP: TSendCmdInParams;
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;
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 := '';
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
hDevice := CreateFile(Pchar(sDeviceName), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(PChar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;
Result := sSerialNumber;
end;
end;
---
Е т'ва е живот!
А колкото до процесора....
Зарежи това - имаше начин за четене на подобен сериен номер при някои Intel PIII - и то само ограничена серия - но до колкото знам - подобно нещо не съществува вече. Има партиден номер на самия процесор- но не съм сигурен дали е същото като HDD серийния номер.
Ползвай MAC адреса на мрежовата карта ако има такава.
---
Е т'ва е живот!
Ползвай MAC адреса на мрежовата карта ако има такава.
---
Е т'ва е живот!
Re: HDD serial number...
function GetIdeSerialNumber(sDeviceName:string): string; sDeviceName - какъв параметър трябва да се подаде? Опитах със 'C:\' но не става.
Благодаря.
Благодаря.
Re: А колкото до процесора....
Мисля, че предните отговори елиминираха този въпрос - ще трябва да се задоволиш само с HDD - сигурен номер - и ако има интелски процесор с ID - хубаво - ама ако няма - взимаш MAC адреса на мрежовата карта - ако няма - нищо не взимаш.
Идеята със защитите сме я коментирали - и нея на скоро - погледни я.
---
Е т'ва е живот!
Идеята със защитите сме я коментирали - и нея на скоро - погледни я.
---
Е т'ва е живот!
Re: А колкото до процесора....
Това използва инструкцията CPUID. При нея процесора си връща информация за себе си. AMD-тата го поддържат също от K6 насам (за K5 не съм съвсем сигурен).
Re: HDD serial number...
Не става.Само да вметна че при сглобяването на машината ми хората от "StealTech computers" са сложили HDD-to на IDE1 a CD-ROM-a на IDE0.PC-to ми е запечатано и не мога да ги разменя .Трябва да ходя при тях те да го направят.
Тази функция IDE0 ли чете или търси HDD?
Тази функция IDE0 ли чете или търси HDD?
Re: HDD serial number...
Следващия път пак си купи компютър от подобни бунаци - ако наистина са го сложили на IDE2 - освен това кода който ти дадох търси първия - пробвай да сменяш нулата с 1,2,3 - трябва да се получи все някога - не съм го пробвал - но мисля, че работи.
---
Е т'ва е живот!
---
Е т'ва е живот!
Re: А колкото до процесора....
Поддържа се и от K5 и от последните 486-ци на Intel, а и от другите производители на процесори като Transmeta например. На [линк] има маса компоненти за целта - пишеш CPU или CPUID в търсачката и те излизат. Един от добрите е cxCPU 4 на [линк], даже мисля, че беше безплатен. Дава ти всичко за процесора, вкл. производител, модел, работна честота, кеш, features и т.н.
Успех!
P.S. Това беше адресирано към turtle.
Mixy
Успех!
P.S. Това беше адресирано към turtle.
Mixy
Редактирано от Mixy на
Re: HDD serial number...
\\.\PhysicalDrive работи за NT базирани системи. Обаче аз имам два физически диска на 98 и не знам как да накарам горния код да покаже SerialNo на втория диск. Какво трябва да се подаде на CreateFile на мястото на SMARTVSD?
Re: А колкото до процесора....
Ако можеше да се защити софтуеъра да са го направили. Друг е въпроса колко усилие заслужава това което правиш.