https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5e1f292062732a0e35abe…
commit 5e1f292062732a0e35abe385f2954aec8d2af5bd
Author:     George Bișoc <george.bisoc(a)reactos.org>
AuthorDate: Sun Jun 12 14:30:44 2022 +0200
Commit:     George Bișoc <george.bisoc(a)reactos.org>
CommitDate: Mon Jun 13 18:17:10 2022 +0200
    [NTOS:SE] NtQueryInformationToken: implement token sandbox inert querying
---
 ntoskrnl/include/internal/se.h |  5 +++++
 ntoskrnl/se/token.c            | 21 +++++++++++++++++++++
 ntoskrnl/se/tokencls.c         | 21 +++++++++++++++++++--
 3 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/include/internal/se.h b/ntoskrnl/include/internal/se.h
index db2dd0b58a3..de65310b331 100644
--- a/ntoskrnl/include/internal/se.h
+++ b/ntoskrnl/include/internal/se.h
@@ -443,6 +443,11 @@ SeCopyClientToken(
     _In_ KPROCESSOR_MODE PreviousMode,
     _Out_ PACCESS_TOKEN* NewToken);
+BOOLEAN
+NTAPI
+SeTokenIsInert(
+    _In_ PTOKEN Token);
+
 ULONG
 RtlLengthSidAndAttributes(
     _In_ ULONG Count,
diff --git a/ntoskrnl/se/token.c b/ntoskrnl/se/token.c
index 83b962f1ba9..ad2dd8e806f 100644
--- a/ntoskrnl/se/token.c
+++ b/ntoskrnl/se/token.c
@@ -1180,6 +1180,27 @@ SeCopyClientToken(
     return Status;
 }
+/**
+ * @brief
+ * Determines if a token is a sandbox inert token or not,
+ * based upon the token flags.
+ *
+ * @param[in] Token
+ * A valid access token to determine if such token is inert.
+ *
+ * @return
+ * Returns TRUE if the token is inert, FALSE otherwise.
+ */
+BOOLEAN
+NTAPI
+SeTokenIsInert(
+    _In_ PTOKEN Token)
+{
+    PAGED_CODE();
+
+    return (((PTOKEN)Token)->TokenFlags & TOKEN_SANDBOX_INERT) != 0;
+}
+
 /**
  * @brief
  * Internal function that deals with access token object destruction and deletion.
diff --git a/ntoskrnl/se/tokencls.c b/ntoskrnl/se/tokencls.c
index b9d1615d23e..50e81a9a453 100644
--- a/ntoskrnl/se/tokencls.c
+++ b/ntoskrnl/se/tokencls.c
@@ -984,9 +984,26 @@ NtQueryInformationToken(
             }
             case TokenSandBoxInert:
-                DPRINT1("NtQueryInformationToken(TokenSandboxInert) not
implemented\n");
-                Status = STATUS_NOT_IMPLEMENTED;
+            {
+                ULONG IsTokenSandBoxInert;
+
+                DPRINT("NtQueryInformationToken(TokenSandBoxInert)\n");
+
+                IsTokenSandBoxInert = SeTokenIsInert(Token);
+                _SEH2_TRY
+                {
+                    /* Buffer size was already verified, no need to check here again */
+                    *(PULONG)TokenInformation = IsTokenSandBoxInert;
+                    *ReturnLength = sizeof(ULONG);
+                }
+                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    Status = _SEH2_GetExceptionCode();
+                }
+                _SEH2_END;
+
                 break;
+            }
             case TokenSessionId:
             {