📄 rpc_binding.c
字号:
}BOOL RpcQualityOfService_IsEqual(const RpcQualityOfService *qos1, const RpcQualityOfService *qos2){ if (qos1 == qos2) return TRUE; if (!qos1 || !qos2) return FALSE; TRACE("qos1 = { %ld %ld %ld %ld }, qos2 = { %ld %ld %ld %ld }\n", qos1->qos->Capabilities, qos1->qos->IdentityTracking, qos1->qos->ImpersonationType, qos1->qos->AdditionalSecurityInfoType, qos2->qos->Capabilities, qos2->qos->IdentityTracking, qos2->qos->ImpersonationType, qos2->qos->AdditionalSecurityInfoType); if ((qos1->qos->Capabilities != qos2->qos->Capabilities) || (qos1->qos->IdentityTracking != qos2->qos->IdentityTracking) || (qos1->qos->ImpersonationType != qos2->qos->ImpersonationType) || (qos1->qos->AdditionalSecurityInfoType != qos2->qos->AdditionalSecurityInfoType)) return FALSE; if (qos1->qos->AdditionalSecurityInfoType == RPC_C_AUTHN_INFO_TYPE_HTTP) { const RPC_HTTP_TRANSPORT_CREDENTIALS_W *http_credentials1 = qos1->qos->u.HttpCredentials; const RPC_HTTP_TRANSPORT_CREDENTIALS_W *http_credentials2 = qos2->qos->u.HttpCredentials; if (http_credentials1->Flags != http_credentials2->Flags) return FALSE; if (http_credentials1->AuthenticationTarget != http_credentials2->AuthenticationTarget) return FALSE; /* authentication schemes and server certificate subject not currently used */ if (http_credentials1->TransportCredentials != http_credentials2->TransportCredentials) { const SEC_WINNT_AUTH_IDENTITY_W *identity1 = http_credentials1->TransportCredentials; const SEC_WINNT_AUTH_IDENTITY_W *identity2 = http_credentials2->TransportCredentials; if (!identity1 || !identity2) return FALSE; /* compare user names */ if (identity1->UserLength != identity2->UserLength || memcmp(identity1->User, identity2->User, identity1->UserLength)) return FALSE; /* compare domain names */ if (identity1->DomainLength != identity2->DomainLength || memcmp(identity1->Domain, identity2->Domain, identity1->DomainLength)) return FALSE; /* compare passwords */ if (identity1->PasswordLength != identity2->PasswordLength || memcmp(identity1->Password, identity2->Password, identity1->PasswordLength)) return FALSE; } } return TRUE;}/*********************************************************************** * RpcRevertToSelf (RPCRT4.@) */RPC_STATUS WINAPI RpcRevertToSelf(void){ FIXME("stub\n"); RevertToSelf(); return RPC_S_OK;}/*********************************************************************** * RpcMgmtSetComTimeout (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtSetComTimeout(RPC_BINDING_HANDLE BindingHandle, unsigned int Timeout){ FIXME("(%p, %d): stub\n", BindingHandle, Timeout); return RPC_S_OK;}/*********************************************************************** * RpcBindingInqAuthInfoExA (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingInqAuthInfoExA( RPC_BINDING_HANDLE Binding, RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc, ULONG RpcQosVersion, RPC_SECURITY_QOS *SecurityQOS ){ FIXME("%p %p %p %p %p %p %u %p\n", Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvc, RpcQosVersion, SecurityQOS); return RPC_S_INVALID_BINDING;}/*********************************************************************** * RpcBindingInqAuthInfoExW (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingInqAuthInfoExW( RPC_BINDING_HANDLE Binding, RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc, ULONG RpcQosVersion, RPC_SECURITY_QOS *SecurityQOS ){ FIXME("%p %p %p %p %p %p %u %p\n", Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvc, RpcQosVersion, SecurityQOS); return RPC_S_INVALID_BINDING;}/*********************************************************************** * RpcBindingInqAuthInfoA (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingInqAuthInfoA( RPC_BINDING_HANDLE Binding, RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc ){ FIXME("%p %p %p %p %p %p\n", Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvc); return RPC_S_INVALID_BINDING;}/*********************************************************************** * RpcBindingInqAuthInfoW (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingInqAuthInfoW( RPC_BINDING_HANDLE Binding, RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc ){ FIXME("%p %p %p %p %p %p\n", Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvc); return RPC_S_INVALID_BINDING;}/*********************************************************************** * RpcBindingSetAuthInfoExA (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingSetAuthInfoExA( RPC_BINDING_HANDLE Binding, RPC_CSTR ServerPrincName, ULONG AuthnLevel, ULONG AuthnSvc, RPC_AUTH_IDENTITY_HANDLE AuthIdentity, ULONG AuthzSvr, RPC_SECURITY_QOS *SecurityQos ){ RpcBinding* bind = (RpcBinding*)Binding; SECURITY_STATUS r; CredHandle cred; TimeStamp exp; ULONG package_count; ULONG i; PSecPkgInfoA packages; ULONG cbMaxToken; TRACE("%p %s %u %u %p %u %p\n", Binding, debugstr_a((const char*)ServerPrincName), AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, SecurityQos); if (SecurityQos) { RPC_STATUS status; TRACE("SecurityQos { Version=%ld, Capabilties=0x%lx, IdentityTracking=%ld, ImpersonationLevel=%ld", SecurityQos->Version, SecurityQos->Capabilities, SecurityQos->IdentityTracking, SecurityQos->ImpersonationType); if (SecurityQos->Version >= 2) { const RPC_SECURITY_QOS_V2_A *SecurityQos2 = (const RPC_SECURITY_QOS_V2_A *)SecurityQos; TRACE(", AdditionalSecurityInfoType=%ld", SecurityQos2->AdditionalSecurityInfoType); if (SecurityQos2->AdditionalSecurityInfoType == RPC_C_AUTHN_INFO_TYPE_HTTP) TRACE(", { %p, 0x%lx, %ld, %ld, %p, %s }", SecurityQos2->u.HttpCredentials->TransportCredentials, SecurityQos2->u.HttpCredentials->Flags, SecurityQos2->u.HttpCredentials->AuthenticationTarget, SecurityQos2->u.HttpCredentials->NumberOfAuthnSchemes, SecurityQos2->u.HttpCredentials->AuthnSchemes, SecurityQos2->u.HttpCredentials->ServerCertificateSubject); } TRACE("}\n"); status = RpcQualityOfService_Create(SecurityQos, FALSE, &bind->QOS); if (status != RPC_S_OK) return status; } else { if (bind->QOS) RpcQualityOfService_Release(bind->QOS); bind->QOS = NULL; } if (AuthnSvc == RPC_C_AUTHN_DEFAULT) AuthnSvc = RPC_C_AUTHN_WINNT; /* FIXME: the mapping should probably be retrieved using SSPI somehow */ if (AuthnLevel == RPC_C_AUTHN_LEVEL_DEFAULT) AuthnLevel = RPC_C_AUTHN_LEVEL_NONE; if ((AuthnLevel == RPC_C_AUTHN_LEVEL_NONE) || (AuthnSvc == RPC_C_AUTHN_NONE)) { if (bind->AuthInfo) RpcAuthInfo_Release(bind->AuthInfo); bind->AuthInfo = NULL; return RPC_S_OK; } if (AuthnLevel > RPC_C_AUTHN_LEVEL_PKT_PRIVACY) { FIXME("unknown AuthnLevel %u\n", AuthnLevel); return RPC_S_UNKNOWN_AUTHN_LEVEL; } if (AuthzSvr) { FIXME("unsupported AuthzSvr %u\n", AuthzSvr); return RPC_S_UNKNOWN_AUTHZ_SERVICE; } r = EnumerateSecurityPackagesA(&package_count, &packages); if (r != SEC_E_OK) { ERR("EnumerateSecurityPackagesA failed with error 0x%08x\n", r); return RPC_S_SEC_PKG_ERROR; } for (i = 0; i < package_count; i++) if (packages[i].wRPCID == AuthnSvc) break; if (i == package_count) { FIXME("unsupported AuthnSvc %u\n", AuthnSvc); FreeContextBuffer(packages); return RPC_S_UNKNOWN_AUTHN_SERVICE; } TRACE("found package %s for service %u\n", packages[i].Name, AuthnSvc); r = AcquireCredentialsHandleA((SEC_CHAR *)ServerPrincName, packages[i].Name, SECPKG_CRED_OUTBOUND, NULL, AuthIdentity, NULL, NULL, &cred, &exp); cbMaxToken = packages[i].cbMaxToken; FreeContextBuffer(packages); if (r == ERROR_SUCCESS) { if (bind->AuthInfo) RpcAuthInfo_Release(bind->AuthInfo); bind->AuthInfo = NULL; r = RpcAuthInfo_Create(AuthnLevel, AuthnSvc, cred, exp, cbMaxToken, AuthIdentity, &bind->AuthInfo); if (r != RPC_S_OK) FreeCredentialsHandle(&cred); return RPC_S_OK; } else { ERR("AcquireCredentialsHandleA failed with error 0x%08x\n", r); return RPC_S_SEC_PKG_ERROR; }}/*********************************************************************** * RpcBindingSetAuthInfoExW (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingSetAuthInfoExW( RPC_BINDING_HANDLE Binding, RPC_WSTR ServerPrincName, ULONG AuthnLevel, ULONG AuthnSvc, RPC_AUTH_IDENTITY_HANDLE AuthIdentity, ULONG AuthzSvr, RPC_SECURITY_QOS *SecurityQos ){ RpcBinding* bind = (RpcBinding*)Binding; SECURITY_STATUS r; CredHandle cred; TimeStamp exp; ULONG package_count; ULONG i; PSecPkgInfoW packages; ULONG cbMaxToken; TRACE("%p %s %u %u %p %u %p\n", Binding, debugstr_w((const WCHAR*)ServerPrincName), AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, SecurityQos); if (SecurityQos) { RPC_STATUS status; TRACE("SecurityQos { Version=%ld, Capabilties=0x%lx, IdentityTracking=%ld, ImpersonationLevel=%ld", SecurityQos->Version, SecurityQos->Capabilities, SecurityQos->IdentityTracking, SecurityQos->ImpersonationType); if (SecurityQos->Version >= 2) { const RPC_SECURITY_QOS_V2_W *SecurityQos2 = (const RPC_SECURITY_QOS_V2_W *)SecurityQos; TRACE(", AdditionalSecurityInfoType=%ld", SecurityQos2->AdditionalSecurityInfoType); if (SecurityQos2->AdditionalSecurityInfoType == RPC_C_AUTHN_INFO_TYPE_HTTP) TRACE(", { %p, 0x%lx, %ld, %ld, %p, %s }", SecurityQos2->u.HttpCredentials->TransportCredentials, SecurityQos2->u.HttpCredentials->Flags, SecurityQos2->u.HttpCredentials->AuthenticationTarget, SecurityQos2->u.HttpCredentials->NumberOfAuthnSchemes, SecurityQos2->u.HttpCredentials->AuthnSchemes, debugstr_w(SecurityQos2->u.HttpCredentials->ServerCertificateSubject)); } TRACE("}\n"); status = RpcQualityOfService_Create(SecurityQos, TRUE, &bind->QOS); if (status != RPC_S_OK) return status; } else { if (bind->QOS) RpcQualityOfService_Release(bind->QOS); bind->QOS = NULL; } if (AuthnSvc == RPC_C_AUTHN_DEFAULT) AuthnSvc = RPC_C_AUTHN_WINNT; /* FIXME: the mapping should probably be retrieved using SSPI somehow */ if (AuthnLevel == RPC_C_AUTHN_LEVEL_DEFAULT) AuthnLevel = RPC_C_AUTHN_LEVEL_NONE; if ((AuthnLevel == RPC_C_AUTHN_LEVEL_NONE) || (AuthnSvc == RPC_C_AUTHN_NONE)) { if (bind->AuthInfo) RpcAuthInfo_Release(bind->AuthInfo); bind->AuthInfo = NULL; return RPC_S_OK; } if (AuthnLevel > RPC_C_AUTHN_LEVEL_PKT_PRIVACY) { FIXME("unknown AuthnLevel %u\n", AuthnLevel); return RPC_S_UNKNOWN_AUTHN_LEVEL; } if (AuthzSvr) { FIXME("unsupported AuthzSvr %u\n", AuthzSvr); return RPC_S_UNKNOWN_AUTHZ_SERVICE; } r = EnumerateSecurityPackagesW(&package_count, &packages); if (r != SEC_E_OK) { ERR("EnumerateSecurityPackagesA failed with error 0x%08x\n", r); return RPC_S_SEC_PKG_ERROR; } for (i = 0; i < package_count; i++) if (packages[i].wRPCID == AuthnSvc) break; if (i == package_count) { FIXME("unsupported AuthnSvc %u\n", AuthnSvc); FreeContextBuffer(packages); return RPC_S_UNKNOWN_AUTHN_SERVICE; } TRACE("found package %s for service %u\n", debugstr_w(packages[i].Name), AuthnSvc); r = AcquireCredentialsHandleW((SEC_WCHAR *)ServerPrincName, packages[i].Name, SECPKG_CRED_OUTBOUND, NULL, AuthIdentity, NULL, NULL, &cred, &exp); cbMaxToken = packages[i].cbMaxToken; FreeContextBuffer(packages); if (r == ERROR_SUCCESS) { if (bind->AuthInfo) RpcAuthInfo_Release(bind->AuthInfo); bind->AuthInfo = NULL; r = RpcAuthInfo_Create(AuthnLevel, AuthnSvc, cred, exp, cbMaxToken, AuthIdentity, &bind->AuthInfo); if (r != RPC_S_OK) FreeCredentialsHandle(&cred); return RPC_S_OK; } else { ERR("AcquireCredentialsHandleA failed with error 0x%08x\n", r); return RPC_S_SEC_PKG_ERROR; }}/*********************************************************************** * RpcBindingSetAuthInfoA (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingSetAuthInfoA( RPC_BINDING_HANDLE Binding, RPC_CSTR ServerPrincName, ULONG AuthnLevel, ULONG AuthnSvc, RPC_AUTH_IDENTITY_HANDLE AuthIdentity, ULONG AuthzSvr ){ TRACE("%p %s %u %u %p %u\n", Binding, debugstr_a((const char*)ServerPrincName), AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr); return RpcBindingSetAuthInfoExA(Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, NULL);}/*********************************************************************** * RpcBindingSetAuthInfoW (RPCRT4.@) */RPCRTAPI RPC_STATUS RPC_ENTRYRpcBindingSetAuthInfoW( RPC_BINDING_HANDLE Binding, RPC_WSTR ServerPrincName, ULONG AuthnLevel, ULONG AuthnSvc, RPC_AUTH_IDENTITY_HANDLE AuthIdentity, ULONG AuthzSvr ){ TRACE("%p %s %u %u %p %u\n", Binding, debugstr_w((const WCHAR*)ServerPrincName), AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr); return RpcBindingSetAuthInfoExW(Binding, ServerPrincName, AuthnLevel, AuthnSvc, AuthIdentity, AuthzSvr, NULL);}/*********************************************************************** * RpcBindingSetOption (RPCRT4.@) */RPC_STATUS WINAPI RpcBindingSetOption(RPC_BINDING_HANDLE BindingHandle, ULONG Option, ULONG OptionValue){ FIXME("(%p, %d, %d): stub\n", BindingHandle, Option, OptionValue); return RPC_S_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -