3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/se/luid.c
6 * PURPOSE: Security manager
8 * PROGRAMMERS: No programmer listed.
11 /* INCLUDES *****************************************************************/
14 #include <internal/debug.h>
16 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, SepInitLuid)
21 /* GLOBALS *******************************************************************/
23 static LARGE_INTEGER LuidIncrement
;
24 static LARGE_INTEGER LuidValue
;
26 /* FUNCTIONS *****************************************************************/
33 LUID DummyLuidValue
= SYSTEM_LUID
;
35 LuidValue
.u
.HighPart
= DummyLuidValue
.HighPart
;
36 LuidValue
.u
.LowPart
= DummyLuidValue
.LowPart
;
37 LuidIncrement
.QuadPart
= 1;
43 ExpAllocateLocallyUniqueId(OUT LUID
*LocallyUniqueId
)
45 LARGE_INTEGER NewLuid
, PrevLuid
;
47 /* atomically increment the luid */
51 NewLuid
= RtlLargeIntegerAdd(PrevLuid
,
53 } while(ExfInterlockedCompareExchange64(&LuidValue
.QuadPart
,
55 &PrevLuid
.QuadPart
) != PrevLuid
.QuadPart
);
57 LocallyUniqueId
->LowPart
= NewLuid
.u
.LowPart
;
58 LocallyUniqueId
->HighPart
= NewLuid
.u
.HighPart
;
60 return STATUS_SUCCESS
;
68 NtAllocateLocallyUniqueId(OUT LUID
*LocallyUniqueId
)
71 KPROCESSOR_MODE PreviousMode
;
72 NTSTATUS Status
= STATUS_SUCCESS
;
76 PreviousMode
= ExGetPreviousMode();
78 if(PreviousMode
!= KernelMode
)
82 ProbeForWrite(LocallyUniqueId
,
88 Status
= _SEH_GetExceptionCode();
92 if(!NT_SUCCESS(Status
))
98 Status
= ExpAllocateLocallyUniqueId(&NewLuid
);
102 *LocallyUniqueId
= NewLuid
;
106 Status
= _SEH_GetExceptionCode();