3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ps/clientid.c
6 * PURPOSE: Client ID (CID) management
7 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
12 /* INCLUDES ******************************************************************/
16 #include <internal/debug.h>
18 /* GLOBALS ******************************************************************/
21 * FIXME - use a global handle table instead!
26 KEVENT CidReleaseEvent
;
28 LARGE_INTEGER ShortDelay
, LongDelay
;
30 #define TAG_CIDOBJECT TAG('C', 'I', 'D', 'O')
32 /* FUNCTIONS *****************************************************************/
35 PsInitClientIDManagment(VOID
)
37 InitializeListHead(&CidHead
);
38 KeInitializeSpinLock(&CidLock
);
39 KeInitializeEvent(&CidReleaseEvent
, SynchronizationEvent
, FALSE
);
40 ShortDelay
.QuadPart
= -100LL;
41 LongDelay
.QuadPart
= -100000LL;
45 PspReferenceCidObject(PCID_OBJECT Object
)
47 InterlockedIncrement(&Object
->ref
);
51 PspDereferenceCidObject(PCID_OBJECT Object
)
53 if(InterlockedDecrement(&Object
->ref
) == 0)
60 PsCreateCidHandle(PVOID Object
, POBJECT_TYPE ObjectType
, PHANDLE Handle
)
63 PCID_OBJECT cido
= ExAllocatePoolWithTag(NonPagedPool
,
69 ExInitializeFastMutex(&cido
->Lock
);
70 cido
->Obj
.Object
= Object
;
72 KeAcquireSpinLock(&CidLock
, &oldIrql
);
73 cido
->Handle
= (HANDLE
)(++CidCounter
);
74 InsertTailList(&CidHead
, &cido
->Entry
);
75 KeReleaseSpinLock(&CidLock
, oldIrql
);
77 *Handle
= cido
->Handle
;
78 return STATUS_SUCCESS
;
81 return STATUS_INSUFFICIENT_RESOURCES
;
85 PsDeleteCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
87 PCID_OBJECT cido
, Found
= NULL
;
93 return STATUS_INVALID_PARAMETER
;
96 KeAcquireSpinLock(&CidLock
, &oldIrql
);
97 Current
= CidHead
.Flink
;
98 while(Current
!= &CidHead
)
100 cido
= CONTAINING_RECORD(Current
, CID_OBJECT
, Entry
);
101 if(cido
->Handle
== CidHandle
)
103 RemoveEntryList(&cido
->Entry
);
108 Current
= Current
->Flink
;
110 KeReleaseSpinLock(&CidLock
, oldIrql
);
114 PspDereferenceCidObject(Found
);
115 return STATUS_SUCCESS
;
118 return STATUS_UNSUCCESSFUL
;
122 PsLockCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
124 PCID_OBJECT cido
, Found
= NULL
;
128 if(CidHandle
== NULL
)
133 KeAcquireSpinLock(&CidLock
, &oldIrql
);
134 Current
= CidHead
.Flink
;
135 while(Current
!= &CidHead
)
137 cido
= CONTAINING_RECORD(Current
, CID_OBJECT
, Entry
);
138 if(cido
->Handle
== CidHandle
)
141 PspReferenceCidObject(Found
);
144 Current
= Current
->Flink
;
146 KeReleaseSpinLock(&CidLock
, oldIrql
);
150 ExAcquireFastMutex(&Found
->Lock
);
157 PsUnlockCidObject(PCID_OBJECT CidObject
)
159 ExReleaseFastMutex(&CidObject
->Lock
);
160 PspDereferenceCidObject(CidObject
);