Jump to content

Firefox 48.0.2 / Firefox 45.9.x ESR on Windows XP RTM (and older OSes?)


Recommended Posts

Posted (edited)

I finally managed to get Firefox 48.0.2 to work on Windows XP RTM!

Notes

kernelxp.dll stays in the "firefox" directories after patching, or else it will NOT work.

The unofficial guide "How to get Firefox 48.0.2 / 45.9.x ESR to work on Windows XP RTM!" is now available. This guide is made by me.
https://sites.google.com/view/clara-incorporated/modernization/windows-2000xp-rtmxp-sp1/firefox-48-0-2-firefox-45-9-x-esr-windows-xp-rtm

Edited by Uncle Captain
  • 2 weeks later...

Posted (edited)

I even managed going down to XP build 2474 for Firefox 48.0.2 / Firefox 45.9.x ESR to work.

xp2474firefox48.thumb.PNG.f2ac502ca5e0968c06724b217dc7c2cc.PNG

I managed getting Firefox 48.0.2 to work on Windows XP build 2474 at the minimum unofficially, see the text file:

And functions like GetModuleHandleExA, GetModuleHandleExW, and IsWow64Process was introduced in build 2474,

I tried to replace the stubs (GetModuleHandleExA --> GetModuleHandleA), (GetModuleHandleExW --> GetModuleHandleW), and (IsWow64Process --> GetStdHandle), and Firefox 48.0.2 launches a process (firefox.exe), but not initalized properly on Windows XP build 2469.

Is there matching stubs for GetModuleHandleExA, GetModuleHandleExW, and IsWow64Process to try to get Firefox 48.0.2 to work on Windows XP build 2469, is it the system itself, or is 2474 the dead end for Firefox 48.0.2/45.9.x to work?

The number of parameters (1, not 2) might not match and it might not return FALSE as needed for that 2469 thing.

Firefox48on2474.txt

Edited by Uncle Captain
Posted (edited)

Firefox45.9.34onXPRTM.thumb.png.81b571df970bb31987e3d722a29e2e12.pngK-Meleon76.5.5onXPRTM.thumb.png.42729d9b26495c6d5a9d3a1dd0892da0.png

Firefox 45.9.34 and K-Meleon 76.5.5 worked on Windows XP RTM with kernelxp.dll wrappers unofficially.

The thing is for K-Meleon 76.5.5 on XP RTM, you'll get a BSOD. To fix this, remove the manifests on the main K-Meleon executable, and then it works.
I also tested New Moon 27 on Windows XP RTM with kernelxp.dll wrappers unofficially, and then it worked too.

Note: Firefox-based browsers are compiled with Visual C++ 2013 runtimes are the last to run unofficially on Windows XP RTM (with kernelxp.dll wrappers) correctly. Firefox-based browsers are compiled with Visual C++ 2015-2019 runtimes would unofficially require at least Windows XP SP1 (with kernelxp.dll wrappers) for any stability.

 

Edited by Uncle Captain
Posted (edited)

*removed*

Edited by woi
mb it doesn't really worked
  • 2 weeks later...
Posted

@roytam1

Okay,

1) I managed going up to Firefox 35.0.1 to work on Windows 2000 without Extended Kernel unofficially by using just kernelxp, advapixp, shellxp, and userxp wrappers from the mp10en2k package by blackwingcat, and additional dlls from windows 2000 extended kernel, and changing the MinorOperatingSystemVersion and MinorSubsystemVersion from 0001 to 0000, and leaving the MajorOperatingSystemVersion and MajorSubsystemVersion as 0000 on firefox.exe and other executables in the firefox folder.

2) I managed getting Firefox 31.8.0 ESR to work on Windows 2000 without Extended Kernel unofficially by using just kernelxp, advapixp, and shellxp wrappers from the mp10en2k package by blackwingcat, and additional dlls from windows 2000 extended kernel, and changing the MinorOperatingSystemVersion and MinorSubsystemVersion from 0001 to 0000, and leaving the MajorOperatingSystemVersion and MajorSubsystemVersion as 0000 on firefox.exe and other executables in the firefox folder.

Note: The original kernelxp wrapper for windows 2000 without extended kernel from the mp10en2k package by blackwingcat have the getnumahighestnodenumber function missing for firefox 36 which used microsoft visual c++ 2013 runtime. I even tried 36.0a1 (compiled with vc2010) on Windows 2000 without extended kernel unofficially by using just kernelxp, advapixp, shellxp, and userxp wrappers from the mp10en2k package by blackwingcat, and additional dlls from windows 2000 extended kernel, and changing the MinorOperatingSystemVersion and MinorSubsystemVersion from 0001 to 0000, and leaving the MajorOperatingSystemVersion and MajorSubsystemVersion as 0000 on firefox.exe and other executables in the firefox folder, but it does not start :(

The unofficial guide "How to get Firefox 35.0.1 / 31.8.0 ESR to work on Windows 2000 without Extended Kernel!" is now available. This guide is made by me.

https://sites.google.com/view/clara-incorporated/modernization/windows-2000xp-rtmxp-sp1/firefox-35-0-1-firefox-31-8-0-on-windows-2000-without-extended-kernel

VirtualBox_vanilla Windows 2000_19_08_2025_20_10_37.png

VirtualBox_vanilla Windows 2000_19_08_2025_20_36_10.png

  • 4 weeks later...
Posted

@blackwingcat

kernelxp.dll for windows 2000 i found in mp10en2k.exe package is missing the GetNumaHighestNodeNumber function for msvcr120.dll especially for apps such as (Firefox 36+, CCleaner 5.30+, Notepad++ 7.9.2)

I tested Firefox versions up to 35.0.1 on Windows 2000 without extended kernel (just using kernelxp, advapixp, shellxp, userxp, rpcxp4 wrappers) unofficially.

What about adding the GetNumaHighestNodeNumber function to your kernelxp wrapper?

KERNELXP.PNG

  • 1 month later...
Posted

for doxygen the function look like this:

 

BOOL WINAPI GetNumaHighestNodeNumber(PULONG HighestNodeNumber)

{

NTSTATUS Status;

ULONG Length;

ULONG PartialInfo[2]; // First two members of SYSTEM_NUMA_INFORMATION

 /* Query partial NUMA info */

//Status = NtQuerySystemInformation(SystemNumaProcessorMap, PartialInfo, sizeof(PartialInfo), &Length); 

// SystemNumaProcessorMap = 55, // 0x37

Status = NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS)0x00000037, PartialInfo, sizeof(PartialInfo), &Length); 

if (!NT_SUCCESS(Status))

return FALSE;

}

if (Length < sizeof(ULONG))

{

return FALSE;

}

*HighestNodeNumber = PartialInfo[0];

return TRUE;

}

Posted
On 11/4/2025 at 8:48 AM, user57 said:

for doxygen the function look like this:

 

BOOL WINAPI GetNumaHighestNodeNumber(PULONG HighestNodeNumber)

{

NTSTATUS Status;

ULONG Length;

ULONG PartialInfo[2]; // First two members of SYSTEM_NUMA_INFORMATION

 /* Query partial NUMA info */

//Status = NtQuerySystemInformation(SystemNumaProcessorMap, PartialInfo, sizeof(PartialInfo), &Length); 

// SystemNumaProcessorMap = 55, // 0x37

Status = NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS)0x00000037, PartialInfo, sizeof(PartialInfo), &Length); 

if (!NT_SUCCESS(Status))

return FALSE;

}

if (Length < sizeof(ULONG))

{

return FALSE;

}

*HighestNodeNumber = PartialInfo[0];

return TRUE;

}

the problem is Data in that Index is not available in older version of windows, so NtQuerySystemInformation will return error.

Posted

it sounds to me someone is trying to make a windows 2000 support for this, or at least it would go that direction
i once told sam and dibya what i think about that

the GetLogicalProcessorInformation is available in windows xp with SP3 
that one contains also NUMA information (SYSTEM_LOGICAL_PROCESSOR_INFORMATION structure) 

NtQuerySystemInformation( "SystemLogicalProcessorInformation", buffer, *len, len ); 
maybe "SystemNumaProcessorMap": 
https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/sysinfo/numa.htm

many mothersboards dont have more of NUMA´s, it used to be an second socket for a second (or more then 2 cpu sockets) - with own wires to extra ram (like the RAMBUS-RAM (rd-ram) used to do this)
https://en.wikipedia.org/wiki/Non-uniform_memory_access

that in win2000 ? raise questions

if you want the file what was about to being made for firefox i sended you a private message
it may not contain that specific function, however it shows a different way to get this value and give a idea how the ntoskrnl is holding it


https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation

 

if you really want to have this reaction you have to make a ntoskrnl kernel extender

here is a implementation from doxygen

{

ULONG MaxEntries, Node;

PSYSTEM_NUMA_INFORMATION NumaInformation = (PSYSTEM_NUMA_INFORMATION)Buffer;

 

 /* Validate input size */

if (Size < sizeof(ULONG))

{

return STATUS_INFO_LENGTH_MISMATCH;

}

 

NumaInformation->HighestNodeNumber = KeNumberNodes - 1;

/* Compute how much entries we will be able to put in output structure */

MaxEntries = (Size - FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask)) / sizeof(ULONGLONG);

/* Make sure we don't overflow KeNodeBlock */

if (MaxEntries > KeNumberNodes)

{

MaxEntries = KeNumberNodes;

 }

 

 /* If we have entries to write, and room for it */

 if (Size >= FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask) &&

MaxEntries != 0)

 {

 /* Already set size we return */

*ReqSize = FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask) +

 MaxEntries * sizeof(ULONGLONG);

/* For each node, return processor mask */

for (Node = 0; Node < MaxEntries; ++Node)

 {

NumaInformation->ActiveProcessorsAffinityMask[Node] = KeNodeBlock[Node]->ProcessorMask;

 }

 }

else

{

/* We only returned highest node number */

*ReqSize = sizeof(ULONG);

 }

 

return STATUS_SUCCESS;

}

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...