BSOne.SFC/Tocsg.Module/AppCtrl/DLL_AppCtrl/ApiHookNet.pas

78 lines
3.0 KiB
Plaintext

{*******************************************************}
{ }
{ ApiHookNet }
{ }
{ Copyright (C) 2023 kku }
{ }
{*******************************************************}
unit ApiHookNet;
interface
uses
Winapi.Windows, EM.Dnsapi, System.SysUtils;
const
DNS_ERROR_RCODE_YXDOMAIN = $232E;
type
TFun_DnsQuery_A = function(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
TFun_DnsQuery_UTF8 = function(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
TFun_DnsQuery_W = function(lpstrName: LPWSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
TFun_DnsQueryEx = function(pQueryRequest: PDnsQueryRequest; pQueryResults, pCancelHandle: Pointer): DWORD; stdcall;
var
ozDnsQuery_A: TFun_DnsQuery_A = nil;
ozDnsQuery_UTF8: TFun_DnsQuery_UTF8 = nil;
ozDnsQuery_W: TFun_DnsQuery_W = nil;
ozDnsQueryEx: TFun_DnsQueryEx = nil;
implementation
function CheckBlockDomain(sDomain: String): Boolean;
begin
// _AppHook.Log('CheckBlockDomain() ..');
Result := Pos('google', LowerCase(sDomain)) > 0;
end;
function DnsQuery_AHook(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
begin
if CheckBlockDomain(StrPas(lpstrName)) then
Result := DNS_ERROR_RCODE_YXDOMAIN
else
Result := ozDnsQuery_A(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved);
end;
function DnsQuery_UTF8Hook(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
begin
if CheckBlockDomain(StrPas(lpstrName)) then
Result := DNS_ERROR_RCODE_YXDOMAIN
else
Result := ozDnsQuery_UTF8(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved);
end;
function DnsQuery_WHook(lpstrName: LPWSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD;
var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall;
begin
if CheckBlockDomain(StrPas(lpstrName)) then
Result := DNS_ERROR_RCODE_YXDOMAIN
else
Result := ozDnsQuery_W(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved);
end;
function DnsQueryExHook(pQueryRequest: PDnsQueryRequest; pQueryResults, pCancelHandle: Pointer): DWORD; stdcall;
begin
if CheckBlockDomain(StrPas(pQueryRequest.sQueryName)) then
Result := ERROR_INVALID_PARAMETER
else
Result := ozDnsQueryEx(pQueryRequest, pQueryResults, pCancelHandle);
end;
end.