uses windows;
const
_SS_MAXSIZE = 128;
_SS_ALIGNSIZE = SizeOf(Int64);
_SS_PAD1SIZE = _SS_ALIGNSIZE - SizeOf(short);
_SS_PAD2SIZE = _SS_MAXSIZE - (SizeOf(short) + _SS_PAD1SIZE + _SS_ALIGNSIZE);
type
POverlapped = ^TOverlapped;
_OVERLAPPED = record
Internal: ULONG_PTR;
InternalHigh: ULONG_PTR;
Offset: DWORD;
OffsetHigh: DWORD;
hEvent: THandle;
end;
TOverlapped = _OVERLAPPED;
OVERLAPPED = _OVERLAPPED;
WSAOVERLAPPED = TOverlapped;
TWSAOverlapped = WSAOVERLAPPED;
PWSAOverlapped = ^TWSAOverlapped;
LPWSAOVERLAPPED = PWSAOverlapped;
WSC_PROVIDER_INFO_TYPE = (ProviderInfoLspCategories, ProviderInfoAudit);
SOCKADDR_STORAGE = record
ss_family: short; // Address family.
__ss_pad1: array [0 .. _SS_PAD1SIZE - 1] of AnsiChar; // 6 byte pad, this is to make
// implementation specific pad up to
// alignment field that follows explicit
// in the data structure.
__ss_align: Int64; // Field to force desired structure.
__ss_pad2: array [0 .. _SS_PAD2SIZE - 1] of AnsiChar; // 112 byte pad to achieve desired size;
// _SS_MAXSIZE value minus size of
// ss_family, __ss_pad1, and
// __ss_align fields is 112.
end;
SOCKET_SECURITY_PROTOCOL = (
SOCKET_SECURITY_PROTOCOL_DEFAULT, SOCKET_SECURITY_PROTOCOL_IPSEC, SOCKET_SECURITY_PROTOCOL_INVALID
);
SOCKET_SECURITY_SETTINGS_IPSEC = record
SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
SecurityFlags: ULONG;
IpsecFlags: ULONG;
AuthipMMPolicyKey: TGUID;
AuthipQMPolicyKey: TGUID;
Reserved: TGUID;
Reserved2: UINT64;
UserNameStringLen: ULONG;
DomainNameStringLen: ULONG;
PasswordStringLen: ULONG;
// wchar_t AllStrings[0];
end;
PSOCKET_SECURITY_SETTINGS_IPSEC = ^SOCKET_SECURITY_SETTINGS_IPSEC;
SOCKET_SECURITY_SETTINGS = record
SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
SecurityFlags: ULONG;
end;
PSOCKET_SECURITY_SETTINGS = ^SOCKET_SECURITY_SETTINGS;
SOCKET_PEER_TARGET_NAME = record
SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
PeerAddress: SOCKADDR_STORAGE;
PeerTargetNameStringLen: ULONG;
// wchar_t AllStrings[0];
end;
PSOCKET_PEER_TARGET_NAME = ^SOCKET_PEER_TARGET_NAME;
SOCKET_SECURITY_QUERY_INFO = record
SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
Flags: ULONG;
PeerApplicationAccessTokenHandle: UINT64;
PeerMachineAccessTokenHandle: UINT64;
end;
PSOCKET_SECURITY_QUERY_INFO = ^SOCKET_SECURITY_QUERY_INFO;
SOCKET_SECURITY_QUERY_TEMPLATE = record
SecurityProtocol: SOCKET_SECURITY_PROTOCOL;
PeerAddress: SOCKADDR_STORAGE;
PeerTokenAccessMask: ULONG;
end;
PSOCKET_SECURITY_QUERY_TEMPLATE = ^SOCKET_SECURITY_QUERY_TEMPLATE;
LPWSAOVERLAPPED_COMPLETION_ROUTINE = procedure(dwError, cbTransferred: DWORD;
lpOverlapped: LPWSAOVERLAPPED; dwFlags: DWORD); stdcall;
SunB = record
s_b1, s_b2, s_b3, s_b4: byte;
end;
SunW = record
s_w1, s_w2: word;
end;
in_addr = record
case integer of
0: (S_un_b: SunB);
1: (S_un_w: SunW);
2: (S_addr: DWORD);
end;
TInAddr = in_addr;
PInAddr = ^TInAddr;
sockaddr_in = record
case integer of
0: (sin_family: word;
sin_port: word;
sin_addr: TInAddr;
sin_zero: array [0 .. 7] of AnsiChar);
1: (sa_family: word;
sa_data: array [0 .. 13] of AnsiChar)
end;
TSockAddrIn = sockaddr_in;
PSockAddrIn = ^TSockAddrIn;
PSockAddr_In = PSockAddrIn;
TSockAddr = TSockAddrIn;
SOCKADDR = TSockAddr;
PSOCKADDR = ^TSockAddr;
LPSOCKADDR = PSOCKADDR;
TSocket = NativeUInt;
// Fwpuclnt.dll - API
LPFN_WSASetSocketSecurity = function(socket: TSocket;
SecuritySettings: PSOCKET_SECURITY_SETTINGS; const SecuritySettingsLen: ULONG;
OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
LPFN_WSADELETESOCKETPEERTARGETNAME = function(socket: TSocket;
PeerAddr: PSOCKADDR; PeerAddrLen: ULONG;
OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
LPFN_WSASETSOCKETPEERTARGETNAME = function(socket: TSocket;
PeerTargetName: PSOCKET_PEER_TARGET_NAME; PeerTargetNameLen: ULONG;
OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
LPFN_WSAIMPERSONATESOCKETPEER = function(socket: TSocket;
PeerAddress: PSOCKADDR; peerAddressLen: ULONG): integer; stdcall;
LPFN_WSAQUERYSOCKETSECURITY = function(socket: TSocket;
SecurityQueryTemplate: PSOCKET_SECURITY_QUERY_TEMPLATE; const SecurityQueryTemplateLen: ULONG;
SecurityQueryInfo: PSOCKET_SECURITY_QUERY_INFO; var SecurityQueryInfoLen: ULONG;
OVERLAPPED: LPWSAOVERLAPPED; CompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): integer; stdcall;
LPFN_WSAREVERTIMPERSONATION = function: integer; stdcall;
const
fwpuclnt_dll = 'Fwpuclnt.dll'; { Do not localize }
var
hfwpuclntDll: THandle = 0;
var
WSASetSocketSecurity: LPFN_WSASetSocketSecurity = nil;
WSASetSocketPeerTargetName: LPFN_WSASETSOCKETPEERTARGETNAME = nil;
WSADeleteSocketPeerTargetName: LPFN_WSADELETESOCKETPEERTARGETNAME = nil;
WSAImpersonateSocketPeer: LPFN_WSAIMPERSONATESOCKETPEER = nil;
WSAQUERYSOCKETSECURITY: LPFN_WSAQUERYSOCKETSECURITY = nil;
WSARevertImpersonation: LPFN_WSAREVERTIMPERSONATION = nil;
procedure InitLibrary_Fwpuclnt;
begin
hfwpuclntDll := SafeLoadLibrary(fwpuclnt_dll);
if hfwpuclntDll <> 0 then
begin
WSASetSocketSecurity := GetProcAddress(hfwpuclntDll, 'WSASetSocketSecurity');
WSAQUERYSOCKETSECURITY := GetProcAddress(hfwpuclntDll, 'WSAQuerySocketSecurity'); { Do not localize }
WSASetSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSASetSocketPeerTargetName'); { Do not localize }
WSADeleteSocketPeerTargetName := GetProcAddress(hfwpuclntDll, 'WSADeleteSocketPeerTargetName'); { Do not localize }
WSAImpersonateSocketPeer := GetProcAddress(hfwpuclntDll, 'WSAImpersonateSocketPeer'); { Do not localize }
WSARevertImpersonation := GetProcAddress(hfwpuclntDll, 'WSARevertImpersonation'); { Do not localize }
end;
end;
Bookmarks