Browse Source

support oop jit descriptor on win8+

Michael Holman 6 năm trước cách đây
mục cha
commit
2016fda803

+ 1 - 0
bin/GCStress/GCStress.vcxproj

@@ -32,6 +32,7 @@
         $(ChakraRuntimePlatformAgnostic);
         $(ChakraCommonLinkDependencies);
         Ole32.lib;
+        Rpcrt4.lib;
         Advapi32.lib;
         %(AdditionalDependencies)
       </AdditionalDependencies>

+ 1 - 1
bin/ch/JITProcessManager.cpp

@@ -68,7 +68,7 @@ HRESULT JITProcessManager::CreateServerProcess(int argc, __in_ecount(argc) LPWST
 
 #pragma warning(suppress: 6386) // buffer overrun
 #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
-    hr = StringCchCopyW(cmdLine, cmdLineSize, _u("ch.exe -OOPCFGRegistration- -CheckOpHelpers -jitserver:"));
+    hr = StringCchCopyW(cmdLine, cmdLineSize, _u("ch.exe -CheckOpHelpers -jitserver:"));
 #else
     hr = StringCchCopyW(cmdLine, cmdLineSize, _u("ch.exe -jitserver:"));
 #endif

+ 0 - 3
bin/ch/ch.cpp

@@ -913,9 +913,6 @@ HRESULT ExecuteTest(const char* fileName)
 #ifdef DEBUG
         ChakraRTInterface::SetCheckOpHelpersFlag(true);
 #endif
-#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
-        ChakraRTInterface::SetOOPCFGRegistrationFlag(false);
-#endif
 
         if (!WScriptJsrt::Initialize())
         {

+ 37 - 0
lib/Common/Core/DelayLoadLibrary.cpp

@@ -392,4 +392,41 @@ NtdllLibrary::NTSTATUS NtdllLibrary::UnlockVirtualMemory(
 #endif
 }
 
+static RPCLibrary RPCLibraryObject;
+RPCLibrary* RPCLibrary::Instance = &RPCLibraryObject;
+
+LPCTSTR RPCLibrary::GetLibraryName() const
+{
+    return _u("rpcrt4.dll");
+}
+
+RPC_STATUS RPCLibrary::RpcServerRegisterIf3(
+    _In_ RPC_IF_HANDLE IfSpec,
+    _In_opt_ UUID* MgrTypeUuid,
+    _In_opt_ RPC_MGR_EPV* MgrEpv,
+    _In_ unsigned int Flags,
+    _In_ unsigned int MaxCalls,
+    _In_ unsigned int MaxRpcSize,
+    _In_opt_ RPC_IF_CALLBACK_FN* IfCallback,
+    _In_opt_ void* SecurityDescriptor)
+{
+#if !(NTDDI_VERSION >= NTDDI_WIN8)
+    if (m_hModule)
+    {
+        if (serverRegister == nullptr)
+        {
+            serverRegister = (PFnRpcServerRegisterIf3)GetFunction("RpcServerRegisterIf3");
+            if (serverRegister == nullptr)
+            {
+                Assert(false);
+                return -1;
+            }
+        }
+        return serverRegister(IfSpec, MgrTypeUuid, MgrEpv, Flags, MaxCalls, MaxRpcSize, IfCallback, SecurityDescriptor);
+    }
+    return -1;
+#else
+    return ::RpcServerRegisterIf3(IfSpec, MgrTypeUuid, MgrEpv, Flags, MaxCalls, MaxRpcSize, IfCallback, SecurityDescriptor);
+#endif
+}
 #endif // _WIN32

+ 41 - 0
lib/Common/Core/DelayLoadLibrary.h

@@ -222,4 +222,45 @@ public:
         _In_ ULONG MapType
     );
 };
+
+// This needs to be delay loaded because RpcServerRegisterIf3 is available only
+// on Win8+
+class RPCLibrary : protected DelayLoadLibrary
+{
+private:
+    typedef RPC_STATUS(NTAPI* PFnRpcServerRegisterIf3)(
+        _In_ RPC_IF_HANDLE IfSpec,
+        _In_opt_ UUID* MgrTypeUuid,
+        _In_opt_ RPC_MGR_EPV* MgrEpv,
+        _In_ unsigned int Flags,
+        _In_ unsigned int MaxCalls,
+        _In_ unsigned int MaxRpcSize,
+        _In_opt_ RPC_IF_CALLBACK_FN* IfCallback,
+        _In_opt_ void* SecurityDescriptor);
+
+    PFnRpcServerRegisterIf3 serverRegister;
+
+public:
+    static RPCLibrary* Instance;
+
+    RPCLibrary() : DelayLoadLibrary(),
+        serverRegister(nullptr)
+    {
+        this->EnsureFromSystemDirOnly();
+    }
+
+    LPCTSTR GetLibraryName() const;
+
+    RPC_STATUS RpcServerRegisterIf3(
+        _In_ RPC_IF_HANDLE IfSpec,
+        _In_opt_ UUID* MgrTypeUuid,
+        _In_opt_ RPC_MGR_EPV* MgrEpv,
+        _In_ unsigned int Flags,
+        _In_ unsigned int MaxCalls,
+        _In_ unsigned int MaxRpcSize,
+        _In_opt_ RPC_IF_CALLBACK_FN* IfCallback,
+        _In_opt_ void* SecurityDescriptor
+    );
+};
+
 #endif

+ 18 - 12
lib/JITClient/JITManager.cpp

@@ -50,6 +50,21 @@ JITManager::GetJITManager()
     return &s_jitManager;
 }
 
+typedef struct _CHAKRA_RPC_SECURITY_QOS_V5 {
+    unsigned long Version;
+    unsigned long Capabilities;
+    unsigned long IdentityTracking;
+    unsigned long ImpersonationType;
+    unsigned long AdditionalSecurityInfoType;
+    union
+    {
+        RPC_HTTP_TRANSPORT_CREDENTIALS_W* HttpCredentials;
+    } u;
+    void* Sid;
+    unsigned int EffectiveOnly;
+    void* ServerSecurityDescriptor;
+} CHAKRA_RPC_SECURITY_QOS_V5;
+
 // This routine creates a binding with the server.
 HRESULT
 JITManager::CreateBinding(
@@ -67,22 +82,13 @@ JITManager::CreateBinding(
     RPC_BINDING_HANDLE_TEMPLATE_V1 bindingTemplate;
     RPC_BINDING_HANDLE_SECURITY_V1_W bindingSecurity;
 
-#if (NTDDI_VERSION >= NTDDI_WIN8)
-    RPC_SECURITY_QOS_V5 securityQOS;
-    ZeroMemory(&securityQOS, sizeof(RPC_SECURITY_QOS_V5));
+    CHAKRA_RPC_SECURITY_QOS_V5 securityQOS;
+    ZeroMemory(&securityQOS, sizeof(CHAKRA_RPC_SECURITY_QOS_V5));
     securityQOS.Capabilities = RPC_C_QOS_CAPABILITIES_DEFAULT;
     securityQOS.IdentityTracking = RPC_C_QOS_IDENTITY_DYNAMIC;
     securityQOS.ImpersonationType = RPC_C_IMP_LEVEL_IDENTIFY;
-    securityQOS.Version = 5;
+    securityQOS.Version = AutoSystemInfo::Data.IsWin8OrLater() ? 5 : 4;
     securityQOS.ServerSecurityDescriptor = serverSecurityDescriptor;
-#else
-    RPC_SECURITY_QOS_V4 securityQOS;
-    ZeroMemory(&securityQOS, sizeof(RPC_SECURITY_QOS_V4));
-    securityQOS.Capabilities = RPC_C_QOS_CAPABILITIES_DEFAULT;
-    securityQOS.IdentityTracking = RPC_C_QOS_IDENTITY_DYNAMIC;
-    securityQOS.ImpersonationType = RPC_C_IMP_LEVEL_IDENTIFY;
-    securityQOS.Version = 4;
-#endif
 
     ZeroMemory(&bindingTemplate, sizeof(bindingTemplate));
     bindingTemplate.Version = 1;

+ 23 - 20
lib/JITServer/JITServer.cpp

@@ -27,26 +27,29 @@ HRESULT JsInitializeJITServer(
         return status;
     }
 
-#if (NTDDI_VERSION >= NTDDI_WIN8)
-    status = RpcServerRegisterIf3(
-        ServerIChakraJIT_v0_0_s_ifspec,
-        NULL,
-        NULL,
-        RPC_IF_AUTOLISTEN,
-        RPC_C_LISTEN_MAX_CALLS_DEFAULT,
-        (ULONG)-1,
-        NULL,
-        securityDescriptor);
-#else
-    status = RpcServerRegisterIf2(
-        ServerIChakraJIT_v0_0_s_ifspec,
-        NULL,
-        NULL,
-        RPC_IF_AUTOLISTEN,
-        RPC_C_LISTEN_MAX_CALLS_DEFAULT,
-        (ULONG)-1,
-        NULL);
-#endif
+    if (AutoSystemInfo::Data.IsWin8OrLater())
+    {
+        status = RPCLibrary::Instance->RpcServerRegisterIf3(
+            ServerIChakraJIT_v0_0_s_ifspec,
+            NULL,
+            NULL,
+            RPC_IF_AUTOLISTEN,
+            RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+            (ULONG)-1,
+            NULL,
+            securityDescriptor);
+    }
+    else
+    {
+        status = RpcServerRegisterIf2(
+            ServerIChakraJIT_v0_0_s_ifspec,
+            NULL,
+            NULL,
+            RPC_IF_AUTOLISTEN,
+            RPC_C_LISTEN_MAX_CALLS_DEFAULT,
+            (ULONG)-1,
+            NULL);
+    }
     if (status != RPC_S_OK)
     {
         return status;