先把过程写成单元,以便调用
unit TcpIpPatcher;
interface
uses
classes,WinSvc,sysutils;
type
HWND = type LongWord;
DWORD = type LongWord;
BOOL = type LongBool;
LPCSTR = PAnsiChar;
FARPROC = Pointer;
PSecurityAttributes = ^TSecurityAttributes;
_SECURITY_ATTRIBUTES = record
nLength: DWORD;
lpSecurityDescriptor: Pointer;
bInheritHandle: BOOL;
end;
TSecurityAttributes = _SECURITY_ATTRIBUTES;
SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
const
INVALID_HANDLE_VALUE = DWORD(-1);
kernel32='kernel32.dll';
VER_PLATFORM_WIN32_NT = 2;
GENERIC_READ = DWORD($80000000);
GENERIC_WRITE = $40000000;
OPEN_EXISTING = 3;
FILE_ATTRIBUTE_NORMAL = $00000080;
ERROR_SERVICE_MARKED_FOR_DELETE = 1072;
ERROR_SERVICE_EXISTS = 1073;
ERROR_SERVICE_ALREADY_RUNNING = 1056;
type
TTcpIpPatcher=class(TObject)
private
FDriverLog:string;
function OpenDeviceHandle:hwnd;
public
function NeedsPatching:boolean;
function RunningInWow64:boolean;
function IsDriverLoaded:boolean;
function LoadDriver:boolean;
function UnloadDriver:boolean;
function GetLimit:cardinal;
function SetLimit(NewLimit:cardinal):boolean;
function GetDriverLog:string;
end;
type
_OSVERSIONINFOEXA = record
dwOSVersionInfoSize:DWORD;
dwMajorVersion:DWORD;
dwMinorVersion:DWORD;
dwBuildNumber:DWORD;
dwPlatformId:DWORD;
szCSDVersion:array[0..127] of AnsiChar;
wServicePackMajor:WORD;
wServicePackMinor:WORD;
wSuiteMask:WORD;
wProductType:BYTE;
wReserved:BYTE;
end;
_OSVERSIONINFOEXW = record
dwOSVersionInfoSize:DWORD;
dwMajorVersion:DWORD;
dwMinorVersion:DWORD;
dwBuildNumber:DWORD;
dwPlatformId:DWORD;
szCSDVersion:array[0..127] of widechar;
wServicePackMajor:WORD;
wServicePackMinor:WORD;
wSuiteMask:WORD;
wProductType:BYTE;
wReserved:BYTE;
end;
_OSVERSIONINFOEX = _OSVERSIONINFOEXW;
TOSVersionInfoEXW = _OSVERSIONINFOEXW;
TOSVersionInfoEX = TOSVersionInfoEXW;
OSVERSIONINFOEXW = _OSVERSIONINFOExW;
OSVERSIONINFOEX = OSVERSIONINFOEXW;
const
DRIVER_IMAGE_PATH='/tcpip_patcher.sys';
DRIVER_NAME='tcpip_patcher';
DEVICE_PATH='//./TCPIP_PATCHER';
PATCHER_DEVICE_NAME_A=DEVICE_PATH;
LOG_BUFFER_SIZE=3072;
PATCHER_ERROR_SUCCESS=0;
PATCHER_ERROR_FAILURE=1;
FILE_DEVICE_PATCHER=$00000022;
FILE_DEVICE_UNKNOWN=$00000022;
METHOD_BUFFERED=0;
FILE_READ_ACCESS = 1;
FILE_WRITE_ACCESS = 2;
type
PATCHER_LIMIT_DATA= record
HalfOpenLimit:DWORD;
CurrentHalfOpen:DWORD;
ErrorCode:DWORD;
LogString:char;
end;
type
POve