فيما يتعلق بكود معرفة الرقم التسلسلي للهارد ديك

medreg

  • Newbie
  • *
    • مشاركة: 14
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
في: كانون الثاني 31, 2015, 08:34:37 مسائاً
السلام عليكم ورحمة الله تعالى
هذا الكود يعمل على الويندوز xp
ولكن لا يعمل على الويندوز 7
وكأن البرنامج المستعمل فيه ليس به كود الحماية

function GetIdeSerialNumber():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
    cBufferSize  
DWORD;
    
irDriveRegs  TIDERegs;
    
bDriveNumber BYTE;
    
bReserved    : Array[0..2of Byte;
    
dwReserved   : Array[0..3of DWORD;
    
bBuffer      : Array[0..0of Byte;  // Input buffer.
  
end;
  
TIdSector packed record
    wGenConfig                 
Word;
    
wNumCyls                   Word;
    
wReserved                  Word;
    
wNumHeads                  Word;
    
wBytesPerTrack             Word;
    
wBytesPerSector            Word;
    
wSectorsPerTrack           Word;
    
wVendorUnique              : Array[0..2of Word;
    
sSerialNumber              : Array[0..19of CHAR;
    
wBufferType                Word;
    
wBufferSize                Word;
    
wECCSize                   Word;
    
sFirmwareRev               : Array[0..7of Char;
    
sModelNumber               : Array[0..39of 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..127of BYTE;
  
end;
  
PIdSector = ^TIdSector;
  
TDriverStatus packed record
    bDriverError 
Byte;
    
bIDEStatus   Byte;
    
bReserved    : Array[0..1of Byte;
    
dwReserved   : Array[0..1of DWORD;
  
end;
  
TSendCmdOutParams packed record
    cBufferSize  
DWORD;
    
DriverStatus TDriverStatus;
    
bBuffer      : Array[0..0of BYTE;
  
end;
  var
    
hDevice THandle;
    
cbBytesReturned DWORD;
//    ptr : PChar;
    
SCIP TSendCmdInParams;
    
aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1of Byte;
    
IdOutCmd  TSendCmdOutParams absolute aIdOutCmd;

procedure ChangeByteOrder(var DataSize Integer );
var
  
ptr PChar;
  
Integer;
  
Char;
begin
    ptr 
:= @Data;
    for 
:= 0 to (Size shr 1)-do
    
begin
      c 
:= ptr^;
      
ptr^ := (ptr+1)^;
      (
ptr+1)^ := c;
      
Inc(ptr,2);
    
end;
  
end;
begin
  Result 
:= ''// return empty string on error
  
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000

begin
//أ*أ£أںأ¤ أٹأ›أ*أ‘ PhysicalDrive0 أ‡أ،أ¬ PhysicalDrive1 أ‡أ¦ PhysicalDrive2
   
hDevice := CreateFile'\\.\PhysicalDrive0'GENERIC_READ or GENERIC_WRITE,
  
FILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING0);
  
end
  
else // Version Windows 95 OSR2, Windows 98
  
hDevice := CreateFile'\\.\SMARTVSD'00nilCREATE_NEW0);
  if 
hDevice=INVALID_HANDLE_VALUE then Exit;
  try
    
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
    
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
    
cbBytesReturned := 0;
    
with SCIP do
    
begin
    cBufferSize  
:= IDENTIFY_BUFFER_SIZE;
    
bDriveNumber := 0;
   
with irDriveRegs do
   
begin
     bSectorCountReg  
:= 1;
     
bSectorNumberReg := 1;
     
bDriveHeadReg    := $A0;
     
bCommandReg      := $EC;
    
end;
    
end;
    if 
not DeviceIoControlhDevice, $0007c088, @SCIPSizeOf(TSendCmdInParams)-1,
      @
aIdOutCmdSizeOf(aIdOutCmd), cbBytesReturnednil then Exit;
  finally
    
CloseHandle(hDevice);
  
end;
  
with PIdSector(@IdOutCmd.bBuffer)^ do
  
begin
    ChangeByteOrder
sSerialNumberSizeOf(sSerialNumber) );
    (
PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
    
Result := PChar(@sSerialNumber);
  
end;
end;
function 
get_password(astring): string;
var
  
bstring;
  
cchar;
  
i,ninteger;
begin
  b
:='';
  for 
:= 1 to length(a) do
  
begin
    c
:= a[i];
    
n:= ord(c);
    
n:=n+(2*i);
    
b:=b+chr(n);
  
end;
  
Result:=b;
end;


في الويندوز xp يظهر رقم الهارد ديسك في Edit حتى يتم جلب رمز التشفير
وفي الويندوز 7 لا يظهر رقم الهارد ديسك يعني تظهر edit فارغة
وبناء على وجود edit فارغة بمجرد الضغط على زر الدخول الى البرنامج يدخل عادي بدون طلب رمز التشفير

المصدر : منتدى الفريق العربي للبرمجة