https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4bf7d54910acb38fdc33d…
commit 4bf7d54910acb38fdc33de8177c33d7967ece69e
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Sat Jun 1 18:58:36 2019 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Sat Jun 1 18:58:36 2019 +0200
[NTOSKRNL] Implement ObpSetCurrentProcessDeviceMap
---
ntoskrnl/ob/devicemap.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 71 insertions(+), 1 deletion(-)
diff --git a/ntoskrnl/ob/devicemap.c b/ntoskrnl/ob/devicemap.c
index 12abcb90595..8a471446919 100644
--- a/ntoskrnl/ob/devicemap.c
+++ b/ntoskrnl/ob/devicemap.c
@@ -5,6 +5,7 @@
* PURPOSE: Device map implementation
* PROGRAMMERS: Eric Kohl (eric.kohl(a)reactos.org)
* Alex Ionescu (alex.ionescu(a)reactos.org)
+ * Pierre Schweitzer (pierre(a)reactos.org)
*/
/* INCLUDES ***************************************************************/
@@ -147,7 +148,76 @@ NTSTATUS
NTAPI
ObpSetCurrentProcessDeviceMap(VOID)
{
- return STATUS_NOT_IMPLEMENTED;
+ PTOKEN Token;
+ LUID LogonId;
+ NTSTATUS Status;
+ PEPROCESS CurrentProcess;
+ LUID SystemLuid = SYSTEM_LUID;
+ PDEVICE_MAP DeviceMap, OldDeviceMap;
+
+ /* Get our impersonation token */
+ CurrentProcess = PsGetCurrentProcess();
+ Token = PsReferencePrimaryToken(CurrentProcess);
+ if (Token == NULL)
+ {
+ return STATUS_NO_TOKEN;
+ }
+
+ /* Query the Logon ID */
+ Status = SeQueryAuthenticationIdToken(Token, &LogonId);
+ if (!NT_SUCCESS(Status))
+ {
+ goto done;
+ }
+
+ /* If that's system, then use system device map */
+ if (RtlEqualLuid(&LogonId, &SystemLuid))
+ {
+ DeviceMap = ObSystemDeviceMap;
+ }
+ /* Otherwise ask Se for the device map */
+ else
+ {
+ Status = SeGetLogonIdDeviceMap(&LogonId, &DeviceMap);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Normalize failure status */
+ Status = STATUS_OBJECT_PATH_INVALID;
+ goto done;
+ }
+ }
+
+ /* Fail if no device map */
+ if (DeviceMap == NULL)
+ {
+ Status = STATUS_OBJECT_PATH_INVALID;
+ goto done;
+ }
+
+ /* Acquire the device map lock */
+ KeAcquireGuardedMutex(&ObpDeviceMapLock);
+
+ /* Save old device map attached to the process */
+ OldDeviceMap = CurrentProcess->DeviceMap;
+
+ /* Set new device map & reference it */
+ ++DeviceMap->ReferenceCount;
+ CurrentProcess->DeviceMap = DeviceMap;
+
+ /* Release the device map lock */
+ KeReleaseGuardedMutex(&ObpDeviceMapLock);
+
+ /* If we had a device map, dereference it */
+ if (OldDeviceMap != NULL)
+ {
+ ObfDereferenceDeviceMap(OldDeviceMap);
+ }
+
+done:
+ /* We're done with the token! */
+ ObDereferenceObject(Token);
+
+ return Status;
}