繁体   English   中英

如何以编程方式清除WinInet SSL状态(是否有Windows API调用)?

[英]How to clear WinInet SSL state programmatically (is there a Windows API call)?

我需要使用Delphi中的API函数模仿与“ Internet选项”对话框(“目录”选项卡)中的“清除SSL状态”按钮相同的行为。

我的目的是将其与WinInet一起使用以建立后续的独立SSL连接。 没有此,两个WinInet连接共享相同的SSL状态,例如,阻止我纠正错误的SSL证书密码。

在两次连接尝试之间未清除SSL状态的情况下,第一个返回“密码错误”,然后我更正密码并重试,但是第二次尝试返回“安全通道支持错误”。

“清除SSL状态”按钮仅执行以下未记录的命令行命令:

"C:\Windows\system32\rundll32.exe" "C:\Windows\system32\WININET.dll",DispatchAPICall 3

使用CreateProcess()在您的Delphi代码中执行相同的命令。

您是对的:如果rundll可以做到,则可以通过编程方式做到:

//somewhere in an interface section:
procedure DispatchAPICall(h: HWND; hinst: HINST; lpszCmdLine: PAnsiChar; nCmdShow: integer); stdcall;

//somewhere in the implementation section:
function DispatchAPICall; external 'wininet.dll';

//somewhere in your code:
DispatchAPICall(GetDesktopWindow(), GetModuleHandle('wininet.dll'), '3', SW_NORMAL);

最后! 我实现了!

我使用了出色的API Monitor来监视整个“ Internet选项”对话框,并且设法找到“清除SSL状态”按钮的功能。 它仅按此顺序执行两个API调用SslEmptyCacheIncrementUrlCacheHeaderData

API监视器,在“清除SSL状态”按钮下方显示两个API调用

发现这一点后,我得以实现以下代码,并在请求之前执行了该代码:

type
    TSslEmptyCache = function (pszTargetName: LPSTR; dwFlags: DWORD): BOOL; WINAPI;
    TIncrementUrlCacheHeaderData = function (nIdx: DWORD; lpdwData: LPDWORD): BOOL; WINAPI;

var
    SchannelDLLHandle, WinInetHandle: HMODULE;
    SslEmptyCache: TSslEmptyCache;
    IncrementUrlCacheHeaderData: TIncrementUrlCacheHeaderData;

SchannelDLLHandle := LoadLibrary('schannel.dll');
WinInetHandle := LoadLibrary('wininet.dll');

if (SchannelDLLHandle > 0) and (WinInetHandle > 0) then
    try
        SslEmptyCache := GetProcAddress(SchannelDLLHandle,'SslEmptyCacheW');
        IncrementUrlCacheHeaderData := GetProcAddress(WinInetHandle,'IncrementUrlCacheHeaderData');

        if Assigned(SslEmptyCache) and Assigned(IncrementUrlCacheHeaderData) then
        begin
            SslEmptyCache(nil,0);
            IncrementUrlCacheHeaderData(14,@buffer);
        end;
    finally
        FreeLibrary(SchannelDLLHandle);
        FreeLibrary(WinInetHandle);
    end;

当然,这是一个伪代码,但这是完整的;)

SslEmptyCache函数在MSDN上有文档,但是IncrementUrlCacheHeaderData函数没有文档,因此我不得不多做一些研究,以发现第二个参数必须是PDWORD,该函数返回时,它会接收一个增量数,在两次调用之间,该函数是持久的。在不同的过程中(不同的应用程序)。

有关更多信息,您可以在我解释我所有传奇的地方访问本文 文字为葡萄牙语,但该网站提供了不错的翻译工具。

我要感谢大家的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM