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 KeEnterCriticalRegion();
76 Entry
= ExMapHandleToPointer(PspCidTable
,
80 if((ObjectType
== PsThreadType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_THREAD
)) ||
81 (ObjectType
== PsProcessType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_PROCESS
)))
83 ExDestroyHandleByEntry(PspCidTable
,
86 KeLeaveCriticalRegion();
87 return STATUS_SUCCESS
;
91 ExUnlockHandleTableEntry(PspCidTable
,
93 KeLeaveCriticalRegion();
94 return STATUS_OBJECT_TYPE_MISMATCH
;
97 KeLeaveCriticalRegion();
98 return STATUS_INVALID_HANDLE
;
102 PsLookupCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
, PVOID
*Object
)
104 PHANDLE_TABLE_ENTRY Entry
;
108 KeEnterCriticalRegion();
110 Entry
= ExMapHandleToPointer(PspCidTable
,
111 HANDLE_TO_EX_HANDLE(CidHandle
));
114 if((ObjectType
== PsProcessType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_PROCESS
)) ||
115 (ObjectType
== PsThreadType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_THREAD
)))
117 *Object
= Entry
->u1
.Object
;
122 DPRINT1("CID Obj type mismatch handle 0x%x %wZ vs 0x%x\n", CidHandle
,
123 &ObjectType
->TypeName
, Entry
->u2
.GrantedAccess
);
124 ExUnlockHandleTableEntry(PspCidTable
,
129 KeLeaveCriticalRegion();
138 PsLookupProcessThreadByCid(IN PCLIENT_ID Cid
,
139 OUT PEPROCESS
*Process OPTIONAL
,
140 OUT PETHREAD
*Thread
)
142 PHANDLE_TABLE_ENTRY CidEntry
;
143 PETHREAD FoundThread
;
150 CidEntry
= PsLookupCidHandle(Cid
->UniqueThread
, PsThreadType
, (PVOID
*)&FoundThread
);
153 ObReferenceObject(FoundThread
);
155 PsUnlockCidHandle(CidEntry
);
159 *Process
= FoundThread
->ThreadsProcess
;
161 *Thread
= FoundThread
;
162 return STATUS_SUCCESS
;
165 return STATUS_INVALID_PARAMETER
;
173 PsLookupThreadByThreadId(IN HANDLE ThreadId
,
174 OUT PETHREAD
*Thread
)
176 PHANDLE_TABLE_ENTRY CidEntry
;
177 PETHREAD FoundThread
;
183 CidEntry
= PsLookupCidHandle(ThreadId
, PsThreadType
, (PVOID
*)&FoundThread
);
186 ObReferenceObject(FoundThread
);
188 PsUnlockCidHandle(CidEntry
);
190 *Thread
= FoundThread
;
191 return STATUS_SUCCESS
;
194 return STATUS_INVALID_PARAMETER
;
198 PsUnlockCidHandle(PHANDLE_TABLE_ENTRY CidEntry
)
202 ExUnlockHandleTableEntry(PspCidTable
,
204 KeLeaveCriticalRegion();