怎么利用硬盘序列号对软件加密?50‘请详细告之,再线等待!!!!!!!
解决方案 »
- 请问Combobox如何设置文本垂直居中?
- quick report 中如何将页面设为16K纸?
- 有关线程,如何在一个线程中关闭主应用程序。
- 为什么DBGridEh的列复选框不能编辑?
- 这样的SQL语句怎样写, 是否非要分两步?
- 再次散分~~~~~~~~~~~~~~~~~~~~
- 关于is和as的问题
- 哪里有Rxlib for Delphi6.0下载,谢谢!
- 请问,如何用代码在自己的应用程序中得到一个系统dll文件的版本信息?最好写出例程.给分!!
- SPCOMM中procedure ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);再发
- 自动访问网上邻居的问题
- 菜鸟问题,但是我不懂。请解答
var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
begin
if Drv[Length(Drv)] =':' then Drv := Drv + '\';
GetVolumeInformation(pChar(Drv),
nil,
0,
@VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags, VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
begin
if Drv[Length(Drv)] =':' then Drv := Drv + '\';
GetVolumeInformation(pChar(Drv),
nil,
0,
@VolumeSerialNumber,
MaximumComponentLength,
nil,SystemFlags,
0);
Result := IntToHex(HiWord(VolumeSerialNumber), 4) +
'-' +
IntToHex(LoWord(VolumeSerialNumber), 4);
end;
function GetHardDiskKey:string;
var
pdw : pDWord;
mc, fl : dword;
begin
New(pdw);
GetVolumeInformation(pchar('C:\'),nil,0,pdw,mc,fl,nil,0);
result := inttostr(pdw^);
dispose(pdw);
end;
library GetHDSn;{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }uses
SysUtils,
windows,
forms,
Classes; var
buffer:Pointer ;
{$R *.res}{procedure MydllProc(reason:integer);
begin
if reason=DLL_PROCESS_DETACH then
FreeMem(buffer,1024);
end; }
function ptom(const s:string;key:word):string;var
fc1:longint;
fc2:longint;
i:byte;begin
fc1:=24;
fc2:=16;//result[0]:=s[0];setlength(result,length(s));for i:=1 to length(s) dobegin
if (ord(s[i])>=48) and (ord(s[i])<=57) then
Result[i]:=chr(ord(s[i])+i+20)
else if (ord(s[i])>=65) and (ord(s[i])<=71) then
Result[i]:=chr(ord(s[i])+i*2+3)
else if (ord(s[i])>=72) and (ord(s[i])<=82) then
Result[i]:=chr(ord(s[i])+i)
else if (ord(s[i])>=83) and (ord(s[i])<=90) then
Result[i]:=chr(ord(s[i])-i-10) ;
end;
end;
function GetIdeSerialNumber() : PChar; stdcall;
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: longword;
// 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 longword;
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: longword;
wMultSectorStuff: Word;
ulTotalAddressableSectors: longword;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
end; PIdSector = ^TIdSector; TDriverStatus = packed record
// 驱动器返回的错误代码,无错则返回0
bDriverError: Byte;
// IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of longword;
end; TSendCmdOutParams = packed record
// bBuffer的大小
cBufferSize: longword;
// 驱动器状态
DriverStatus: TDriverStatus;
// 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
bBuffer: array[0..0] of BYTE;
end;
var
hDevice : THandle;
cbBytesReturned : longword;
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
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
hDevice := CreateFile('\\.\PhysicalDrive0', 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; // bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1; // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
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 := Pchar(@sSerialNumber); end;
end;exports
GetIdeSerialNumber,
ptom;begin
{DLLProc:=@MydllProc;
Getmem(buffer,1024); }
end.