Author: ion
Date: Wed Feb 8 22:05:53 2012
New Revision: 55501
URL:
http://svn.reactos.org/svn/reactos?rev=55501&view=rev
Log:
[SMSS2]: Implement (not yet used) Session Management APIs.
Modified:
trunk/reactos/base/system/smss2/smsessn.c
Modified: trunk/reactos/base/system/smss2/smsessn.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smsessn.…
==============================================================================
--- trunk/reactos/base/system/smss2/smsessn.c [iso-8859-1] (original)
+++ trunk/reactos/base/system/smss2/smsessn.c [iso-8859-1] Wed Feb 8 22:05:53 2012
@@ -14,6 +14,14 @@
/* GLOBALS ********************************************************************/
+typedef struct _SMP_SESSION
+{
+ LIST_ENTRY Entry;
+ ULONG SessionId;
+ PSMP_SUBSYSTEM Subsystem;
+ PSMP_SUBSYSTEM OtherSubsystem;
+} SMP_SESSION, *PSMP_SESSION;
+
RTL_CRITICAL_SECTION SmpSessionListLock;
LIST_ENTRY SmpSessionListHead;
ULONG SmpNextSessionId;
@@ -22,6 +30,137 @@
HANDLE SmpSessionsObjectDirectory;
/* FUNCTIONS ******************************************************************/
+
+BOOLEAN
+NTAPI
+SmpCheckDuplicateMuSessionId(IN ULONG MuSessionId)
+{
+ PSMP_SUBSYSTEM Subsystem;
+ BOOLEAN FoundDuplicate = FALSE;
+ PLIST_ENTRY NextEntry;
+
+ /* Lock the subsystem database */
+ RtlEnterCriticalSection(&SmpKnownSubSysLock);
+
+ /* Scan each entry */
+ NextEntry = SmpKnownSubSysHead.Flink;
+ while (NextEntry != &SmpKnownSubSysHead)
+ {
+ /* Check if this entry has the same session ID */
+ Subsystem = CONTAINING_RECORD(NextEntry, SMP_SUBSYSTEM, Entry);
+ if (Subsystem->MuSessionId == MuSessionId)
+ {
+ /* Break out of here! */
+ FoundDuplicate = TRUE;
+ break;
+ }
+
+ /* Keep going */
+ NextEntry = NextEntry->Flink;
+ }
+
+ /* Release the database and return the result */
+ RtlLeaveCriticalSection(&SmpKnownSubSysLock);
+ return FoundDuplicate;
+}
+
+PSMP_SESSION
+NTAPI
+SmpSessionIdToSession(IN ULONG SessionId)
+{
+ PSMP_SESSION Session, FoundSession = NULL;
+ PLIST_ENTRY NextEntry;
+
+ /* Loop the session list -- lock must already be held! */
+ NextEntry = SmpSessionListHead.Flink;
+ while (NextEntry != &SmpSessionListHead)
+ {
+ /* Check if this session's ID matches */
+ Session = CONTAINING_RECORD(NextEntry, SMP_SESSION, Entry);
+ if (Session->SessionId == SessionId)
+ {
+ /* Set this as the found session and break out */
+ FoundSession = Session;
+ break;
+ }
+
+ /* Keep going */
+ NextEntry = NextEntry->Flink;
+ }
+
+ /* Return the session that was found and exit */
+ return FoundSession;
+}
+
+VOID
+NTAPI
+SmpDeleteSession(IN ULONG SessionId)
+{
+ PSMP_SESSION Session;
+
+ /* Enter the lock and get the session structure */
+ RtlEnterCriticalSection(&SmpSessionListLock);
+ Session = SmpSessionIdToSession(SessionId);
+ if (Session)
+ {
+ /* Remove it from the list */
+ RemoveEntryList(&Session->Entry);
+ RtlLeaveCriticalSection(&SmpSessionListLock);
+
+ /* Now free the structure outside of the lock */
+ RtlFreeHeap(SmpHeap, 0, Session);
+ }
+ else
+ {
+ /* ID doesn't map to one of our structures, nothing to do... */
+ RtlLeaveCriticalSection(&SmpSessionListLock);
+ }
+}
+
+ULONG
+NTAPI
+SmpAllocateSessionId(IN PSMP_SUBSYSTEM Subsystem,
+ IN PSMP_SUBSYSTEM OtherSubsystem)
+{
+ ULONG SessionId;
+ PSMP_SESSION Session;
+
+ /* Allocate a new ID while under the lock */
+ RtlEnterCriticalSection(&SmpSessionListLock);
+ SessionId = SmpNextSessionId++;
+
+ /* Check for overflow */
+ if (SmpNextSessionIdScanMode)
+ {
+ /* Break if it happened */
+ DbgPrint("SMSS: SessionId's Wrapped\n");
+ DbgBreakPoint();
+ }
+ else
+ {
+ /* Detect it for next time */
+ if (!SmpNextSessionId) SmpNextSessionIdScanMode = 1;
+ }
+
+ /* Allocate a session structure */
+ Session = RtlAllocateHeap(SmpHeap, 0, sizeof(SMP_SESSION));
+ if (Session)
+ {
+ /* Write the session data and insert it into the session list */
+ Session->Subsystem = Subsystem;
+ Session->SessionId = SessionId;
+ Session->OtherSubsystem = OtherSubsystem;
+ InsertTailList(&SmpSessionListHead, &Session->Entry);
+ }
+ else
+ {
+ DPRINT1("SMSS: Unable to keep track of session ID -- no memory
available\n");
+ }
+
+ /* Release the session lock */
+ RtlLeaveCriticalSection(&SmpSessionListLock);
+ return SessionId;
+}
NTSTATUS
NTAPI
@@ -49,7 +188,7 @@
ProcessHandle, Status);
*SessionId = 0;
}
-
+
/* Return result */
return Status;
}