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
,
126 KeLeaveCriticalRegion();
135 PsLookupProcessThreadByCid(IN PCLIENT_ID Cid
,
136 OUT PEPROCESS
*Process OPTIONAL
,
137 OUT PETHREAD
*Thread
)
139 PHANDLE_TABLE_ENTRY CidEntry
;
140 PETHREAD FoundThread
;
147 CidEntry
= PsLookupCidHandle(Cid
->UniqueThread
, PsThreadType
, (PVOID
*)&FoundThread
);
150 ObReferenceObject(FoundThread
);
152 PsUnlockCidHandle(CidEntry
);
156 *Process
= FoundThread
->ThreadsProcess
;
158 *Thread
= FoundThread
;
159 return STATUS_SUCCESS
;
162 return STATUS_INVALID_PARAMETER
;
170 PsLookupThreadByThreadId(IN HANDLE ThreadId
,
171 OUT PETHREAD
*Thread
)
173 PHANDLE_TABLE_ENTRY CidEntry
;
174 PETHREAD FoundThread
;
180 CidEntry
= PsLookupCidHandle(ThreadId
, PsThreadType
, (PVOID
*)&FoundThread
);
183 ObReferenceObject(FoundThread
);
185 PsUnlockCidHandle(CidEntry
);
187 *Thread
= FoundThread
;
188 return STATUS_SUCCESS
;
191 return STATUS_INVALID_PARAMETER
;
195 PsUnlockCidHandle(PHANDLE_TABLE_ENTRY CidEntry
)
199 ExUnlockHandleTableEntry(PspCidTable
,
201 KeLeaveCriticalRegion();