Hi all,

Attaching the patch from the separate discussion in cygwin-developers - Re: 
[Proposed changes/Incoming patch] Undocumented call to 
ntdll.dll!NtAssignProcessToJobObject in msys2.0.dll / cygwin - included in 
mingit/Git for Windows.

The following patch includes the replacement of the following undocumented APIs 
and their documented counterparts.

  *   NtOpenJobObject - 
OpenJobObjectA<https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-openjobobjecta>
  *   NtCreateJobObject - 
CreateJobObjectA<https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createjobobjecta>
  *   NtQueryInformationJobObject - 
QueryInformationJobObject<https://learn.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject>
  *   NtSetInformationJobObject - 
SetInformationJobObject<https://learn.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-setinformationjobobject>
  *
NTAssignProcessToJobObject - 
AssignProcessToJobObject<https://learn.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-assignprocesstojobobject>

Please let us know if you have any further questions or feedback regarding the 
changes.

Whitney & Sebastian

P.S.
Unfortunately the use of git send-email was not possible due to firewall issues.

----

>From 2cf2176ee8dd35bc4fca8d420533dfb385241d24 Mon Sep 17 00:00:00 2001
From: "Sebastian Hernandez (from Dev Box)" <sebhernan...@microsoft.com>
Date: Wed, 22 Jan 2025 10:20:59 -0800
Subject: [PATCH 1/1] replace undocumented Nt* calls with documented win32 apis

---
 winsup/cygwin/local_includes/ntdll.h |  6 --
 winsup/cygwin/resource.cc            | 93 ++++++++++++++++++----------
 2 files changed, 61 insertions(+), 38 deletions(-)

diff --git a/winsup/cygwin/local_includes/ntdll.h 
b/winsup/cygwin/local_includes/ntdll.h
index 4497fe53f..9f07b37e4 100644
--- a/winsup/cygwin/local_includes/ntdll.h
+++ b/winsup/cygwin/local_includes/ntdll.h
@@ -1451,7 +1451,6 @@ extern "C"
   NTSTATUS NtAdjustPrivilegesToken (HANDLE, BOOLEAN, PTOKEN_PRIVILEGES, ULONG,
                PTOKEN_PRIVILEGES, PULONG);
   NTSTATUS NtAllocateLocallyUniqueId (PLUID);
-  NTSTATUS NtAssignProcessToJobObject (HANDLE, HANDLE);
   NTSTATUS NtCancelTimer (HANDLE, PBOOLEAN);
   NTSTATUS NtClose (HANDLE);
   NTSTATUS NtCommitTransaction (HANDLE, BOOLEAN);
@@ -1461,7 +1460,6 @@ extern "C"
   NTSTATUS NtCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
          PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, ULONG,
          ULONG, PVOID, ULONG);
-  NTSTATUS NtCreateJobObject (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NtCreateKey (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, ULONG,
         PUNICODE_STRING, ULONG, PULONG);
   NTSTATUS NtCreateMutant (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, BOOLEAN);
@@ -1498,7 +1496,6 @@ extern "C"
   NTSTATUS NtOpenEvent (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
             PIO_STATUS_BLOCK, ULONG, ULONG);
-  NTSTATUS NtOpenJobObject (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NtOpenKey (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NtOpenMutant (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
   NTSTATUS NtOpenProcessToken (HANDLE, ACCESS_MASK, PHANDLE);
@@ -1520,8 +1517,6 @@ extern "C"
   NTSTATUS NtQueryEvent (HANDLE, EVENT_INFORMATION_CLASS, PVOID, ULONG, 
PULONG);
   NTSTATUS NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
               FILE_INFORMATION_CLASS);
-  NTSTATUS NtQueryInformationJobObject (HANDLE, JOBOBJECTINFOCLASS, PVOID,
-              ULONG, PULONG);
   NTSTATUS NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS, PVOID, ULONG,
                  PULONG);
   NTSTATUS NtQueryInformationThread (HANDLE, THREADINFOCLASS, PVOID, ULONG,
@@ -1555,7 +1550,6 @@ extern "C"
   NTSTATUS NtSetEvent (HANDLE, PULONG);
   NTSTATUS NtSetInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
             FILE_INFORMATION_CLASS);
-  NTSTATUS NtSetInformationJobObject (HANDLE, JOBOBJECTINFOCLASS, PVOID, 
ULONG);
   NTSTATUS NtSetInformationThread (HANDLE, THREADINFOCLASS, PVOID, ULONG);
   NTSTATUS NtSetInformationToken (HANDLE, TOKEN_INFORMATION_CLASS, PVOID,
              ULONG);
diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc
index 5ec436c2c..64c26c14d 100644
--- a/winsup/cygwin/resource.cc
+++ b/winsup/cygwin/resource.cc
@@ -177,27 +177,43 @@ job_shared_name (PWCHAR buf, LONG num)
 static void
 __get_rlimit_as (struct rlimit *rlp)
 {
-  UNICODE_STRING uname;
   WCHAR jobname[32];
-  OBJECT_ATTRIBUTES attr;
+  char jobnameA[32];
   HANDLE job = NULL;
-  NTSTATUS status;
+  BOOL result;
+  DWORD winError;
   JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobinfo;

   if (cygheap->rlim_as_id)
     {
-      RtlInitUnicodeString (&uname,
-            job_shared_name (jobname,
-                   cygheap->rlim_as_id));
-      InitializeObjectAttributes (&attr, &uname, 0,
-             get_session_parent_dir (), NULL);
+      /* Get the wide-character job name from the function */
+      job_shared_name (jobname, cygheap->rlim_as_id);
+
+      /* Convert WCHAR job name to ANSI */
+      if (WideCharToMultiByte (CP_ACP, 0, jobname,
+                               -1, jobnameA, sizeof(jobnameA),
+                               NULL, NULL) == 0)
+      {
+          winError = GetLastError();
+          __seterrno_from_win_error(winError);
+          return;
+      }
+
       /* May fail, just check NULL job in that case. */
-      NtOpenJobObject (&job, JOB_OBJECT_QUERY, &attr);
+      job = OpenJobObjectA (JOB_OBJECT_QUERY,
+                            FALSE,
+                            jobnameA);
+      winError = GetLastError ();
+      if (job == NULL)
+      {
+        __seterrno_from_win_error (winError);
+        return;
+      }
     }
-  status = NtQueryInformationJobObject (job,
-              JobObjectExtendedLimitInformation,
-              &jobinfo, sizeof jobinfo, NULL);
-  if (NT_SUCCESS (status)
+  result = QueryInformationJobObject (job,
+          JobObjectExtendedLimitInformation,
+          &jobinfo, sizeof jobinfo, NULL);
+  if (result
       && (jobinfo.BasicLimitInformation.LimitFlags
     & JOB_OBJECT_LIMIT_PROCESS_MEMORY))
     rlp->rlim_cur = rlp->rlim_max = jobinfo.ProcessMemoryLimit;
@@ -209,11 +225,11 @@ static int
 __set_rlimit_as (unsigned long new_as_limit)
 {
   LONG new_as_id = 0;
-  UNICODE_STRING uname;
   WCHAR jobname[32];
-  OBJECT_ATTRIBUTES attr;
-  NTSTATUS status = STATUS_SUCCESS;
+  char jobnameA[32];
   HANDLE job = NULL;
+  BOOL result = 1;
+  DWORD winError = 0;
   JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobinfo = { 0 };

   /* If we already have a limit, we must not change it because that
@@ -221,33 +237,46 @@ __set_rlimit_as (unsigned long new_as_limit)
      Just try to create another, nested job. */
   while (new_as_id == 0)
     new_as_id = InterlockedIncrement (&job_serial_number);
-  RtlInitUnicodeString (&uname,
-        job_shared_name (jobname, new_as_id));
-  InitializeObjectAttributes (&attr, &uname, 0,
-              get_session_parent_dir (), NULL);
-  status = NtCreateJobObject (&job, JOB_OBJECT_ALL_ACCESS, &attr);
-  if (!NT_SUCCESS (status))
-    {
-      __seterrno_from_nt_status (status);
-      return -1;
-    }
+
+  /* Get the wide-character job name from the function */
+  job_shared_name (jobname, cygheap->rlim_as_id);
+  if (WideCharToMultiByte (CP_ACP, 0, jobname,
+                           -1, jobnameA, sizeof(jobnameA),
+                           NULL, NULL) == 0)
+  {
+    winError = GetLastError ();
+    __seterrno_from_win_error (winError);
+    return -1;
+  }
+
+  job = CreateJobObjectA(NULL, jobnameA);
+  winError = GetLastError ();
+  if (job == NULL)
+  {
+    __seterrno_from_win_error (winError);
+    return -1;
+  }
+
   jobinfo.BasicLimitInformation.LimitFlags
     = JOB_OBJECT_LIMIT_PROCESS_MEMORY;
   /* Per Linux man page, round down to system pagesize. */
   jobinfo.ProcessMemoryLimit
     = rounddown (new_as_limit, wincap.allocation_granularity ());
-  status = NtSetInformationJobObject (job,
+  result = SetInformationJobObject (job,
            JobObjectExtendedLimitInformation,
            &jobinfo, sizeof jobinfo);
   /* If creating the job and setting up the job limits succeeded,
      try to add the process to the job.  This must be the last step,
      otherwise we couldn't remove the job if anything failed. */
-  if (NT_SUCCESS (status))
-    status = NtAssignProcessToJobObject (job, NtCurrentProcess ());
+  if (result)
+    {
+      result = AssignProcessToJobObject (job, NtCurrentProcess ());
+      winError = GetLastError ();
+    }
   NtClose (job);
-  if (!NT_SUCCESS (status))
+  if (!result)
     {
-      __seterrno_from_nt_status (status);
+      __seterrno_from_win_error (winError);
       return -1;
     }
   cygheap->rlim_as_id = new_as_id;
@@ -345,4 +374,4 @@ setrlimit (int resource, const struct rlimit *rlp)
   __except (EFAULT)
   __endtry
   return -1;
-}
+}
\ No newline at end of file
--
2.47.1.windows.2





Attachment: 0001-replace-undocumented-Nt-calls-with-documented-win32-.patch
Description: 0001-replace-undocumented-Nt-calls-with-documented-win32-.patch

Reply via email to