国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

CoInitializeEx、CoInitializeSecurity函數

2019-11-06 06:39:31
字體:
來源:轉載
供稿:網友

0x01.CoInitializeEx函數

初始化COM庫以供調用線程使用,設置線程的并發模型,并為線程創建一個新公寓(如果需要)。 如果要使用Windows運行時API,或者要使用COM和Windows運行時組件,則應調用Windows::Foundation::Initialize初始化線程而不是CoInitializeExWindows::Foundation ::Initialize足以用于COM組件。

HRESULT CoInitializeEx( _In_opt_ LPVOID pvReserved, _In_ DWord dwCoInit);

參數

pvReserved [in,optional]

此參數保留,必須為NULL。

dwCoInit [in]

線程的并發模型和初始化選項。 此參數的值取自COINIT枚舉。 可以使用來自COINIT的值的任何組合,但不能同時設置COINIT_APARTMENTTHREADEDCOINIT_MULTITHREADED標志。 默認值為COINIT_MULTITHREADED

返回值

此函數可返回標準返回值E_INVALIDARGE_OUTOFMEMORYE_UNEXPECTED,以及以下值。

Return code Description
S_OK COM庫已在此線程上成功初始化。
S_FALSE COM庫已在此線程上初始化。
RPC_E_CHANGED_MODE 先前對CoInitializeEx的調用將此線程的并發模型指定為多線程公寓(MTA)。 這也可以表明從中線螺紋公寓到單線螺紋公寓已經發生了變化。

備注

CoInitializeEx必須至少調用一次,對于使用COM庫的每個線程,它通常只調用一次。允許由同一線程對CoInitializeEx的多個調用,只要它們傳遞相同的并發標志,但隨后的有效調用返回S_FALSE。要在線程上正常關閉COM庫,每次成功調用CoInitializeCoInitializeEx(包括返回S_FALSE的任何調用)都必須通過對CoUninitialize的相應調用來平衡。 您需要在調用任何庫函數(CoGetMalloc除外)之前初始化線程上的COM庫,以獲取指向標準分配器的指針和內存分配函數。否則,COM函數將返回CO_E_NOTINITIALIZED

在設置線程的并發模型后,不能更改。對以前初始化為多線程的公寓的CoInitialize調用將失敗,并返回RPC_E_CHANGED_MODE

在單線程公寓(STA)中創建的對象僅從其公寓的線程接收方法調用,因此調用被序列化,并僅到達消息隊列邊界(當調用PeekMessageSendMessage函數時)。在多線程公寓(MTA)中的COM線程上創建的對象必須能夠隨時從其他線程接收方法調用。通常在多線程對象的代碼中使用同步原語(如關鍵部分,信號量或互斥體)來實現某種形式的并發控制,以幫助保護對象的數據。當配置為在中性線程公寓(NTA)中運行的對象由STAMTA中的線程調用時,該線程傳輸到NTA。如果此線程隨后調用CoInitializeEx,調用失敗并返回RPC_E_CHANGED_MODE

因為OLE技術不是線程安全的,所以OleInitialize函數使用COINIT_APARTMENTTHREADED標志調用CoInitializeEx。因此,為多線程對象并發初始化的公寓不能使用OleInitialize啟用的功能。

因為沒有辦法控制加載或卸載進程內服務器的順序,所以不要從DllMain函數調用CoInitializeCoInitializeExCoUninitialize

Requirements

Minimum supported client Windows 2000 PRofessional[desktop apps or Windows Store apps]
Minimum supported server Windows 2000 Server [desktop apps
Minimum supported phone Windows Phone 8
Header Objbase.h
Library Ole32.lib
DLL Ole32.dll

0x02.CoInitializeSecurity函數

注冊安全性并設置進程的默認安全值。HRESULT CoInitializeSecurity( _In_opt_ PSECURITY_DESCRIPTOR pSecDesc, _In_ LONG cAuthSvc, _In_opt_ SOLE_AUTHENTICATION_SERVICE *asAuthSvc, _In_opt_ void *pReserved1, _In_ DWORD dwAuthnLevel, _In_ DWORD dwImpLevel, _In_opt_ void *pAuthList, _In_ DWORD dwCapabilities, _In_opt_ void *pReserved3);

參數

pSecDesc [in,optional]

服務器將用于接收呼叫的訪問權限。 只有當服務器調用CoInitializeSecurity時,COM才使用此參數。 它的值是一個指向三種類型之一的指針:一個AppID,一個IaccessControl對象或一個SECURITY_DESCRIPTOR,以絕對格式。

cAuthSvc [in]

asAuthSvc參數中的條目計數。 只有當服務器調用CoInitializeSecurity時,COM才使用此參數。 如果此參數為0,則不會注冊認證服務,并且服務器無法接收安全呼叫。 值-1指示COM選擇要注冊的認證服務,如果是這種情況,則asAuthSvc參數必須為NULL。 但是,如果此參數為-1,則Schannel將永遠不會被服務器選為認證服務。

asAuthSvc [in,optional]

服務器愿意用于接收呼叫的身份驗證服務數組。 只有當服務器調用CoInitializeSecurity時,COM才使用此參數。 有關詳細信息,請參閱SOLE_AUTHENTICATION_SERVICE

pReserved1 [in,optional]

此參數保留,必須為NULL

dwAuthnLevel [in]

進程的默認身份驗證級別。服務器和客戶端在調用CoInitializeSecurity時都使用此參數。 COM將失敗以較低認證級別到達的呼叫。默認情況下,所有代理將至少使用此身份驗證級別。此值應包含一個認證級別常量。默認情況下,所有對IUnknown的調用都是在此級別進行的。

dwImpLevel [in]

代理的默認模擬級別。此參數的值僅在進程是客戶端時使用。它應該是來自模擬級別常量的值,RPC_C_IMP_LEVEL_DEFAULT除外,不能與CoInitializeSecurity一起使用。

來自客戶端的撥出呼叫始終使用指定的模擬級別。 (不是協商的。)對客戶端的來電可以是任何模擬級別。默認情況下,所有IUnknown調用都使用此模擬級別,因此即使安全感知應用程序也應仔細設置此級別。要確定每個認證服務支持的模擬級別,請參閱COM和安全軟件包中的認證服務的描述。有關模擬級別的詳細信息,請參閱模擬。

pAuthList [in,optional]

指向SOLE_AUTHENTICATION_LIST的指針,它是一個SOLE_AUTHENTICATION_INFO結構的數組。此列表指示客戶機可用于調用服務器的每個認證服務的信息。只有當客戶端調用CoInitializeSecurity時,COM才使用此參數。

dwCapabilities [in]

通過設置一個或多個EOLE_AUTHENTICATION_CAPABILITIES值指定的客戶端或服務器的其他功能。其中某些值不能同時使用,有些不能在使用特定認證服務時設置。有關這些標志的更多信息,請參閱備注部分。

pReserved3 [in,可選]

此參數保留,必須為NULL。

返回值

此函數可以返回標準返回值E_INVALIDARG以及以下值。

Return code Description
S_OK 表示成功。
RPC_E_TOO_LATE CoInitializeSecurity已被調用。
RPC_E_NO_GOOD_SECURITY_PACKAGES asAuthSvc參數不為NULL,并且列表中的所有身份驗證服務都不能注冊。 檢查保存在asAuthSvc中的結果以獲取身份驗證服務特定的錯誤代碼。
E_OUT_OF_MEMORY 內存不足。

備注

CoInitializeSecurity函數初始化安全層,并將指定的值設置為安全性默認值。如果進程不調用CoInitializeSecurity,則COM在第一次編組或解組接口時自動調用它,注冊系統默認安全性。之前沒有注冊默認安全軟件包。

這個函數每個進程只被調用一次,無論是顯式還是隱式。它可以由客戶端,服務器或兩者調用。對于沒有顯式調用CoInitializeSecurity的傳統應用程序和其他應用程序,COM使用注冊表中的值隱式調用此函數。如果使用注冊表設置過程范圍安全性,然后調用CoInitializeSecurity,那么將忽略AppID注冊表值,并使用CoInitializeSecurity值。

CoInitializeSecurity可用于覆蓋計算機范圍的訪問權限和特定于應用程序的訪問權限,但不能覆蓋計算機范圍的限制策略。 如果pSecDesc指向AppID,則必須在dwCapabilities中設置EOAC_APPID標志,并且當設置EOAC_APPID標志時,將忽略CoInitializeSecurity的所有其他參數。

CoInitializeSecurity在注冊表中的AppID鍵下查找認證級別,并使用它來確定默認安全性。有關如何使用AppID密鑰設置安全性的更多信息,請參閱通過注冊表設置流程范圍的安全性。 如果pSecDesc是指向IAccessControl對象的指針,則必須設置EOAC_ACCESS_CONTROL標志,并且dwAuthnLevel不能為noneIAccessControl對象用于確定誰可以調用進程。 DCOMAddRef IAccessControl,并將在調用CoUninitialize時釋放它。不應更改IAccessControl對象的狀態。

如果pSecDesc是指向SECURITY_DESCRIPTOR的指針,則在dwCapabilities中不能設置EOAC_APPIDEOAC_ACCESS_CONTROL標志。必須設置SECURITY_DESCRIPTOR的所有者和組,直到DCOM支持審核,系統ACL必須為NULLSECURITY_DESCRIPTOR的自由ACLDACL)中的訪問控制條目(ACE)用于查找允許哪些調用者連接到進程的對象。沒有ACEDACL不允許訪問,而NULL DACL將允許任何人的調用。有關ACLACE的更多信息,請參閱訪問控制模型。應用程序應調用AccessCheck(而不是IsValidSecurityDescriptor),以確保在調用CoInitializeSecurity之前正確形成其SECURITY_DESCRIPTOR

強烈建議不要將pSecDesc傳遞為NULL。一個適當的替代方法是使用允許EveryoneSECURITY_DESCRIPTOR。如果pSecDescNULL,dwCapabilities中的標志確定CoInitializeSecurity如何定義服務器將使用的訪問權限,如下所示:

如果設置了EOAC_APPID標志,CoInitializeSecurity將在注冊表中查找應用程序的.exe名稱,并使用存儲在那里的AppID。如果設置了EOAC_ACCESS_CONTROL標志,CoInitializeSecurity將返回錯誤。如果既沒有設置EOAC_APPID標志也沒有設置EOAC_ACCESS_CONTROL標志,CoInitializeSecurity允??許所有呼叫者,包括本地和遠程匿名用戶。

如果在dwCapabilities中設置了EOAC_APPIDEOAC_ACCESS_CONTROL標志,則CoInitializeSecurity函數返回錯誤。

函數庫文件同上。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海南省| 托克托县| 西乌珠穆沁旗| 南雄市| 洛宁县| 义马市| 韩城市| 湘西| 丽江市| 菏泽市| 彰武县| 宁陵县| 科尔| 青州市| 乃东县| 全南县| 布尔津县| 平原县| 麻阳| 额敏县| 南雄市| 旌德县| 九江市| 阿城市| 大石桥市| 宜阳县| 满洲里市| 乌兰浩特市| 屏边| 灵山县| 锦州市| 峨边| 海盐县| 久治县| 灵璧县| 菏泽市| 浙江省| 沁水县| 沧州市| 澳门| 崇左市|