Skip to content

PHP 8.3 not working on Windows 7 #12762

Closed as not planned
Closed as not planned
@nono303

Description

@nono303

Description

Hi,
Just trying to run PHP 8.3.0 on Windows 7 (after successfully compiling it on Win11 vs17 x64) and it's failed with message

image

According to https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits it's normal as requirements are:

  • Minimum supported client Windows 8 [desktop apps | UWP apps]
  • Minimum supported server Windows Server 2012 [desktop apps | UWP apps]

It had also been clearly mentioned on #9104 (comment)
Looking to the source code, I found GetCurrentThreadStackLimits used in Zend/zend_call_stack.c

Based on https://stackoverflow.com/a/52404641 I dirtily applied the patch and now PHP 8.3.0 run fine on windows 7

diff --git "a/Zend/zend_call_stack.c" "b/Zend/zend_call_stack.c"
index 06ee521911..9fc2b570bc 100644
--- "a/Zend/zend_call_stack.c"
+++ "b/Zend/zend_call_stack.c"
@@ -376,7 +376,22 @@ static bool zend_call_stack_get_win32(zend_call_stack *stack)
 	 *                v  Lower addresses   v
 	 */
 
-	GetCurrentThreadStackLimits(&low_limit, &high_limit);
+	static void (WINAPI* GetCurrentThreadStackLimits)(PULONG_PTR , PULONG_PTR);
+	if (!GetCurrentThreadStackLimits) {
+		*(void**)&GetCurrentThreadStackLimits = GetProcAddress(GetModuleHandle(L"kernel32"), "GetCurrentThreadStackLimits");
+		if (!GetCurrentThreadStackLimits) {
+			NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
+			high_limit = (ULONG_PTR)tib->StackBase;
+			MEMORY_BASIC_INFORMATION mbi;
+			if (VirtualQuery(tib->StackLimit, &mbi, sizeof(mbi))) {
+				low_limit = (ULONG_PTR)mbi.AllocationBase;
+			}
+		} else {
+			GetCurrentThreadStackLimits(&low_limit, &high_limit);
+		}
+	} else {
+		GetCurrentThreadStackLimits(&low_limit, &high_limit);
+	}
 
 	result_size = VirtualQuery((void*)low_limit,
 			&uncommitted_region, sizeof(uncommitted_region));

image

So... Does this patch (or a corrected one as I don't really master all the elements) would make sense to ensure PHP a long life on old Windows OS ?

PHP Version

PHP 8.3.0

Operating System

Windows 7 x64

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions