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 CID_FLAG_PROCESS 0x1
22 #define CID_FLAG_THREAD 0x2
23 #define CID_FLAGS_MASK (CID_FLAG_PROCESS | CID_FLAG_THREAD)
25 /* FUNCTIONS *****************************************************************/
28 PsInitClientIDManagment(VOID
)
30 PspCidTable
= ExCreateHandleTable(NULL
);
35 PsCreateCidHandle(PVOID Object
, POBJECT_TYPE ObjectType
, PHANDLE Handle
)
37 HANDLE_TABLE_ENTRY NewEntry
;
42 NewEntry
.u1
.Object
= Object
;
43 if(ObjectType
== PsThreadType
)
44 NewEntry
.u2
.GrantedAccess
= CID_FLAG_THREAD
;
45 else if(ObjectType
== PsProcessType
)
46 NewEntry
.u2
.GrantedAccess
= CID_FLAG_PROCESS
;
49 DPRINT1("Can't create CID handles for %wZ objects\n", &ObjectType
->Name
);
53 ExHandle
= ExCreateHandle(PspCidTable
,
55 if(ExHandle
!= EX_INVALID_HANDLE
)
57 *Handle
= EX_HANDLE_TO_HANDLE(ExHandle
);
58 return STATUS_SUCCESS
;
61 return STATUS_UNSUCCESSFUL
;
65 PsDeleteCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
)
67 PHANDLE_TABLE_ENTRY Entry
;
68 LONG ExHandle
= HANDLE_TO_EX_HANDLE(CidHandle
);
72 KeEnterCriticalRegion();
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 KeLeaveCriticalRegion();
85 return STATUS_SUCCESS
;
89 ExUnlockHandleTableEntry(PspCidTable
,
91 KeLeaveCriticalRegion();
92 return STATUS_OBJECT_TYPE_MISMATCH
;
95 KeLeaveCriticalRegion();
96 return STATUS_INVALID_HANDLE
;
100 PsLookupCidHandle(HANDLE CidHandle
, POBJECT_TYPE ObjectType
, PVOID
*Object
)
102 PHANDLE_TABLE_ENTRY Entry
;
106 KeEnterCriticalRegion();
108 Entry
= ExMapHandleToPointer(PspCidTable
,
109 HANDLE_TO_EX_HANDLE(CidHandle
));
112 if((ObjectType
== PsProcessType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_PROCESS
)) ||
113 (ObjectType
== PsThreadType
&& ((Entry
->u2
.GrantedAccess
& CID_FLAGS_MASK
) == CID_FLAG_THREAD
)))
115 *Object
= Entry
->u1
.Object
;
120 DPRINT1("CID Obj type mismatch handle 0x%x %wZ vs 0x%x\n", CidHandle
,
121 &ObjectType
->Name
, Entry
->u2
.GrantedAccess
);
122 ExUnlockHandleTableEntry(PspCidTable
,
127 KeLeaveCriticalRegion();
136 PsLookupProcessThreadByCid(IN PCLIENT_ID Cid
,
137 OUT PEPROCESS
*Process OPTIONAL
,
138 OUT PETHREAD
*Thread
)
140 PHANDLE_TABLE_ENTRY CidEntry
;
141 PETHREAD FoundThread
;
142 NTSTATUS Status
= STATUS_INVALID_CID
;
149 CidEntry
= PsLookupCidHandle(Cid
->UniqueThread
, PsThreadType
, (PVOID
*)&FoundThread
);
152 ObReferenceObject(FoundThread
);
154 PsUnlockCidHandle(CidEntry
);
158 *Process
= FoundThread
->ThreadsProcess
;
160 *Thread
= FoundThread
;
161 Status
= STATUS_SUCCESS
;
172 PsLookupThreadByThreadId(IN HANDLE ThreadId
,
173 OUT PETHREAD
*Thread
)
175 PHANDLE_TABLE_ENTRY CidEntry
;
176 PETHREAD FoundThread
;
177 NTSTATUS Status
= STATUS_INVALID_CID
;
183 CidEntry
= PsLookupCidHandle(ThreadId
, PsThreadType
, (PVOID
*)&FoundThread
);
186 ObReferenceObject(FoundThread
);
188 PsUnlockCidHandle(CidEntry
);
190 *Thread
= FoundThread
;
191 Status
= STATUS_SUCCESS
;
198 PsUnlockCidHandle(PHANDLE_TABLE_ENTRY CidEntry
)
202 ExUnlockHandleTableEntry(PspCidTable
,
204 KeLeaveCriticalRegion();