Поделиться через


структура RPC_CALL_ATTRIBUTES_V1_W (rpcasync.h)

Структура RPC_CALL_ATTRIBUTES_V1 предоставляет параметры функции RpcServerInqCallAttributes . Реализовано в версиях ANSI и UNICODE для операционных систем Windows XP и Windows Server 2003.

Синтаксис

typedef struct tagRPC_CALL_ATTRIBUTES_V1_W {
  unsigned int   Version;
  unsigned long  Flags;
  unsigned long  ServerPrincipalNameBufferLength;
  unsigned short *ServerPrincipalName;
  unsigned long  ClientPrincipalNameBufferLength;
  unsigned short *ClientPrincipalName;
  unsigned long  AuthenticationLevel;
  unsigned long  AuthenticationService;
  BOOL           NullSession;
} RPC_CALL_ATTRIBUTES_V1_W;

Члены

Version

Версия функции RpcServerInqCallAttributes , используемой вызывающим приложением. См. заметки.

Flags

Битовая маска, указывающая допустимые флаги для запроса RPC_QUERY_SERVER_PRINCIPAL_NAME или RPC_QUERY_CLIENT_PRINCIPAL_NAME. См. заметки.

ServerPrincipalNameBufferLength

Длина serverPrincipalName в байтах. Если значение недостаточно, Значение ServerPrincipalName не изменяется, а ServerPrincipalNameBufferLength указывает необходимую длину буфера, включая завершающий символ NULL , и возвращается ERROR_MORE_DATA. Если serverPrincipalNameBufferLength длиннее, чем необходимо, при возврате ему присваивается фактическая используемая длина в байтах, включая завершающий символ NULL . См. заметки.

Если последовательность протоколов не поддерживает получение имени участника-сервера, значение ServerPrincipalNameBufferLength при возврате равно нулю, а буфер, на который указывает ServerPrincipalName , не изменяется. Windows XP: Только группа последовательностей протоколов ncacn_* поддерживает получение имени участника-сервера.

Если флаг RPC_QUERY_SERVER_PRINCIPAL_NAME не указан, параметр ServerPrincipalNameBufferLength игнорируется. Если serverPrincipalNameBufferLength не равно нулю, а ServerPrincipalName имеет значение NULL, возвращается ERROR_INVALID_PARAMETER.

ServerPrincipalName

Указатель на имя участника-сервера, если он запрашивается в разделе Флаги и поддерживается последовательностью протокола. При любом возвращаемом значении, отличном от RPC_S_OK или ERROR_MORE_DATA, содержимое ServerPrincipalName не определено и может быть изменено RPC.

ClientPrincipalNameBufferLength

Длина буфера, на который указывает ClientPrincipalName, в байтах. Если значение недостаточно, clientPrincipalName не изменяется, а ClientPrincipalNameBufferLength указывает необходимую длину буфера, включая завершающий символ NULL , и возвращается ERROR_MORE_DATA. Если clientPrincipalNameBufferLength длиннее, чем необходимо, при возврате ему присваивается используемая фактическая длина в байтах, включая завершающий символ NULL .

Если последовательность протоколов не поддерживает получение имени участника клиента, clientPrincipalNameBufferLength при возврате задается равным нулю, а буфер, на который указывает ClientPrincipalName , не изменяется. Windows XP: Только последовательность протокола ncalrpc поддерживает получение имени участника клиента.

Если флаг RPC_QUERY_CLIENT_PRINCIPAL_NAME не указан, clientPrincipalNameBufferLength игнорируется. Если свойство ClientPrincipalNameBufferLength не равно нулю, а ClientPrincipalName имеет значение NULL, возвращается ERROR_INVALID_PARAMETER.

ClientPrincipalName

Указатель на имя субъекта клиента, если он запрашивается в элементе Flags и поддерживается последовательностью протокола. При любом возвращаемом значении, отличном от RPC_S_OK или ERROR_MORE_DATA, содержимое ClientPrincipalName не определено и может быть изменено RPC.

AuthenticationLevel

Уровень проверки подлинности для вызова. Уровни проверки подлинности, поддерживаемые RPC, см. в разделе Authentication-Level Constants (Константы уровня проверки подлинности).

AuthenticationService

Служба проверки подлинности или поставщик безопасности, используемая для удаленного вызова процедуры.

NullSession

Указывает, используется ли сеанс NULL . Ноль означает, что вызов не выполняется через сеанс NULL ; любое другое значение указывает на сеанс null .

Комментарии

Структура RPC_CALL_ATTRIBUTES использует схему управления версиями, чтобы включить функцию RpcServerInqCallAttributes для включения новых возможностей без необходимости вводить новые функции с идентификаторами суффикса. Например, вторая версия RPC_CALL_ATTRIBUTES, определяемая простым #define в заголовке, может добавлять новые члены, чтобы упростить новые функции, встроенные в будущие версии функции RpcServerInqCallAttributes , без необходимости выпускать соответствующую альтернативную функцию.

Элемент Version указывает версию структуры RPC_CALL_ATTRIBUTES (в настоящее время RPC_CALL_ATTRIBUTES_V1 или RPC_CALL_ATTRIBUTES_V2), используемой вызывающим приложением. Эта идентификация позволяет среде выполнения RPC обеспечить обратную совместимость приложений, не использующих самую последнюю версию структуры.

Если указать RPC_QUERY_SERVER_PRINCIPAL_NAME в элементе Flags , RpcServerInqCallAttributes возвращает имя участника-сервера в поле ServerPrincipalName. Если RPC_QUERY_SERVER_PRINCIPAL_NAME не указан, RpcServerInqCallAttributes не изменяет указатель, переданный в ServerPrincipalName , и не сохраняет ничего в этом расположении памяти. Если указать RPC_QUERY_CLIENT_PRINCIPAL_NAME в элементе Flags , RpcServerInqCallAttributes возвращает имя субъекта клиента в ClientPrincipalName. Если RPC_QUERY_CLIENT_PRINCIPAL_NAME не указан, RpcServerInqCallAttributes не изменяет указатель, переданный в ClientPrincipalName , и не сохраняет ничего в этом расположении памяти.

Лучший механизм обработки при извлечении имен клиента и субъекта-сервера — хранить длину ClientPrincipalNameBufferLength и ServerPrincipalNameBufferLength. Если возвращается ERROR_MORE_DATA, сравните хранимую длину с длиной, возвращаемой в этих элементах. Элемент с сохраненным значением, меньшим или равным возвращаемого значения, успешно вернулся, что указывает на то, что у другого элемента недостаточно буфера. В последующем вызове опустите флаг для успешно возвращенного имени участника; это позволяет избежать обработки, связанной с другим извлечением и копией успешно возвращенного имени участника.

Структура RPC_CALL_ATTRIBUTES_V1 обычно называется двумя способами:

  • Первый подход: нуль указывается для элемента ServerPrincipalNameBufferLength или ClientPrincipalNameBufferLength в первом вызове функции RpcServerInqCallAttributes , чтобы получить необходимую длину буфера или определить, поддерживает ли протокол возврат имени участника. После получения требуемой длины буфера буфер выделяется требуемой длины и выполняется второй вызов, чтобы получить реальную длину буфера.
  • Второй подход: вызывающий объект начинается с разумного буфера, который часто выделяется в стеке, и если возвращается ERROR_MORE_DATA, выделяется буфер требуемой длины и снова вызывается функция RpcServerInqCallAttributes .
Второй метод обеспечивает наилучшую производительность в большинстве случаев, так как вызывающей объекту не нужно выполнять выделение памяти.

Примеры

RPC_CALL_ATTRIBUTES CallAttributes;  // this maps to RPC_CALL_ATTRIBUTES_V1

memset(&CallAttributes, 0, sizeof(CallAttributes));
CallAttributes.Version = RPC_CALL_ATTRIBUTES_VERSION;    // maps to 1
CallAttributes.Flags = ;//....
Status = RpcServerInqCallAttributes(0, &CallAttributes);

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Верхняя часть rpcasync.h (включая Rpc.h)

См. также раздел

Константы уровня проверки подлинности

Атрибуты RpcServerInqCallAttributes