?? myfunction.pas
字號:
unit MyFunction;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,shellAPI,
Forms,Dialogs,ExtCtrls,StdCtrls,ComCtrls,Registry;
const
cOsUnknown:integer=-1;
cOsWin95:integer=0;
cOsWin98:integer=1;
cOsWin98SE:integer=2;
cOsWinME:integer=3;
cOsWinNT:integer=4;
cOsWin2000:integer=5;
cOsWhistler:integer=6;
IOR_READ=0;
IOR_WRITE=1;
IORF_PHYS_CMD=$40000000;
IORF_VERSION_002=$400;
IORF_SYNC_COMMAND=$100;
IORF_HIGH_PRIORITY=1;
//用于FORMAT的常量
SHFMT_ID_DEFAULT = $FFFF;
// Formating options
SHFMT_OPT_QUICKFORMAT = $0000;
SHFMT_OPT_FULL = $0001;
SHFMT_OPT_SYSONLY = $0002;
// Error codes
SHFMT_ERROR = $FFFFFFFF;
SHFMT_CANCEL = $FFFFFFFE;
SHFMT_NOFORMAT = $FFFFFFFD;
//以下磁盤讀寫操作使用
FILE_FLAG_DELETE_ON_CLOSE=$04000000;
VWIN32_DIOC_DOS_IOCTL=1;{MS-DOS INT 21H 44XXH FUNCTION CALL}
VWIN32_DIOC_DOS_INT25=2;{MS-DOS INT 25H FUNCTION CALL}
VWIN32_DIOC_DOS_INT26=3;{MS-DOS INT 26H FUNCTION CALL}
VWIN32_DIOC_DOS_INT13=4;{MS-DOS INT 13H FUNCTION CALL}
VWIN32_DIOC_DOS_DRIVEINFO=6;{MS-DOS INT21H FUNCTION 730X}
MAX_DRV=8;
type
//TVolumeInfo 為一個記錄類,其各字段記錄各個邏輯驅動器的不同信息
TVolumeInfo=record
Name:string;
SerialNumber :DWORD;
MaxComponentLength:DWORD;
FileSystemFlags:DWORD;
FileSystemName:string;
end; //end of TVolumeInfo
//TRegistInfo 為一個記錄類,其各字段記錄用戶注冊信息
TRegistInfo=record
Company:string;
User:string;
ProductID:string;
ProductKey:string;
end; //end of TRegistInfo
//TDriveType為一個驅動器類型集合類型
TDriveType=(dtUnknown,dtNoDrive,dtFloppy,dtFixed,
dtNetwork,dtCDROM,dtRAM);
MemoryStatus=record
dwLength:DWORD; //該記錄的大小,sizeof(MEMORYSTATUS)
dwMemoryLoad:DWORD; //當前正在使用的內存資源的百分比
dwTotalPhys:DWORD; //物理內存的字節數
dwAvailPhys:DWORD; //未使用的物理內存的字節數
dwTotalPageFile:DWORD; //交換文件的字節數
dwAvailPageFile:DWORD; //未使用的交換文件的字節數
dwTotalVirtual:DWORD; //虛擬內存的字節數
dwAvailVirtual:DWORD; //未使用的虛擬內存的字節數
end; //end of MemoryStatus
//磁盤IO結構
TDiskIO=packed Record
dwStartSector:longint;
wSectors:smallint;
lpBuffer:PChar;
end; //end of TDiskIO
//32位寄存器結構
P32Regs=^T32Regs;
T32Regs=record
EBX:longint;
EDX:longint;
ECX:longint;
EAX:longint;
EDI:longint;
ESI:longint;
Flags:longint;
end; // end of T32Regs
Ttype_sdeffsd_req_usage = packed record
_IOR_ioctl_drive:word;
_IOR_ioctl_function:word;
_IOR_ioctl_control_param:longword;
_IOR_ioctl_buffer_ptr:longword;
_IOR_ioctl_client_params:longword;
_IOR_ioctl_return:longword;
end;
Turequestor_usage = packed record
case integer of
1:(
_IOR_requestor_usage:array[0..4]of longword;);
2:(
sdeffsd_req_usage:Ttype_sdeffsd_req_usage;);
end;
TIOR=packed record
IOR_next:longword;{ 為BCB的(MBZ for IORF_VERSION_002) 的客戶鏈接 }
IOR_func:word;{子功能號}
IOR_status:word;{請求的狀態}
IOR_flags:longword;{請求控制標志}
IOR_callback:procedure;{如果IORF_SYNC_COMMAND未設置,則為回調函數地址}
IOR_start_addr:array[0..1]of longword;{相對開始地址}
IOR_xfer_count:longword;{處理的扇區數}
IOR_buffer_ptr:longword;{客戶緩沖區指針}
IOR_private_client:longword;{ BlockDev/IOS客戶保留}
IOR_private_IOS:longword;{IOS保留空間}
IOR_private_port:longword;{端口驅動的私有區域}
_ureq:Turequestor_usage;
IOR_req_req_handle:longword;{請求句柄}
IOR_req_vol_handle:longword;{媒體句柄,指向VRP結構}
IOR_sgd_lin_phys:longword;{指向第一個物理SGD }
IOR_num_sgds:byte;{物理SGD的數目}
IOR_vol_designtr:byte;{視子功能號的不同,可能是以下兩種情況:(1)A盤為0,B盤為1,C盤為2……(2)軟盤是0-7F,硬盤是80-FF}
IOR_ios_private_1:word;{由IOS保留強制對齊}
IOR_reserved_2:array[0..1]of longword; {保留,內部使用}
end;
PIOR=^TIOR;
TRing0DiskRW = record
ReadOrNot:boolean;
Drv:byte;
StartSecLo,StartSecHi:longword;
DiskBuffer:pchar;
result:boolean;
end;
PTable=^Table;
Table = record
Bootable:char;
SysType :char;
BeginHead:word;
BeginCylinder:word;
EndCylinder:word;
StartSector:longword;
OverSector:longword ;
TotalSectors:longword ;
Logical:bool ;//是否為邏輯分區
FLAG:char ; ////////作為更新分區表標志用
Next:PTable;
end;
var
UserName :string;
ComputerName:string;
buffer:TDiskIO;
hdeviceHandle:THandle;
reg:T32Regs;
IDT : array [0..5] of byte;
lpOldGate : dword;
Ring0DiskRW:TRing0DiskRW;
DiskTotalSecs:longword;
maxtracks:word;
mhead,msector:array[0..MAX_DRV-1]of word;
mtrack:array[0..MAX_DRV-1]of word;
bhead,ehead,bsector,esector:array[0..MAX_DRV-1]of longword;
btrack,etrack:array[0..MAX_DRV-1]of longword;
//totalSec:array[0..MAX_DRV-1]of longword;
Sector_No,End_Sector_No,Extend_Start_No:longword;
PartType:array[0..MAX_DRV-1]of integer;
maxParts:integer;
//Dbuf:array[0..512-1]of char;
THead:PTable=nil;
Cylinder,Head,Sector:longword;/////當前的柱面,磁頭,扇區
Cylinders,Heads,Sectors:longword;//硬盤決柱面數據,總磁頭數,扇區數/每磁道
TotalSectors:longword;//硬盤總扇區數
StartSector:longword;//操作時的開始扇區數
//
function GetRegistInfo:TRegistInfo;
function GetOSVersion:integer;
function GetOSName(OSCode:integer):string;
function GetOSLanguage:string;
function GetOSStartModel:string;
function NewGetLogicalDrives:string;
function DriveType(const Drive:Char):TDriveType;
procedure GetDiskSizeAvail(TheDrive:PChar;
var TotalBytes:double;
var TotalFree:double);
function GetVolumeInformation(const Drive:char):TVolumeInfo;
function NewGlobalMemoryStatus(const Index:Integer):DWORD;
function NewGetSystemInfoWORD(const Index:Integer):WORD;
function NewGetSystemInfoDWORD(const Index:Integer):DWORD;
function NewGetComputerName:String;
function DynamicResolution(X,Y:WORD):BOOL;
function LockDisk(VMM32Handle:cardinal;disk:byte;LockOrNot:boolean):boolean;
function LockDrive(VMM32Handle:cardinal;drive:byte;LockOrNot:boolean):boolean;
function IsChar(AsciiCode:integer):char;
procedure FormatDrive(Const Drive:Char;OPT:integer);
function GetBios(value:integer):string;
procedure ReadAnyLSec(Ldrive:char; SecStart:Cardinal; Sec:Pchar);
procedure ReadAnyPSec(SecStart:longword; SecBuf:Pchar);
procedure SearchDrivers();
function GetWinVer:Byte; //獲取WINDOWS 操作系統的版本
Procedure WriteAnyPSec(SecStart:longword;Buf:array of char);
function SHFormatDrive(Handle: HWND; Drive, ID, Options: Word): LongInt;
stdcall; external 'shell32.dll' name 'SHFormatDrive'
implementation
uses unit2, main;
//--------獲取用戶注冊信息
function GetRegistInfo:TRegistInfo;
var
osVerInfo:TOSVersionInfo;
Reg:TRegistry; //必須在Uses加入registry
begin
//判斷是9x還是NT系統,再對相應的注冊表進行操作
osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
if(GetVersionEx(osVerInfo))then
begin
case(osVerInfo.dwPlatformId)of
VER_PLATFORM_WIN32_NT:{Windows NT/2000}
begin //從注冊表中得到用戶注冊信息
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;//主鍵
Reg.OpenKey('software\Microsoft\Windows NT\CurrentVersion',False);//打開鍵
with Result do
begin
//Co Infomation
Company:=Reg.ReadString('RegisteredOrganization');
//User Information
User:=Reg.ReadString('RegisteredOwner');
//Serial No.
ProductID:=Reg.ReadString('ProductID');
//regist NO.
ProductKey:=Reg.ReadString('ProductKey');
end; //end of with
Reg.CloseKey;//關閉鍵
Reg.Free;
end; //end of VER_PLATFORM_WIN32_NT
VER_PLATFORM_WIN32_WINDOWS:{Windows 9x/ME}
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;//主鍵
Reg.OpenKey('software\Microsoft\Windows\CurrentVersion',False);//打開鍵
with Result do
begin
//Co Infomation
Company:=Reg.ReadString('RegisteredOrganization');
//User Information
User:=Reg.ReadString('RegisteredOwner');
//Serial No.
ProductID:=Reg.ReadString('ProductID');
//regist NO.
ProductKey:=Reg.ReadString('ProductKey');
end; //end of with
Reg.CloseKey;//關閉鍵
Reg.Free;
end;//end of VER_PLATFORM_WIN32_WINDOWS
end;//end of case
end; //end of if
end;
//----------獲取系統的版本號
function GetOSVersion:integer;
var
osVerInfo:TOSVersionInfo;
majorVer,minorVer:integer;
begin
Result:=cOsUnknown;
osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
if(GetVersionEx(osVerInfo))then
begin
majorVer:=osVerInfo.dwMajorVersion;
minorVer:=osVerInfo.dwMinorVersion;
case(osVerInfo.dwPlatformId)of
VER_PLATFORM_WIN32_NT:{Windows NT/2000}
begin
if(majorVer<=4)then
Result:=cOsWinNT
else
if((majorVer=5)and(minorVer=0))then
Result:=cOsWin2000
else
if((majorVer=5)and(minorVer=1))then
Result:=cOsWhistler
else
Result:=cOsUnknown;
end;
VER_PLATFORM_WIN32_WINDOWS:{Windows 9x/ME}
begin
if((majorVer=4)and(minorVer=0))then
Result:=cOsWin95
else
if((majorVer=4)and(minorVer=10))then
begin
if(osVerInfo.szCSDVersion[1]='A')then
Result:=cOsWin98SE
else
Result:=cOswin98;
end
else
if((majorVer=4)and(minorVer=90))then
Result:=cOsWinME
else
Result:=cOsUnknown;
end;
else
Result:=cOsUnknown;
end; //end of case
end
else
Result:=cOsUnknown;
end;
//----------獲取系統版本名稱
function GetOSName(OSCode:integer):string;
var
VersionInfo:TOSVersionInfo;
begin
VersionInfo.dwOSVersionInfoSize:=sizeof(TOSVersionInfo);
if Windows.GetVersionEx(VersionInfo)then
with VersionInfo do
if(OSCode=cOsUnknown)then
Result:='(sconociuto)'
else
if(OSCode=cOsWin95)then
Result:='Microsoft Windows 95'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(LOWORD(dwBuildNumber))+':'+szCSDVersion
else
if(OSCode=cOsWin98)then
Result:='Microsoft Windows 98'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(LOWORD(dwBuildNumber))+':'+szCSDVersion
else
if(OSCode=cOsWin98SE)then
Result:='Microsoft Windows 98 Second Edition'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(LOWORD(dwBuildNumber))+':'+szCSDVersion
else
if(OSCode=cOsWinME)then
Result:='Micorsoft Windows Millennium Edition'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(dwBuildNumber)+':'+szCSDVersion
else
if(OSCode=cOsWinNT)then
Result:='Microsoft Windows New Technology'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(dwBuildNumber)+':'+szCSDVersion
else
if(OSCode=cOsWin2000)then
Result:='Microsoft Windows 2000/NT 5'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(dwBuildNumber)+':'+szCSDVersion
else
Result:='Microsoft Windows'+
#13+inttostr(dwMajorVersion)+'.'+
IntToStr(dwMinorVersion)+'.'+
IntToStr(dwBuildNumber)+':'+szCSDVersion;
end;
//----------識別各種語言版本的WINDWOS
function GetOSLanguage:string;
var
ID:LangID;
Language:array[0..100]of char;
begin
ID:=GetSystemDefaultLangID;
VerLanguageName(ID,Language,100);
Result:=String(Language);
end;
//----------檢測WINDOWS的啟動模式
function GetOSStartModel:string;
begin
case(GetSystemMetrics(SM_CLEANBOOT))of
0:Result:='正常模式啟動';
1:Result:='安全模式啟動';
2:Result:='安全模式啟動,但附帶網絡功能';
else
Result:='錯誤:系統啟動有問題。';
end; // end of case
end;
//---------獲得系統邏輯盤符
function NewGetLogicalDrives:string;
var
//邏輯磁盤最大數目為25
drives:set of 0..25; //0至25的枚舉變量
drive:integer;
begin
Result:='';
DWORD(drives):=Windows.GetLogicalDrives;
for drive:=0 to 25 do
if drive in drives then
Result:=Result+Chr(drive+Ord('A'));
end;
//----------獲取驅動器類型
function DriveType(const Drive:Char):TDriveType;
begin
Result:=TDriveType(GetDriveType(PChar(Drive+':\')));
end;
//----------獲取各盤容量信息(只適用于總容量小于4GB的磁盤)
function GetDiskFreeSpaceEx(lpDirectoryName:PAnsiChar;
var lpFreeBytesAvailableToCaller:Integer;
var lpTotalNumberOfBytes:Integer;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -