⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpc_binding.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
}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 + -