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 ******************************************************************/
19 PHANDLE_TABLE PspCidTable
= NULL
;
21 #define TAG_CIDOBJECT TAG('C', 'I', 'D', 'O')
23 #define CID_FLAG_PROCESS 0x1
24 #define CID_FLAG_THREAD 0x2
25 #define CID_FLAGS_MASK (CID_FLAG_PROCESS | CID_FLAG_THREAD)
27 /* FUNCTIONS *****************************************************************/
30 PsInitClientIDManagment(VOID
)
32 PspCidTable
= ExCreateHandleTable(NULL
);
37 PsCreateCidHandle(PVOID Object
, POBJECT_TYPE ObjectType
, PHANDLE Handle
)
39 HANDLE_TABLE_ENTRY NewEntry
;
44 NewEntry
.u1
.Object
= Object
;
45 if(ObjectType
== PsThreadType
)
46 NewEntry
.u2
.GrantedAccess
= CID_FLAG_THREAD
;
47 else if(ObjectType
== PsProcessType
)
48 NewEntry
.u2
.GrantedAccess
= CID_FLAG_PROCESS
;
51 DPRINT1("Can't create CID handles for %wZ objects\n", &ObjectType
->TypeName
);
55 ExHandle
= ExCreateHandle(PspCidTable
,
57 if(ExHandle
!= EX_INVALID_HANDLE
)
59 *Handle
= EX_HANDLE_TO_HANDLE(ExHandle
);
60 return STATUS_SUCCESS
;
63 return STATUS_UNSUCCESSFUL
;
67 PsDeleteCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
69 PHANDLE_TABLE_ENTRY Entry
;
70 LONG ExHandle
= HANDLE_TO_EX_HANDLE(CidHandle
);
74 Entry
= ExMapHandleToPointer(PspCidTable
,
78 if((ObjectType
== PsThreadType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_THREAD
)) ||
79 (ObjectType
== PsProcessType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_PROCESS
)))
81 ExDestroyHandleByEntry(PspCidTable
,
84 return STATUS_SUCCESS
;
88 ExUnlockHandleTableEntry(PspCidTable
,
90 return STATUS_OBJECT_TYPE_MISMATCH
;
94 return STATUS_INVALID_HANDLE
;
98 PsLookupCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
, PVOID
*Object
)
100 PHANDLE_TABLE_ENTRY Entry
;
104 KeEnterCriticalRegion();
106 Entry
= ExMapHandleToPointer(PspCidTable
,
107 HANDLE_TO_EX_HANDLE(CidHandle
));
110 if((ObjectType
== PsProcessType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_PROCESS
)) ||
111 (ObjectType
== PsThreadType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_THREAD
)))
113 *Object
= Entry
->u1
.Object
;
118 DPRINT1("CID Obj type mismatch handle 0x%x %wZ vs 0x%x\n", CidHandle
,
119 &ObjectType
->TypeName
, Entry
->u2
.GrantedAccess
);
120 ExUnlockHandleTableEntry(PspCidTable
,
125 KeLeaveCriticalRegion();
134 PsLookupProcessThreadByCid(IN PCLIENT_ID Cid
,
135 OUT PEPROCESS
*Process OPTIONAL
,
136 OUT PETHREAD
*Thread
)
138 PHANDLE_TABLE_ENTRY CidEntry
;
139 PETHREAD FoundThread
;
146 CidEntry
= PsLookupCidHandle(Cid
->UniqueThread
, PsThreadType
, (PVOID
*)&FoundThread
);
149 ObReferenceObject(FoundThread
);
151 PsUnlockCidHandle(CidEntry
);
155 *Process
= FoundThread
->ThreadsProcess
;
157 *Thread
= FoundThread
;
158 return STATUS_SUCCESS
;
161 return STATUS_INVALID_PARAMETER
;
169 PsLookupThreadByThreadId(IN HANDLE ThreadId
,
170 OUT PETHREAD
*Thread
)
172 PHANDLE_TABLE_ENTRY CidEntry
;
173 PETHREAD FoundThread
;
179 CidEntry
= PsLookupCidHandle(ThreadId
, PsThreadType
, (PVOID
*)&FoundThread
);
182 ObReferenceObject(FoundThread
);
184 PsUnlockCidHandle(CidEntry
);
186 *Thread
= FoundThread
;
187 return STATUS_SUCCESS
;
190 return STATUS_INVALID_PARAMETER
;
194 PsUnlockCidHandle(PHANDLE_TABLE_ENTRY CidEntry
)
198 ExUnlockHandleTableEntry(PspCidTable
,
200 KeLeaveCriticalRegion();