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

📄 rpc_server.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************** *             RpcServerUseProtseqA (RPCRT4.@) */RPC_STATUS WINAPI RpcServerUseProtseqA(RPC_CSTR Protseq, unsigned int MaxCalls, void *SecurityDescriptor){  TRACE("(Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_a((char*)Protseq), MaxCalls, SecurityDescriptor);  return RpcServerUseProtseqEpA(Protseq, MaxCalls, NULL, SecurityDescriptor);}/*********************************************************************** *             RpcServerUseProtseqW (RPCRT4.@) */RPC_STATUS WINAPI RpcServerUseProtseqW(RPC_WSTR Protseq, unsigned int MaxCalls, void *SecurityDescriptor){  TRACE("Protseq == %s, MaxCalls == %d, SecurityDescriptor == ^%p)\n", debugstr_w(Protseq), MaxCalls, SecurityDescriptor);  return RpcServerUseProtseqEpW(Protseq, MaxCalls, NULL, SecurityDescriptor);}/*********************************************************************** *             RpcServerRegisterIf (RPCRT4.@) */RPC_STATUS WINAPI RpcServerRegisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv ){  TRACE("(%p,%s,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv);  return RpcServerRegisterIf2( IfSpec, MgrTypeUuid, MgrEpv, 0, RPC_C_LISTEN_MAX_CALLS_DEFAULT, (UINT)-1, NULL );}/*********************************************************************** *             RpcServerRegisterIfEx (RPCRT4.@) */RPC_STATUS WINAPI RpcServerRegisterIfEx( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv,                       UINT Flags, UINT MaxCalls, RPC_IF_CALLBACK_FN* IfCallbackFn ){  TRACE("(%p,%s,%p,%u,%u,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv, Flags, MaxCalls, IfCallbackFn);  return RpcServerRegisterIf2( IfSpec, MgrTypeUuid, MgrEpv, Flags, MaxCalls, (UINT)-1, IfCallbackFn );}/*********************************************************************** *             RpcServerRegisterIf2 (RPCRT4.@) */RPC_STATUS WINAPI RpcServerRegisterIf2( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, RPC_MGR_EPV* MgrEpv,                      UINT Flags, UINT MaxCalls, UINT MaxRpcSize, RPC_IF_CALLBACK_FN* IfCallbackFn ){  PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec;  RpcServerInterface* sif;  unsigned int i;  TRACE("(%p,%s,%p,%u,%u,%u,%p)\n", IfSpec, debugstr_guid(MgrTypeUuid), MgrEpv, Flags, MaxCalls,         MaxRpcSize, IfCallbackFn);  TRACE(" interface id: %s %d.%d\n", debugstr_guid(&If->InterfaceId.SyntaxGUID),                                     If->InterfaceId.SyntaxVersion.MajorVersion,                                     If->InterfaceId.SyntaxVersion.MinorVersion);  TRACE(" transfer syntax: %s %d.%d\n", debugstr_guid(&If->TransferSyntax.SyntaxGUID),                                        If->TransferSyntax.SyntaxVersion.MajorVersion,                                        If->TransferSyntax.SyntaxVersion.MinorVersion);  TRACE(" dispatch table: %p\n", If->DispatchTable);  if (If->DispatchTable) {    TRACE("  dispatch table count: %d\n", If->DispatchTable->DispatchTableCount);    for (i=0; i<If->DispatchTable->DispatchTableCount; i++) {      TRACE("   entry %d: %p\n", i, If->DispatchTable->DispatchTable[i]);    }    TRACE("  reserved: %ld\n", If->DispatchTable->Reserved);  }  TRACE(" protseq endpoint count: %d\n", If->RpcProtseqEndpointCount);  TRACE(" default manager epv: %p\n", If->DefaultManagerEpv);  TRACE(" interpreter info: %p\n", If->InterpreterInfo);  sif = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RpcServerInterface));  sif->If           = If;  if (MgrTypeUuid) {    memcpy(&sif->MgrTypeUuid, MgrTypeUuid, sizeof(UUID));    sif->MgrEpv       = MgrEpv;  } else {    memset(&sif->MgrTypeUuid, 0, sizeof(UUID));    sif->MgrEpv       = If->DefaultManagerEpv;  }  sif->Flags        = Flags;  sif->MaxCalls     = MaxCalls;  sif->MaxRpcSize   = MaxRpcSize;  sif->IfCallbackFn = IfCallbackFn;  EnterCriticalSection(&server_cs);  list_add_head(&server_interfaces, &sif->entry);  LeaveCriticalSection(&server_cs);  if (sif->Flags & RPC_IF_AUTOLISTEN)      RPCRT4_start_listen(TRUE);  return RPC_S_OK;}/*********************************************************************** *             RpcServerUnregisterIf (RPCRT4.@) */RPC_STATUS WINAPI RpcServerUnregisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, UINT WaitForCallsToComplete ){  PRPC_SERVER_INTERFACE If = (PRPC_SERVER_INTERFACE)IfSpec;  HANDLE event = NULL;  BOOL found = FALSE;  BOOL completed = TRUE;  RpcServerInterface *cif;  RPC_STATUS status;  TRACE("(IfSpec == (RPC_IF_HANDLE)^%p (%s), MgrTypeUuid == %s, WaitForCallsToComplete == %u)\n",    IfSpec, debugstr_guid(&If->InterfaceId.SyntaxGUID), debugstr_guid(MgrTypeUuid), WaitForCallsToComplete);  EnterCriticalSection(&server_cs);  LIST_FOR_EACH_ENTRY(cif, &server_interfaces, RpcServerInterface, entry) {    if ((!IfSpec || !memcmp(&If->InterfaceId, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER))) &&        UuidEqual(MgrTypeUuid, &cif->MgrTypeUuid, &status)) {      list_remove(&cif->entry);      if (cif->CurrentCalls) {        completed = FALSE;        if (WaitForCallsToComplete)          cif->CallsCompletedEvent = event = CreateEventW(NULL, FALSE, FALSE, NULL);      }      found = TRUE;      break;    }  }  LeaveCriticalSection(&server_cs);  if (!found) {    ERR("not found for object %s\n", debugstr_guid(MgrTypeUuid));    return RPC_S_UNKNOWN_IF;  }  if (completed)    HeapFree(GetProcessHeap(), 0, cif);  else if (event) {    /* sif will be freed when the last call is completed, so be careful not to     * touch that memory here as that could happen before we get here */    WaitForSingleObject(event, INFINITE);    CloseHandle(event);  }  return RPC_S_OK;}/*********************************************************************** *             RpcServerUnregisterIfEx (RPCRT4.@) */RPC_STATUS WINAPI RpcServerUnregisterIfEx( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid, int RundownContextHandles ){  FIXME("(IfSpec == (RPC_IF_HANDLE)^%p, MgrTypeUuid == %s, RundownContextHandles == %d): stub\n",    IfSpec, debugstr_guid(MgrTypeUuid), RundownContextHandles);  return RPC_S_OK;}/*********************************************************************** *             RpcObjectSetType (RPCRT4.@) * * PARAMS *   ObjUuid  [I] "Object" UUID *   TypeUuid [I] "Type" UUID * * RETURNS *   RPC_S_OK                 The call succeeded *   RPC_S_INVALID_OBJECT     The provided object (nil) is not valid *   RPC_S_ALREADY_REGISTERED The provided object is already registered * * Maps "Object" UUIDs to "Type" UUID's.  Passing the nil UUID as the type * resets the mapping for the specified object UUID to nil (the default). * The nil object is always associated with the nil type and cannot be * reassigned.  Servers can support multiple implementations on the same * interface by registering different end-point vectors for the different * types.  There's no need to call this if a server only supports the nil * type, as is typical. */RPC_STATUS WINAPI RpcObjectSetType( UUID* ObjUuid, UUID* TypeUuid ){  RpcObjTypeMap *map = RpcObjTypeMaps, *prev = NULL;  RPC_STATUS dummy;  TRACE("(ObjUUID == %s, TypeUuid == %s).\n", debugstr_guid(ObjUuid), debugstr_guid(TypeUuid));  if ((! ObjUuid) || UuidIsNil(ObjUuid, &dummy)) {    /* nil uuid cannot be remapped */    return RPC_S_INVALID_OBJECT;  }  /* find the mapping for this object if there is one ... */  while (map) {    if (! UuidCompare(ObjUuid, &map->Object, &dummy)) break;    prev = map;    map = map->next;  }  if ((! TypeUuid) || UuidIsNil(TypeUuid, &dummy)) {    /* ... and drop it from the list */    if (map) {      if (prev)         prev->next = map->next;      else        RpcObjTypeMaps = map->next;      HeapFree(GetProcessHeap(), 0, map);    }  } else {    /* ... , fail if we found it ... */    if (map)      return RPC_S_ALREADY_REGISTERED;    /* ... otherwise create a new one and add it in. */    map = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcObjTypeMap));    memcpy(&map->Object, ObjUuid, sizeof(UUID));    memcpy(&map->Type, TypeUuid, sizeof(UUID));    map->next = NULL;    if (prev)      prev->next = map; /* prev is the last map in the linklist */    else      RpcObjTypeMaps = map;  }  return RPC_S_OK;}/*********************************************************************** *             RpcServerRegisterAuthInfoA (RPCRT4.@) */RPC_STATUS WINAPI RpcServerRegisterAuthInfoA( RPC_CSTR ServerPrincName, ULONG AuthnSvc, RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,                            LPVOID Arg ){  FIXME( "(%s,%u,%p,%p): stub\n", ServerPrincName, AuthnSvc, GetKeyFn, Arg );    return RPC_S_UNKNOWN_AUTHN_SERVICE; /* We don't know any authentication services */}/*********************************************************************** *             RpcServerRegisterAuthInfoW (RPCRT4.@) */RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( RPC_WSTR ServerPrincName, ULONG AuthnSvc, RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,                            LPVOID Arg ){  FIXME( "(%s,%u,%p,%p): stub\n", debugstr_w( ServerPrincName ), AuthnSvc, GetKeyFn, Arg );    return RPC_S_UNKNOWN_AUTHN_SERVICE; /* We don't know any authentication services */}/*********************************************************************** *             RpcServerListen (RPCRT4.@) */RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait ){  RPC_STATUS status = RPC_S_OK;  TRACE("(%u,%u,%u)\n", MinimumCallThreads, MaxCalls, DontWait);  if (list_empty(&protseqs))    return RPC_S_NO_PROTSEQS_REGISTERED;  status = RPCRT4_start_listen(FALSE);  if (DontWait || (status != RPC_S_OK)) return status;  return RpcMgmtWaitServerListen();}/*********************************************************************** *             RpcMgmtServerWaitListen (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ){  TRACE("()\n");  EnterCriticalSection(&listen_cs);  if (!std_listen) {    LeaveCriticalSection(&listen_cs);    return RPC_S_NOT_LISTENING;  }    LeaveCriticalSection(&listen_cs);  FIXME("not waiting for server calls to finish\n");  return RPC_S_OK;}/*********************************************************************** *             RpcMgmtStopServerListening (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtStopServerListening ( RPC_BINDING_HANDLE Binding ){  TRACE("(Binding == (RPC_BINDING_HANDLE)^%p)\n", Binding);  if (Binding) {    FIXME("client-side invocation not implemented.\n");    return RPC_S_WRONG_KIND_OF_BINDING;  }    RPCRT4_stop_listen(FALSE);  return RPC_S_OK;}/*********************************************************************** *             RpcMgmtEnableIdleCleanup (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtEnableIdleCleanup(void){    FIXME("(): stub\n");    return RPC_S_OK;}/*********************************************************************** *             I_RpcServerStartListening (RPCRT4.@) */RPC_STATUS WINAPI I_RpcServerStartListening( HWND hWnd ){  FIXME( "(%p): stub\n", hWnd );  return RPC_S_OK;}/*********************************************************************** *             I_RpcServerStopListening (RPCRT4.@) */RPC_STATUS WINAPI I_RpcServerStopListening( void ){  FIXME( "(): stub\n" );  return RPC_S_OK;}/*********************************************************************** *             I_RpcWindowProc (RPCRT4.@) */UINT WINAPI I_RpcWindowProc( void *hWnd, UINT Message, UINT wParam, ULONG lParam ){  FIXME( "(%p,%08x,%08x,%08x): stub\n", hWnd, Message, wParam, lParam );  return 0;}/*********************************************************************** *             RpcMgmtInqIfIds (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtInqIfIds(RPC_BINDING_HANDLE Binding, RPC_IF_ID_VECTOR **IfIdVector){  FIXME("(%p,%p): stub\n", Binding, IfIdVector);  return RPC_S_INVALID_BINDING;}/*********************************************************************** *             RpcMgmtEpEltInqBegin (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtEpEltInqBegin(RPC_BINDING_HANDLE Binding, ULONG InquiryType,    RPC_IF_ID *IfId, ULONG VersOption, UUID *ObjectUuid, RPC_EP_INQ_HANDLE* InquiryContext){  FIXME("(%p,%u,%p,%u,%p,%p): stub\n",        Binding, InquiryType, IfId, VersOption, ObjectUuid, InquiryContext);  return RPC_S_INVALID_BINDING;}/*********************************************************************** *             RpcMgmtIsServerListening (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtIsServerListening(RPC_BINDING_HANDLE Binding){  FIXME("(%p): stub\n", Binding);  return RPC_S_INVALID_BINDING;}/*********************************************************************** *             RpcMgmtSetServerStackSize (RPCRT4.@) */RPC_STATUS WINAPI RpcMgmtSetServerStackSize(ULONG ThreadStackSize){  FIXME("(0x%x): stub\n", ThreadStackSize);  return RPC_S_OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -