3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ps/cid.c
6 * PURPOSE: Client ID (CID) management
8 * PROGRAMMERS: Thomas Weidenmueller <w3seek@reactos.com>
11 /* INCLUDES ******************************************************************/
15 #include <internal/debug.h>
17 /* GLOBALS ******************************************************************/
20 * FIXME - use a global handle table instead!
25 KEVENT CidReleaseEvent
;
27 LARGE_INTEGER ShortDelay
, LongDelay
;
29 #define TAG_CIDOBJECT TAG('C', 'I', 'D', 'O')
31 /* FUNCTIONS *****************************************************************/
34 PsInitClientIDManagment(VOID
)
36 InitializeListHead(&CidHead
);
37 KeInitializeSpinLock(&CidLock
);
38 KeInitializeEvent(&CidReleaseEvent
, SynchronizationEvent
, FALSE
);
39 ShortDelay
.QuadPart
= -100LL;
40 LongDelay
.QuadPart
= -100000LL;
44 PspReferenceCidObject(PCID_OBJECT Object
)
46 InterlockedIncrement(&Object
->ref
);
50 PspDereferenceCidObject(PCID_OBJECT Object
)
52 if(InterlockedDecrement(&Object
->ref
) == 0)
59 PsCreateCidHandle(PVOID Object
, POBJECT_TYPE ObjectType
, PHANDLE Handle
)
62 PCID_OBJECT cido
= ExAllocatePoolWithTag(NonPagedPool
,
68 ExInitializeFastMutex(&cido
->Lock
);
69 cido
->Obj
.Object
= Object
;
71 KeAcquireSpinLock(&CidLock
, &oldIrql
);
72 cido
->Handle
= (HANDLE
)((ULONG_PTR
)(++CidCounter
) << 2);
73 InsertTailList(&CidHead
, &cido
->Entry
);
74 KeReleaseSpinLock(&CidLock
, oldIrql
);
76 *Handle
= cido
->Handle
;
77 return STATUS_SUCCESS
;
80 return STATUS_INSUFFICIENT_RESOURCES
;
84 PsDeleteCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
86 PCID_OBJECT cido
, Found
= NULL
;
92 return STATUS_INVALID_PARAMETER
;
95 KeAcquireSpinLock(&CidLock
, &oldIrql
);
96 Current
= CidHead
.Flink
;
97 while(Current
!= &CidHead
)
99 cido
= CONTAINING_RECORD(Current
, CID_OBJECT
, Entry
);
100 if(cido
->Handle
== CidHandle
)
102 RemoveEntryList(&cido
->Entry
);
107 Current
= Current
->Flink
;
109 KeReleaseSpinLock(&CidLock
, oldIrql
);
113 PspDereferenceCidObject(Found
);
114 return STATUS_SUCCESS
;
117 return STATUS_UNSUCCESSFUL
;
121 PsLockCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
123 PCID_OBJECT cido
, Found
= NULL
;
127 if(CidHandle
== NULL
)
132 KeAcquireSpinLock(&CidLock
, &oldIrql
);
133 Current
= CidHead
.Flink
;
134 while(Current
!= &CidHead
)
136 cido
= CONTAINING_RECORD(Current
, CID_OBJECT
, Entry
);
137 if(cido
->Handle
== CidHandle
)
140 PspReferenceCidObject(Found
);
143 Current
= Current
->Flink
;
145 KeReleaseSpinLock(&CidLock
, oldIrql
);
149 ExAcquireFastMutex(&Found
->Lock
);
156 PsUnlockCidObject(PCID_OBJECT CidObject
)
158 ExReleaseFastMutex(&CidObject
->Lock
);
159 PspDereferenceCidObject(CidObject
);