📄 rpc_server.c
字号:
/*********************************************************************** * 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 + -