簡體   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